安裝兩次的 Kubernetes Kubeadm

Posted by Alan Zhan on Sunday, February 20, 2022

想要透過實戰來更了解 K8s ,所以想先自架 K8s cluster,但目前市面上自建 K8s 的方式越來越多種,可以透過 minikube 、 Kubeadm 等等,想說好吧那我就挑 Kubeadm 來裝看看,但是安裝的過程不是那麼順遂,這篇就分享一下我遇到的問題跟如何解決。

第一次安裝 Kubeadm

  1. 安裝 Ubuntu。
  2. 安裝 Docker。
    1. 修改 Docker 的 cgroup 的設定,這個修改是為了讓 K8s 與 container runtime 的 cgroup driver 一致,可以避免系統會出現不穩定的狀況。
      sudo vim /etc/docker/daemon.json
      
      {
          "exec-opts": ["native.cgroupdriver=systemd"]
      }
      
    2. 重啟 Docker
      sudo systemctl restart docker
      
  3. 安裝 Kubeadm 。
    1. 允許 iptables 檢查橋接流量 (bridged traffic) 。
      cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
      br_netfilter
      EOF
      
      cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF
      sudo sysctl --system
      
    2. 更新 apt 與 K8s 所需要的包。
      sudo apt-get update
      sudo apt-get install -y apt-transport-https ca-certificates curl
      
    3. 下載 Google Cloud 公開簽名密鑰。
      sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
      
    4. 添加 K8s 的 apt 倉庫。
      echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
      
    5. 更新 apt 包的索引,便且安裝 kubelet 、 kubeadmi 和 kubectl ,並鎖定版本。
      sudo apt-get update
      sudo apt-get install -y kubelet kubeadm kubectl
      sudo apt-mark hold kubelet kubeadm kubectl
      
    6. 啟動 k8s 。
      sudo kubeadm init
      
    7. 加入 worker node
      sudo kubeadm join 192.168.83.130:6443 --token token....  --discovery-token-ca-cert-hash sha256:......................
      
    8. 複製 kubeconfig
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      

K8s Nodes Not Ready

我終於安裝好了,那我把 Worker Node 加入到集群內吧,加入完畢之後,正當我準備開始使用 K8s 的時候,我卻看到 nodes 的狀態均為 NotReady,。

alan@k8s-01:~$ kubectl get nodes
NAME     STATUS     ROLES                  AGE     VERSION
k8s-03   NotReady   <none>                 7m17s   v1.23.4
k8s-01   NotReady   control-plane,master   7m45s   v1.23.4
k8s-02   NotReady   <none>                 7m24s   v1.23.4

原因是因為我沒有設定 CNI (container network interface) 插件,kubeadm: master node never ready,於是我就 apply flannel 上去。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml

但是裝完之後我還是一樣節點處於不可用狀態啊,到底又是怎麼了,一查之後才發現 flannel 需要 pod netwokr CIDR (Classless Inter-Domain Routing) 設定,好吧,那我重作好了。

第二次安裝

  1. 安裝 Ubuntu。
  2. 安裝 Docker。
    1. 修改 Docker 的 cgroup 的設定,這個修改是為了讓 K8s 與 container runtime 的 cgroup driver 一致,可以避免系統會出現不穩定的狀況。
      sudo vim /etc/docker/daemon.json
      
      {
          "exec-opts": ["native.cgroupdriver=systemd"]
      }
      
    2. 重啟 Docker
      sudo systemctl restart docker
      
  3. 安裝 Kubeadm 。
    1. 允許 iptables 檢查橋接流量 (bridged traffic) 。
      cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
      br_netfilter
      EOF
      
      cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF
      sudo sysctl --system
      
    2. 更新 apt 與 K8s 所需要的包。
      sudo apt-get update
      sudo apt-get install -y apt-transport-https ca-certificates curl
      
    3. 下載 Google Cloud 公開簽名密鑰。
      sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
      
    4. 添加 K8s 的 apt 倉庫。
      echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
      
    5. 更新 apt 包的索引,便且安裝 kubelet 、 kubeadmi 和 kubectl ,並鎖定版本。
      sudo apt-get update
      sudo apt-get install -y kubelet kubeadm kubectl
      sudo apt-mark hold kubelet kubeadm kubectl
      
    6. 啟動 k8s 。
      sudo kubeadm init --pod-network-cidr=10.244.0.0/16
      
    7. 複製 kubeconfig
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
    8. 設定 CNI 。
      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml
      
    9. 加入 worker node
      sudo kubeadm join 192.168.83.130:6443 --token token....  --discovery-token-ca-cert-hash sha256:......................
      

搞定!收工下課!

zhan@k8s-01:~$ kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
k82-03   Ready    <none>                 25h   v1.23.4
k8s-01   Ready    control-plane,master   25h   v1.23.4
k8s-02   Ready    <none>                 25h   v1.23.4

總結

終於 K8s 被我自架起來了,之後要來好好一定要來好好探究 K8s ,不然又會遇到奇怪的事情,然後查了半天才解決。

歡迎到我的 Facebook Alan 的筆記本 留言,順手給我個讚吧!你的讚將成為我持續更新的動力,感謝你的閱讀,讓我們一起學習成為更好的自己。

參考