目前爲止,筆者已經寫了 5 篇關於 k8s 的文章,這一篇筆者將介紹 CKAD 認證官方課程中,如何部署 k8s 節點。
在上一篇中,已經介紹了 kubeadm 如何部署 k8s ,而且 kubeadm 是官方默認推薦的工具,所以讀者可以先閱讀 《淺入kubernetes(5):嘗試kubeadm》
https://www.cnblogs.com/whuanle/p/14679590.html
或
https://www.whuanle.cn/archives/1230
根據上一篇文章的內容,安裝好 kubeadm、kubectl、kubelet 、docker。注:docker 版本不能爲 20.x!
kubeadm
:用來初始化集羣的指令。kubelet
:在集羣中的每個節點上用來啓動 Pod 和容器等。kubectl
:用來與集羣通信的命令行工具。
預設網絡
Calico(https://github.com/projectcalico/calico) 是針對容器、虛擬機和裸機工作負載的開源網絡和安全解決方案,它提供了 pod 之間的網絡連接和網絡安全策略實施。
讀者可參考 https://kubernetes.io/zh/docs/concepts/cluster-administration/networking/ 這裏不做過多的說明。
執行 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。
然後修改 /etc/hosts
文件,加上一行(替換這個ip爲你的):
10.170.0.2 k8smaster
後面我們訪問集羣,使用 k8smaster,而且不是使用 ip 直接訪問。
kubeadm 安裝 k8s
執行 kubectl version
查看 k8s 版本,GitVersion:"v1.21.0"
表示的即爲 k8s 版本,因爲工具版本跟 k8s 版本一致。
創建一個 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
按照提示,我們執行:
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 是初始化的配置。
配置 calico
然後下下載 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。
然後我們啓用 calico 網絡插件:
kubectl apply -f calico.yaml
自動補全工具
kubectl
命令和可選參數非常多,每次都要敲長長的命令,任意出錯,我們可以利用 bash-completion
爲我們快速完成命令的輸入。
sudo apt-get install bash-completion -y
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> $HOME/.bash
我們可以測試一下。
輸入 kubectl des
,然後按一下 TAB
鍵,會發現內容自動補全。
輸入完整的 kubectl descibe nodes
可以查到 node 狀態,後面的小節再聊聊 descibe nodes
的含義。
狀態描述
執行 kubectl descibe 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 網絡插件。