Google Code Prettify

2020年1月25日 星期六

K8s: cluster (install, CentOS 7)

Kubernates 雖然很火紅,但是到現在安裝仍非常不容易,網路上、書上寫的安裝程序,照著做要一次就成功不容易,多半會遇到一些問題需要解決。這裡整理的是我最近成功安裝的步驟,照著做是否一定會成功呢? 短期內沒問題,長期來說就又不確定了,因為 Kubernetes 發展的太快,會一直有變化。
  • 環境
  1. 兩台電腦,都是 CentOS 7,ip 及 hostname 分別為 192.168.0.110 / master-node、192.168.0.106 / worker-node。
  2. 為了讓兩台電腦可以互通,先在兩台電腦的 /etc/hosts 中加入如下內容:
    192.168.0.110   master-node
    192.168.0.106   worker-node
    
  3. Docker version 19.03.5
  4. Kubernates version 1.17.2
  • 安裝 Docker
  1. 將作業系統裡的套件更新到最新
  2. yum update
  3. 移除舊版 docker
  4. yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  5. 安裝相依的套件
  6. yum install -y yum-utils device-mapper-persistent-data lvm2
    
  7. 設定要使用的 docker repository
  8. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  9. 安裝 docker
  10. yum install docker-ce docker-ce-cli containerd.io
    
    這樣會安裝最新版的 docker。
  11. 啟動 docker
  12. systemctl start docker
    
  13. 設定成自動啟動
  14. systemctl enable docker
    
    這樣設定,每次開機服務會自行動動。
  15. 設定 cgroup-driver
  16. 編輯 /etc/docker/daemon.json,內容如下,如果沒有這個檔案,直接創建一個。
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2",
      "storage-opts": [
        "overlay2.override_kernel_check=true"
      ]
    }
    
    最重要的是把 native.cgroupdriver 設為 systemd,後面安裝 K8s 時,也要調整相關設定,否則安裝會失敗。
  17. 重啟 docker
  18. systemctl daemon-reload
    systemctl restart docker
    
  • 安裝 Kubernates
  1. 設定環境
  2. setenforce 0
    sed -i 's@SELINUX=enforcing@SELINUX=disabled@' /etc/sysconfig/selinux
    swapoff -a
    
    Kubernetes 基於效能的理由,規定 swap 要關閉,所以要如上設定,設定好要檢查 /etc/fstab,看看最後一行有沒有加上 #,如果沒有加上註解,就自行加上去,這樣重開機後 swap 才不會又被打開。
  3. 關閉防火牆
  4. systemctl disable firewalld && systemctl stop firewalld
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
    modprobe br_netfilter
    echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
    sysctl -p
    lsmod | grep br_netfilter
    
    也可以只關閉 Kubernetes 會用到的防火牆,但是,port 很多,這裡直接把防火牆關閉,方便後面的設定。
  5. 設定 Kubernates 的 repository
  6. 檢查一下 /etc/yum.repos.d/kubernetes.repo 的內容是否如下? 沒有這個檔案可以自行新增。
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  7. 安裝 Kubernates
  8. yum install kubelet-1.17.2 kubectl-1.17.2 kubeadm-1.17.2 --nogpgcheck --disableexcludes=kubernetes
    
    在 cluster 環境,master 及每一個 node 都要有 kubeadm。
  9. 設定 cgroup-driver=systemd
  10. 在 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 中加入 KUBERLET_CGROUP_ARGS 參數,並將這個參數加入啟動的參數中,內容如下:
    [Service]
    Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
    Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
    EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
    # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
    # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
    EnvironmentFile=-/etc/sysconfig/kubelet
    Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
    ExecStart=
    ExecStart=/usr/bin/kubelet $KUBELET_CGROUP_ARGS $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS
  11. 啟動 kubelet
  12. systemctl daemon-reload
    systemctl restart kubelet.service
    
    啟動後沒有成功的話,也不一定會出現明顯的錯誤訊息,要使用如下指令看一下,是否出現 active (running)
    systemctl status -l kubelet.service
    
  13. master 初始化
  14. kubeadm init --apiserver-advertise-address=192.168.0.110 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=v1.17.2 --cri-socket="/var/run/dockershim.sock" --ignore-preflight-errors all
    
    這段訊息很重要, 先照著上一個框的三個指令做,下面的框中的指令則是 worker-node 要加入 cluster 的指令,先執行這三個指令。
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    
  15. 安裝通用的 flannel容器網路介面CNI(Container Network Interface)元件
  16. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
這樣 master node 大功告成了!!
  • worker node 加入 cluster
worker node 和 master node 的安裝差不多,先在 worker node 上重複上面 docker 的安裝及 Kubernetes 安裝的第 1~6 步驟,接著執行如下指令:
kubeadm join 192.168.0.110:6443 --token pwwfr9.9w1dn0lq70mraguk --discovery-token-ca-cert-hash sha256:4dcad4f89e0fd0246e8d19efd49d35d6c0f77e9481a6a999536a4775cc217024
過個兩分鐘,應該就可以加入 cluster,如何驗證? 回到 master node 上,執行如下指令,可以看到 Kubernetes 有兩個 node。
kubectl get nodes

沒有留言:

張貼留言