zoukankan      html  css  js  c++  java
  • 【Kubernetes】kubeadm 安装集群(二)

    环境

    1. virtual box 6.1
    2. centos 7.8
    3. docker 19.03
    4. kubernetes 1.20.2

    安装必备软件

    添加 Kubernetes 仓库

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    

    安装软件

    yum install -y kubelet kubeadm kubectl
    systemctl enable kubelet && systemctl start kubelet
    

    kubeadm 创建集群

    初始化主节点

    kubeadm init 
    --image-repository registry.aliyuncs.com/google_containers 
    --apiserver-advertise-address 192.168.56.101 
    --pod-network-cidr 10.244.0.0/16 
    

    --pod-network-cidr 10.244.0.0/16 是后面 flannel 网络插件默认值。

    最终会看到输出如下的内容:

    Your Kubernetes control-plane has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    Alternatively, if you are the root user, you can run:
    
      export KUBECONFIG=/etc/kubernetes/admin.conf
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 192.168.56.101:6443 --token ir22ai.to5rqixx90mscp4i 
        --discovery-token-ca-cert-hash sha256:efe632e2b03d00b873b888702882d8127f83540677034a0226cec599cd139050
    

    配置 kubectl

      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

    查看节点状态

    [root@master ~]# kubectl get nodes
    NAME     STATUS   ROLES                     AGE   VERSION
    master   NotReady    control-plane,master   2m    v1.20.2
    

    安装 flannel 插件

    [root@master ~]# kubectl apply -f kube-flannel-aliyun.yml
    podsecuritypolicy.policy/psp.flannel.unprivileged created
    clusterrole.rbac.authorization.k8s.io/flannel created
    clusterrolebinding.rbac.authorization.k8s.io/flannel created
    serviceaccount/flannel created
    configmap/kube-flannel-cfg created
    daemonset.apps/kube-flannel-ds created
    

    flannel.yml 的内容见附录。

    加入工作节点

    以下命令根据 kubeadm init 的最终输出来,拷贝最后两行的 kubeadm join 命令。

    [root@node1 ~]# kubeadm join 192.168.56.101:6443 --token ir22ai.to5rqixx90mscp4i 
    >     --discovery-token-ca-cert-hash sha256:efe632e2b03d00b873b888702882d8127f83540677034a0226cec599cd139050
    [preflight] Running pre-flight checks
    [preflight] Reading configuration from the cluster...
    [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
    [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    [kubelet-start] Starting the kubelet
    [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
    
    This node has joined the cluster:
    * Certificate signing request was sent to apiserver and a response was received.
    * The Kubelet was informed of the new secure connection details.
    
    Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
    

    再次查看节点状态

    [root@master ~]# kubectl get nodes
    NAME     STATUS   ROLES                  AGE     VERSION
    master   Ready    control-plane,master   9m23s   v1.20.2
    node1    Ready    <none>                 78s     v1.20.2
    node2    Ready    <none>                 68s     v1.20.2
    

    查看 POD 状态

    [root@master ~]# kubectl get pod --all-namespaces
    NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
    kube-system   coredns-7f89b7bc75-9mff4         1/1     Running   0          9m43s
    kube-system   coredns-7f89b7bc75-9qvqx         1/1     Running   0          9m43s
    kube-system   etcd-master                      1/1     Running   0          9m52s
    kube-system   kube-apiserver-master            1/1     Running   0          9m52s
    kube-system   kube-controller-manager-master   1/1     Running   0          9m52s
    kube-system   kube-flannel-ds-jjldk            1/1     Running   0          105s
    kube-system   kube-flannel-ds-rjqln            1/1     Running   0          115s
    kube-system   kube-flannel-ds-zp5xn            1/1     Running   0          4m42s
    kube-system   kube-proxy-bs7ft                 1/1     Running   0          115s
    kube-system   kube-proxy-g67nx                 1/1     Running   0          9m43s
    kube-system   kube-proxy-w99js                 1/1     Running   0          105s
    kube-system   kube-scheduler-master            1/1     Running   0          9m52s
    

    如果在安装的过程中出现了问题,可以使用 kubeadm reset 命令还原状态。

    kubectl 命令提示

    yum install bash-completion
    kubectl completion bash >/etc/bash_completion.d/kubectl
    

    总结

    介绍了使用 kubeadm 安装 Kubernetes 的方式。

    附录

    flannel.yml 内容

    ---
    apiVersion: policy/v1beta1
    kind: PodSecurityPolicy
    metadata:
      name: psp.flannel.unprivileged
      annotations:
        seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
        seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
        apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
        apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
    spec:
      privileged: false
      volumes:
        - configMap
        - secret
        - emptyDir
        - hostPath
      allowedHostPaths:
        - pathPrefix: "/etc/cni/net.d"
        - pathPrefix: "/etc/kube-flannel"
        - pathPrefix: "/run/flannel"
      readOnlyRootFilesystem: false
      # Users and groups
      runAsUser:
        rule: RunAsAny
      supplementalGroups:
        rule: RunAsAny
      fsGroup:
        rule: RunAsAny
      # Privilege Escalation
      allowPrivilegeEscalation: false
      defaultAllowPrivilegeEscalation: false
      # Capabilities
      allowedCapabilities: ["NET_ADMIN", "NET_RAW"]
      defaultAddCapabilities: []
      requiredDropCapabilities: []
      # Host namespaces
      hostPID: false
      hostIPC: false
      hostNetwork: true
      hostPorts:
        - min: 0
          max: 65535
      # SELinux
      seLinux:
        # SELinux is unused in CaaSP
        rule: "RunAsAny"
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: flannel
    rules:
      - apiGroups: ["extensions"]
        resources: ["podsecuritypolicies"]
        verbs: ["use"]
        resourceNames: ["psp.flannel.unprivileged"]
      - apiGroups:
          - ""
        resources:
          - pods
        verbs:
          - get
      - apiGroups:
          - ""
        resources:
          - nodes
        verbs:
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - nodes/status
        verbs:
          - patch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: flannel
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: flannel
    subjects:
      - kind: ServiceAccount
        name: flannel
        namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: flannel
      namespace: kube-system
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: kube-flannel-cfg
      namespace: kube-system
      labels:
        tier: node
        app: flannel
    data:
      cni-conf.json: |
        {
          "name": "cbr0",
          "cniVersion": "0.3.1",
          "plugins": [
            {
              "type": "flannel",
              "delegate": {
                "hairpinMode": true,
                "isDefaultGateway": true
              }
            },
            {
              "type": "portmap",
              "capabilities": {
                "portMappings": true
              }
            }
          ]
        }
      net-conf.json: |
        {
          "Network": "10.244.0.0/16",
          "Backend": {
            "Type": "vxlan"
          }
        }
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: kube-flannel-ds
      namespace: kube-system
      labels:
        tier: node
        app: flannel
    spec:
      selector:
        matchLabels:
          app: flannel
      template:
        metadata:
          labels:
            tier: node
            app: flannel
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: kubernetes.io/os
                        operator: In
                        values:
                          - linux
          hostNetwork: true
          priorityClassName: system-node-critical
          tolerations:
            - operator: Exists
              effect: NoSchedule
          serviceAccountName: flannel
          initContainers:
            - name: install-cni
              image: quay.io/coreos/flannel:v0.13.1-rc1
              command:
                - cp
              args:
                - -f
                - /etc/kube-flannel/cni-conf.json
                - /etc/cni/net.d/10-flannel.conflist
              volumeMounts:
                - name: cni
                  mountPath: /etc/cni/net.d
                - name: flannel-cfg
                  mountPath: /etc/kube-flannel/
          containers:
            - name: kube-flannel
              image: quay.io/coreos/flannel:v0.13.1-rc1
              command:
                - /opt/bin/flanneld
              args:
                - --ip-masq
                - --kube-subnet-mgr
                - --iface=enp0s8
              resources:
                requests:
                  cpu: "100m"
                  memory: "50Mi"
                limits:
                  cpu: "100m"
                  memory: "50Mi"
              securityContext:
                privileged: false
                capabilities:
                  add: ["NET_ADMIN", "NET_RAW"]
              env:
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.name
                - name: POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
              volumeMounts:
                - name: run
                  mountPath: /run/flannel
                - name: flannel-cfg
                  mountPath: /etc/kube-flannel/
          volumes:
            - name: run
              hostPath:
                path: /run/flannel
            - name: cni
              hostPath:
                path: /etc/cni/net.d
            - name: flannel-cfg
              configMap:
                name: kube-flannel-cfg
    
    
  • 相关阅读:
    Tampermonkey 油猴脚本开发 入门
    k8s 上安装 lamp 环境
    centOS 7.9 k8s 安装 和 基本命令
    力扣59-螺旋矩阵 II
    力扣54-螺旋矩阵
    力扣705-设计哈希集合
    力扣706-设计哈希映射
    scrapy参数-COOKIES_ENABLED
    优雅降级、渐进增强
    e-cahr的地图组件封装(浙江省为例)
  • 原文地址:https://www.cnblogs.com/jiangbo44/p/14311279.html
Copyright © 2011-2022 走看看