想要透過實戰來更了解 K8s ,所以想先自架 K8s cluster,但目前市面上自建 K8s 的方式越來越多種,可以透過 minikube 、 Kubeadm 等等,想說好吧那我就挑 Kubeadm 來裝看看,但是安裝的過程不是那麼順遂,這篇就分享一下我遇到的問題跟如何解決。
第一次安裝 Kubeadm
- 安裝 Ubuntu。
- 安裝 Docker。
- 修改 Docker 的 cgroup 的設定,這個修改是為了讓 K8s 與 container runtime 的 cgroup driver 一致,可以避免系統會出現不穩定的狀況。
sudo vim /etc/docker/daemon.json
{ "exec-opts": ["native.cgroupdriver=systemd"] }
- 重啟 Docker
sudo systemctl restart docker
- 修改 Docker 的 cgroup 的設定,這個修改是為了讓 K8s 與 container runtime 的 cgroup driver 一致,可以避免系統會出現不穩定的狀況。
- 安裝 Kubeadm 。
- 允許 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
- 更新 apt 與 K8s 所需要的包。
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl
- 下載 Google Cloud 公開簽名密鑰。
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
- 添加 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
- 更新 apt 包的索引,便且安裝 kubelet 、 kubeadmi 和 kubectl ,並鎖定版本。
sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
- 啟動 k8s 。
sudo kubeadm init
- 加入 worker node
sudo kubeadm join 192.168.83.130:6443 --token token.... --discovery-token-ca-cert-hash sha256:......................
- 複製 kubeconfig
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 允許 iptables 檢查橋接流量 (bridged traffic) 。
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) 設定,好吧,那我重作好了。
第二次安裝
- 安裝 Ubuntu。
- 安裝 Docker。
- 修改 Docker 的 cgroup 的設定,這個修改是為了讓 K8s 與 container runtime 的 cgroup driver 一致,可以避免系統會出現不穩定的狀況。
sudo vim /etc/docker/daemon.json
{ "exec-opts": ["native.cgroupdriver=systemd"] }
- 重啟 Docker
sudo systemctl restart docker
- 修改 Docker 的 cgroup 的設定,這個修改是為了讓 K8s 與 container runtime 的 cgroup driver 一致,可以避免系統會出現不穩定的狀況。
- 安裝 Kubeadm 。
- 允許 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
- 更新 apt 與 K8s 所需要的包。
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl
- 下載 Google Cloud 公開簽名密鑰。
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
- 添加 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
- 更新 apt 包的索引,便且安裝 kubelet 、 kubeadmi 和 kubectl ,並鎖定版本。
sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
- 啟動 k8s 。
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
- 複製 kubeconfig
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 設定 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
- 加入 worker node
sudo kubeadm join 192.168.83.130:6443 --token token.... --discovery-token-ca-cert-hash sha256:......................
- 允許 iptables 檢查橋接流量 (bridged traffic) 。
搞定!收工下課!
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 的筆記本 留言,順手給我個讚吧!你的讚將成為我持續更新的動力,感謝你的閱讀,讓我們一起學習成為更好的自己。
參考
- 为什么要修改docker的cgroup driver?
- kubeadm: master node never ready
- Kube-Flannel cant get CIDR although PodCIDR available on node