在上一章中,我們已經學會了使用 kubeadm 建立叢集和加入新的節點,在本章中,將按照 CKAD 課程的方法重新部署一遍,實際上官方教程的內容不多,筆者寫了兩篇類似的部署方式,如果已經部署了 kubernetes 叢集,則本章的內容可跳過。
本文為作者的 Kubernetes 系列電子書的一部分,電子書已經開源,歡迎關注,電子書瀏覽地址:
https://k8s.whuanle.cn【適合國內訪問】
https://ek8s.whuanle.cn 【gitbook】
部署
預設網路
本節主要是配置 hosts 檔案,在後續配置中,通過主機名稱即可快速連線,而不需要每次都打上 IP 地址。
我們在 Master 節點伺服器執行 ip addr
命令,找到 ens4
,把裡面提到的 ip 記錄下來。
ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000
link/ether 42:01:0a:aa:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.170.0.2/32 scope global dynamic ens4
valid_lft 2645sec preferred_lft 2645sec
inet6 fe80::4001:aff:feaa:2/64 scope link
valid_lft forever preferred_lft forever
如上述 ip 是 10.170.0.2。或者使用 hostname -i
查詢。方式有很多,目前是獲得主機的內網 IP。
然後修改 /etc/hosts
檔案,加上一行(替換這個ip為你的):
10.170.0.2 k8smaster
後面我們訪問叢集,使用 k8smaster 這個主機名稱(域名),而且不是需要 IP 地址,使用主機名稱方便記憶,也避免了 IP 強固定。
kubeadm 安裝 k8s
這裡的部署過程跟上一章中的有所差異,因為上章中,直接使用 kubeadm init
進行初始化叢集,沒有配置更多細節。
執行 kubectl version
檢視 k8s 版本,找到這段GitVersion:"v1.21.0"
,即為 Kubernetes 版本。
建立一個 kubeadm-config.yaml 檔案,我們使用 kubeadm init
時,通過此配置檔案出初始化 k8s master。
檔案內容為:
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubenetesVersion: 1.21.0
controlPlaneEndpoint: "k8smaster:6443"
networking:
podSubnet: 192.168.0.0/16
注意,:
後面必須帶一個空格。表示key: value
。例如 image: nginx:letest
,不帶空格的 :
會連在一起。
然後通過配置檔案初始化 Master:
kubeadm init --config=kubeadm-config.yaml --upload-certs --v=5 | tee kubeadm-init.out
# 可省略為 kubeadm init --config=kubeadm-config.yaml --upload-certs
--v=5
可以輸出更多資訊資訊,tee xxx
可以讓資訊輸出到一個檔案中,方便收集日誌或者後續檢查。
執行初始化命令後,終端或檢視 kubeadm-init.out
檔案,有以下內容:
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join k8smaster:6443 --token 45td1j.xqdscm4k06a4edi2 \
--discovery-token-ca-cert-hash sha256:aeb772c57a35a283716b65d16744a71250bcc25d624010ccb89090021ca0f428 \
--control-plane --certificate-key d76287ccc4701db9d34e0c9302fa285be2e9241fc43c94217d6beb419cdf3c52
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8smaster:6443 --token 45td1j.xqdscm4k06a4edi2 \
--discovery-token-ca-cert-hash sha256:aeb772c57a35a283716b65d16744a71250bcc25d624010ccb89090021ca0f428
按照提示,我們逐個執行下面的命令,不要一次性貼上執行,因為 cp -i
表示要你輸入 y/n
確認更改,一次性貼上會導致跳過(把 -i 改為 -f 也行)。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然後:
export KUBECONFIG=/etc/kubernetes/admin.conf
筆者注:KUBECONFIG
環境變數在下次登入或新建終端視窗會失效,開啟 使用者目錄的.bashrc
檔案,在最後面加上 export KUBECONFIG=/etc/kubernetes/admin.conf
,可保證下次登入或切換終端,依然可用。
筆者注:因為涉及到多使用者,所以如果切換使用者,就不能使用 kubeadm/kubectl/kubelet
命令了,如果讀者切換了使用者,則可以執行上面 make -p $HOME/.kube
到 export xxx
這兩部分的命令,這樣別的使用者也可以執行命令操作節點。
輸入 kubeadm config print init-default
可以檢視到 master 初始化時配置。
以上便是 CKAD 官方的部署方法。
配置 Calico
什麼是 CNI
CNI 意為容器網路介面,是 Kubernetes 的一種標準設計,使用者可以不需要關注使用了何種網路外掛,可以在外掛或銷燬容器時更加容易地配置網路。
Kubernetes 中有 Flannel、Calico、Weave 等主流的外掛,在上一篇中,我們部署 Kubernetes 網路時,使用了 Weave,而在本章中,我們將使用 Calico 來部署網路。
對於 CNI ,後面的章節會深入學習。
Calico(https://github.com/projectcalico/calico) 是針對容器、虛擬機器和裸機工作負載的開源網路和安全解決方案,它提供了 Pod 之間的網路連線和網路安全策略實施。
Flannel、Calico、Weave 都是常用的 Kubernetes 網路外掛,讀者可參考 https://kubernetes.io/zh/docs/concepts/cluster-administration/networking/ 這裡不做過多的說明。
首先下載 Calico 的 yaml 檔案。
wget https://docs.projectcalico.org/manifests/calico.yaml
然後我們需要留意 yaml 檔案中的 CALICO_IPV4POOL_CIDR
的值,讀者直接開啟 https://docs.projectcalico.org/manifests/calico.yaml 或者使用 less calico.yaml
在終端上閱讀檔案。
找到 CALICO_IPV4POOL_CIDR
例如:
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
這個表示 ip4 池,如果 ip 不存在,則會自動建立,建立 的 pod 的網路 ip 會在這個範圍。預設是 192.168.0.0
我們不需要改,如果你需要定製,則可以刪除 #
,然後改動 ip。
[Error] 提示
請務必根據你叢集中的 IP 段,配置此引數。
然後我們啟用 Calico 網路外掛:
kubectl apply -f calico.yaml
當網路配置完成後,即可使用 kubeadm join
加入節點。
其它
在節點上執行命令
如果我們在 Worker 節點上執行命令,會發現:
root@instance-2:~# kubectl describe nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
首先在 Master 節點中,下載 /etc/kubernetes/admin.conf
檔案,或者複製檔案內容,到 Worker 節點中。
將檔案上傳或複製到 Worker 節點的 /etc/kubernetes/admin.conf
檔案,執行配置即可。
mkdir -p $HOME/.kube
sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> $HOME/.bashrc
自動補全工具
kubectl
命令和可選引數非常多,每次都要敲長長的命令,容易出錯,我們可以利用 bash-completion
為我們快速完成命令的輸入。
sudo apt-get install bash-completion -y
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> $HOME/.bashrc
當我們敲命令時,按下 TAB 鍵,會自動補全。
輸入 kubectl des
,然後按一下 TAB
鍵,會發現內容自動補全為 kubectl describe
。
狀態描述
執行 kubectl describe nodes
/命令,我們可以看到節點詳細的資訊,其中有個 Conitions
欄位,描述了所有正在執行中(Running) 的節點的狀態,它有 5 個欄位或型別:
-
Ready
Node 是否能夠接收 pod ,如果可以則
Status
為 True;如果節點不健康,不能接收 pod,則 為 False。正常情況下為 True。 -
DiskPressure
表示節點的空閒空間不足以用於新增新 Pod,如果為 True則說明不正常。
-
MemoryPressure
表示節點存在記憶體壓力,即節點記憶體可用量低,如果為 True 則說明不正常。
-
PIDPressure
表示節點存在程式壓力,即節點上程式過多;如果為 True 則說明不正常。
-
NetworkUnavailable
表示節點網路配置不正確;如果為 True,則說明不正常。
如果使用 JSON 表示:
"conditions": [
{
"type": "Ready",
"status": "True",
"reason": "KubeletReady",
"message": "kubelet is posting ready status",
"lastHeartbeatTime": "2019-06-05T18:38:35Z",
"lastTransitionTime": "2019-06-05T11:41:27Z"
}
]
讀者可參考:https://kubernetes.io/zh/docs/concepts/architecture/nodes/
本章內容主要介紹了 CKAD 認證中要求掌握的 kubeadm 部署 k8s 、配置啟動 Calico 網路外掛,跟上一篇的內容比較,主要是通過 yaml 檔案去控制建立 kubernetes 叢集,兩章的部署過程一致,只是網路外掛有所不同。