225. Important Update: Kubernetes the Hard Way

這個章節其實是 Section 10 的最後一個 lecture,不過我想擺在這裡應該會比較合適!
講師提供一系列 Youtube 影片來示範如何像個硬漢一樣 Install Kubernetes from Scratch 課程中所有範例可以在 mmumshad / kubernetes-the-hard-way 找到。

226. Introduction to Deployment with Kubeadm

kubeadm_step_overview

▲ Kubernetes 官方提供 kubeadm 讓使用者搭建 multi node cluster,簡單的步驟如圖。不過自從 Kubernetes v1.24 deprecated 掉 docker 做為 container runtime 以後已經不建議使用 docker 囉!

[kubernetes.io] Installing a container runtime

kubeadm-stacked-color
▲ kubeadm 的 LOGO。

230. Practice Test - Deploy a Kubernetes Cluster using Kubeadm

安裝 kubeadm 的方式請參考書籤 Installing kubeadm, kubelet and kubectl,下面會以 Debian-base distro 來當範例。 反正就是一直無腦複製貼上啦

  1. 更新 apt 必要條件
1
2
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

apt-transport-https 這個套件是為了讓 apt 能夠以 HTTPS method 下載。

apt-transport-https - APT transport for downloading via the HTTP Secure protocol (HTTPS)

  1. 下載 Google PGP key
1
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
  1. 新增 apt repositry
1
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
  1. 接著更新 apt repo index、下載 kubeadm 所需、 將這三個套件的版本固定,避免被 sudo apt upgrade/update 不小心升級
1
2
3
4
5
6
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

## if specific version
sudo apt-get install -y kubelet=1.24.0 kubeadm=1.24.0 kubectl=1.24.0

Creating a cluster with kubeadm

這個子章節介紹如何使用 kubeadm 來把 cluster 跑起來~

  • 如果你想讓執行 kubeadm init or kubeadm join 這兩個指令時,就把一些常用的 image 抓到該 node 身上,可以參考 Running kubeadm without an Internet connection, 如果 cluster 碰不到外網就自建 Harbor 吧!

Initializing your control-plane node

  1. (官方建議) 如果未來 (或者現在) 有意要將這個 singal control-plane node 升級到多節點達到 HA 目的的話,--control-plane-endpoint 必須被指定。格式參考 Stacked control plane and etcd nodes
1
sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs

--upload-certs 代表這個 control-plane node 的 certification 之後會跟之後建立的 control-plane node 共享,詳情參考 Manual certificate distribution

Such an endpoint can be either a DNS name or an IP address of a load-balancer.

是不一定要使用 Domain name 啦… 不過自建一個 ADGuard Home 也沒多少時間嘛!

  1. 安裝 CNI plugins,--pod-network-cidr 設定 pod 使用的網段 例如: --pod-network-cidr=10.10.0.0/16。參考書籤 Installing a Pod network add-on

  2. (Optional) 預設 kubeadm 會自動去偵測 CRI,如果安裝多個 CRI 想要指定使用的話可以加上 --cri-socket 常見的 CRI 路徑 Installing a container runtime

  3. (Optional) 預設 kube-apiserver 會 LISTEN 在 default gateway via 的 NIC 上面,可以透過 --apiserver-advertise-address=<ip-address> 指定 bind IP, 如果使用 IPv6 就必須手動給定 EX: --apiserver-advertise-address=fd00::101

More information

完成 kubeadm init 之後

kubeadm init 會執行一系列的檢查,確保系統可以跑 K8s,沒有問題才會開始 下載/安裝 control-plane 所需的元件,一切結束後會顯示下面的訊息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  /docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

如果沒有執行下面指令讓 kubectl 有 config (或者說 context), kubectl 就會無法使用!!

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

kubeadm_print_join_command

kubeadm init 結束之後顯示的 join token 如果沒有記下來 (也不應該,雖然會過期),可以使用 kubeadm token create --print-join-command 重新產生一個。

kubeadm_completion

▲ 使用 kubeadm completion <shell> 產生 completion config。

kubeadm_delete_token

▲ 使用 kubeadm token delete "xxx" 可以刪除 join token

Section 12 End to End Test

講師說 CKA 考試在 2020.09 之後就拔掉這個項目了。

我的問問筆記@CNTUG

1
2
3
4
5
6
7
大家午安,想問一下 "K8s End to End test" 是官方提供測試 K8s cluster 的 framwork (有點像 SDK ?)
實務上會用哪些方法來確保 cluster 建立後的完整性 ?

https://kubernetes.io/blog/2019/03/22/kubernetes-end-to-end-testing-for-everyone/


因為我看 CKA 考試在 2020.09 之後就拔掉這個項目了,是因為這個方法已經過時了嗎? 謝謝~

小飛機、邱牛,在第一時間都推薦使用 SONOBUOY.io 來檢測 K8s cluster 的完整性。
這也是目前要被認證為 k8s 發行版本必須要使用的工具 by 邱牛

sonobuoy_official_web

▲ sonobuoy 翻譯叫做「聲納浮標」,用來檢測 K8s 貨櫃船也很合理嘛 XD