kubeadm搭建kubenetes叢集(Ubuntu 20.04,kubenetes 1.20.5)

tsin 發表於 2021-04-08

說明

本次搭建使用三臺雲主機,一個master節點,兩個node節點,配置均為:2核8G,30G儲存。
系統採用Ubuntu 20.04。

安裝過程

關閉 swap

// 註釋掉有swap的行
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
// 關閉swap
sudo swapoff -a

關閉防火牆

systemctl stop ufw
systemctl disable ufw

修改 cloud.cfg(如果有該檔案)

vi /etc/cloud/cloud.cfg
#該配置預設為 false,修改為 true 即可
preserve_hostname: true

修改DNS

vi /etc/systemd/resolved.conf開啟檔案,修改如下:

[Resolve]
DNS=114.114.114.114

修改hostname

執行hostnamectl set-hostname kubernetes-master修改hostname,kubernetes-master為修改後的hostname。

安裝docker

使用最新的docker,會提示:this Docker version is not on the list of validated versions: 20.10.5. Latest validated version: 19.03。20.10.5版本不在支援列表裡面,所以這裡安裝的時候需限制版本為19.03

依次執行以下命令:

// 確保移除已安裝的docker
sudo apt-get remove docker docker-engine docker-ce docker.io
// 更新軟體
sudo apt-get update
// 安裝必要的工具
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
// 新增Docker官方的GPG金鑰
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 // 設定stable儲存庫
 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
 // 更新軟體源
sudo apt-get update
// 檢視docker可用的版本
apt-cache madison docker-ce

檢視docker可用的版本輸出大概結果如下:

.
.
.
 docker-ce | 5:19.03.9~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

第二欄為版本號,這裡選擇版本號為:5:19.03.9~3-0~ubuntu-focal。將版本號放到docker-ce=後面,執行命令如下所示:

sudo apt-get install docker-ce=5:19.03.9~3-0~ubuntu-focal

安裝完後檢查docker的狀態:

systemctl status docker

執行以下命令配置docker:

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "registry-mirrors": ["https://1uovoul9.mirror.aliyuncs.com"],
  "storage-driver": "overlay2"
}
EOF

其中,registry-mirrors新增國內的docker映象源,這裡使用阿里雲的。獲取方法:登入阿里雲後,轉到cr.console.aliyun.com/cn-guangzhou... ,點選左邊選單欄的「映象工具」-「映象加速」即可看到映象源地址。
最後,重新啟動 Docker 並在啟動時啟用:

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

安裝 kubeadm,kubelet,kubectl

先安裝一些依賴和做一些配置:

# 安裝系統工具
apt-get update && apt-get install -y apt-transport-https
# 安裝 GPG 證照
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 寫入軟體源;注意:我們用系統代號為 bionic,但目前阿里雲不支援,所以沿用 16.04 的 xenial
cat << EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

開始安裝:

apt-get update  
apt-get install -y kubelet kubeadm kubectl

各元件的作用說明:

  • kubeadm:用來初始化叢集的指令。
  • kubelet:在叢集中的每個節點上用來啟動 Pod 和容器等。
  • kubectl:用來與叢集通訊的命令列工具。

接著,設定kubelet自啟動並啟動:

systemctl enable kubelet && systemctl start kubelet

配置kubeadm

# 匯出配置檔案
# 在home目錄下
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

修改配置檔案如下所示:

# 修改配置為如下內容
apiVersion: kubeadm.k8s.io/v1beta1
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 修改為`主節點` IP
  advertiseAddress: 172.19.122.236
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: kubernetes-master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: ""
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
# 國內不能訪問 Google,修改為阿里雲
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 修改版本號 必須對應
kubernetesVersion: v1.20.5
networking:
  # 新增該配置 用於後續 Calico網路外掛
  podSubnet: 192.168.0.0/16
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---

接著,執行以下命令拉取映象:

kubeadm config images pull --config kubeadm.yml

初始化master節點

在home目錄下(kubeadm.yml所在目錄)執行:

 kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

大概等幾分鐘就執行完畢。輸出資訊的結尾會有如下資訊:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.19.122.236:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:05bc648be3f406d2bde977cdfe1c0dfe4fb50c3d7b62b8f0950c66c0052e27c0 

後面新增worker節點的時候,可通過執行kubeadm join...命令新增。
接下來配置kubectl,執行:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 修改檔案所有者(非 ROOT 使用者才需要執行)
chown $(id -u):$(id -g) $HOME/.kube/config

驗證是否成功:

kubectl get nodes

輸出資訊大概如下所示;

NAME                STATUS     ROLES                  AGE   VERSION
kubernetes-master   NotReady   control-plane,master   39m   v1.20.5

表示主節點已經配置成功。如果安裝失敗,重試的話,需先執行: kubeadm reset清理配置檔案。

配置worker節點

首先,新開一臺機器,重複上面配置kubeadm之前的操作,在worker節點安裝docker, kubeadm,kubectl,kubelet,除了hostname改為不一樣的名字,安裝完後不用執行啟動命令。
其次,在master節點上,可以使用之前控制檯輸出的join命令,也可以重新生成join命令。步驟如下:

  • 建立新的token:
    kubeadm token generate
    輸出結果示例:18ezo4.huyg5hw5tv0g07kg
  • 使用上面生成的token生成join命令:
    kubeadm token create 18ezo4.huyg5hw5tv0g07kg --print-join-command --ttl=0
    ttl代表token有效期,0為永久有效。可用kubeadm token list檢視現有的token。
    執行結果示例:
    kubeadm join 172.19.122.236:6443 --token 18ezo4.huyg5hw5tv0g07kg     --discovery-token-ca-cert-hash sha256:05bc648be3f406d2bde977cdfe1c0dfe4fb50c3d7b62b8f0950c66c0052e27c0 

複製該命令到子節點上執行,如果執行成功,會有如下提示:

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

到master節點上執行:

kubectl get nodes

可看到新新增的節點:

NAME                STATUS     ROLES                  AGE     VERSION
kubenetes-node1     NotReady   <none>                 11s     v1.20.5
kubernetes-master   NotReady   control-plane,master   5h44m   v1.20.5

按照同樣的步驟,可新增更多節點。

安裝網路外掛(CNI)

在master節點執行:kubectl get pod -n kube-system -o wide,輸出如下所示:

NAME                                        READY   STATUS    RESTARTS   AGE    IP               NODE                NOMINATED NODE   REA
coredns-7f89b7bc75-5chtb                    0/1     Pending   0          6h9m   <none>           <none>              <none>           <no
coredns-7f89b7bc75-nrwmw                    0/1     Pending   0          6h9m   <none>           <none>              <none>           <no
etcd-kubernetes-master                      1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-apiserver-kubernetes-master            1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-controller-manager-kubernetes-master   1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-proxy-fw96l                            1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-proxy-gcjwr                            1/1     Running   0          25m    172.19.122.237   kubenetes-node1     <none>           <no
kube-proxy-xz25z                            1/1     Running   0          71s    172.19.122.238   kubenetes-node2     <none>           <no
kube-scheduler-kubernetes-master            1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no

coredns還未執行,說明缺少網路外掛。
這裡選擇Calico作為CNI外掛。
依次執行如下命令:

kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

然後檢視pod狀態:

watch kubectl get pods --all-namespaces

可能要等待幾分鐘,等所有 container 都變成 running 狀態才算安裝完成。最終結果如下所示:

NAMESPACE         NAME                                        READY   STATUS    RESTARTS   AGE
calico-system     calico-kube-controllers-f95867bfb-jpfd5     1/1     Running   0          6m3s
calico-system     calico-node-47vkb                           1/1     Running   0          6m3s
calico-system     calico-node-7sj6n                           1/1     Running   0          6m3s
calico-system     calico-node-v2g49                           1/1     Running   0          6m3s
calico-system     calico-typha-57c9945bcf-4zbfw               1/1     Running   0          6m
calico-system     calico-typha-57c9945bcf-cz7wx               1/1     Running   0          6m
calico-system     calico-typha-57c9945bcf-tmc5s               1/1     Running   0          6m4s
kube-system       coredns-7f89b7bc75-5chtb                    1/1     Running   0          6h36m
kube-system       coredns-7f89b7bc75-nrwmw                    1/1     Running   0          6h36m
kube-system       etcd-kubernetes-master                      1/1     Running   1          6h36m
kube-system       kube-apiserver-kubernetes-master            1/1     Running   1          6h36m
kube-system       kube-controller-manager-kubernetes-master   1/1     Running   1          6h36m
kube-system       kube-proxy-fw96l                            1/1     Running   1          6h36m
kube-system       kube-proxy-gcjwr                            1/1     Running   0          52m
kube-system       kube-proxy-xz25z                            1/1     Running   0          28m
kube-system       kube-scheduler-kubernetes-master            1/1     Running   1          6h36m
tigera-operator   tigera-operator-675ccbb69c-2d68b            1/1     Running   0          6m51s

自此,kubenetes叢集搭建完成。

狀態元件執行檢查

執行 kubectl get cs

NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
etcd-0               Healthy     {"health":"true"}   
  • scheduler 為排程服務,主要作用是將 POD 排程到 Node
  • controller-manager 為自動化修復服務,主要作用是 Node 當機後自動修復 Node 回到正常的工作狀態
  • etcd-0 則是熟悉的服務註冊與發現
    輸出結果中,有兩個元件是unhealthy,出現這種情況,是 /etc/kubernetes/manifests下的 kube-controller-manager.yamlkube-scheduler.yaml 設定的預設埠是0,在檔案中註釋掉- --port=0就可以了(在前面加上#號)。再次執行檢視命令,修改後都變為ok狀態了。

參考

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Was mich nicht umbringt, macht mich stärker