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

沒有留言:

張貼留言