使用 kubeadm 部署

痴者工良發表於2021-11-23

上一章中,我們用 minikube 去搭建單機叢集,並且建立 Deployment、Service(在三章中講解),本篇將介紹利用 kubeadm 部署多節點叢集,並學會 安裝以及使用 kubernetes 的命令列工具,快速建立叢集例項,完成部署 hello world 應用的實踐。

Kubeadm 是 CKAD 認證中要求掌握的部署方式,但是映象需要國外網路才能下載,讀者如果是國內伺服器,可以參考 2.4 章的內容,使用國內伺服器進行代理。

本章內容主要介紹如何安裝 kubeadm 以及部署叢集、新增節點。

需要提前在伺服器安裝好 Docker。

本文為作者的 Kubernetes 系列電子書的一部分,電子書已經開源,歡迎關注,電子書瀏覽地址:

https://k8s.whuanle.cn【適合國內訪問】

https://ek8s.whuanle.cn 【gitbook】

命令列工具

在 kubernetes 中,主要有三個日常使用的工具,這些工具使用 kube 字首命名,這三個工具如下:

  • kubeadm:用來初始化叢集的指令,能夠建立叢集已經新增新的節點。可用其它部署工具替代。
  • kubelet:在叢集中的每個節點上用來啟動 Pod 和容器等,每個節點必須有,相對於節點與叢集的網路代理。
  • kubectl:用來與叢集通訊/互動的命令列工具,與 kubernetes API-Server 通訊,是我們操作叢集的客戶端。

在 1.5 章中介紹過 kubelet、kubectl,kubelet 負責叢集中節點間的通訊,kubectl 供使用者輸入命令控制叢集,而且 kubeadm 則是建立叢集、新增減少節點的工具。

安裝命令列工具

命令列工具是每個節點都需要安裝的, kubectl、kubelet 兩個是必需的元件,而 kubeadm 則可以被代替。kubeadm 是 Kubenetes 官方推薦的部署工具,但由於網路等各方面原因,中文社群中也開發了一些替代專案,例如 Kubesphere(https://kubesphere.com.cn/),可在國內部署 Kubernetes,省去網路問題。

通過軟體倉庫安裝

下面介紹如何 通過 Google 的源下載安裝工具包。

更新 apt 包索引並安裝使用 Kubernetes apt 倉庫所需要的包:

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

新增 Kubernetes 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-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

更新 apt 包索引,安裝 kubelet、kubeadm 和 kubectl,並鎖定其版本:

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

執行命令檢查是否正常:

kubeadm --help

不同作業系統

只是這裡介紹一下 ubuntu 和 centos 不同的安裝方法,已經通過前面的安裝方法安裝好,則不需要理會這一小節。

Ubuntu 和 Debain 等系統可以使用以下命令通過軟體倉庫安裝:

sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

Centos、RHEL 等系統可以使用以下命令通過軟體倉庫安裝:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl

叢集管理

建立 kubernetes 叢集

Kubeadm 是一個建立管理工具,主要提供了 kubeadm init 和 kubeadm join 兩個命令,作為建立 Kubernetes 叢集的 “快捷途徑” 的最佳實踐。

Kubernetes 叢集由 Master 和 Worker 兩種節點組成,Master 節點負責控制叢集所有的節點。

注意,本教程叢集中的節點應當都是內網可互通的伺服器,這些伺服器之間可以通過內網相互訪問。如果是伺服器之間通過公網相互通訊的,操作方法請查詢其它教程。

1,建立 Master

執行 hostname -i 檢視此 node 的 ip。

我們初始化一個 API Server 服務,繫結地址為 192.168.0.8(按照你的ip改)。此步驟建立了一個 master 節點。

注:可以直接使用 kubeadm init,它會自動使用預設網路ip。

kubeadm init
# 或 kubeadm init --apiserver-advertise-address 192.168.0.8
# 或 kubeadm init --apiserver-advertise-address $(hostname -i)

部署失敗,可以參考下面兩個命令,檢視失敗原因。

systemctl status kubelet
journalctl -xeu kubelet

常見與 Docker 有關的錯誤可參考: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker

完成後,會提示一些資訊,在提示的內容中找到:

kubeadm join 192.168.0.8:6443 --token q25z3f.v5uo5bphvgxkjnmz \
    --discovery-token-ca-cert-hash sha256:0496adc212112b5485d0ff12796f66b29237d066fbc1d4d2c5e45e6add501f64

儲存這段資訊下來備用,後面加入節點時需要使用到。

如果有提示 Alternatively, if you are the root user, you can run:則你還需要執行下面的命令。

export KUBECONFIG=/etc/kubernetes/admin.conf

[Info] 提示

admin.conf 是連線 Kubernetes 的認證檔案,通過此檔案才能連線到 kubernetes,kubectl 也需要這個檔案;在 Linux 中,使用 KUBECONFIG 環境變數知道認證檔案的所在。

Linux 中每個使用者的環境變數是不同的,如果切換了使用者,則也需要設定 KUBECONFIG 環境變數;如果要在別的節點上連線叢集,則可以把這個檔案複製過去。

後面的操作都需要 admin.conf 檔案,否則會報 The connection to the server localhost:8080 was refused - did you specify the right host or port? 。

由於 export 的環境變數不能持久化,請開啟 ~/.bashrc 檔案,把這個命令加到檔案最後面。

[Info] 提示

為了保護 /etc/kubernetes/admin.conf,避免直接指向,建議每個使用者複製一次此檔案到使用者目錄下,其命令如下:

mkdir -p $HOME/.kube
cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

2,初始化網路

這一步不是必需的,不過一般來說,部署 Kubernetes 會配置網路,否則會節點之間不能相互訪問,讀者可以跟著做一次,在後面的章節中我們在一探究竟。

通過遠端配置檔案初始化網路,需要從第三方拉取一個 yaml 檔案。

kubectl apply  -f  "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"  --namespace=kube-system
#  --namespace=kube-system 表示外掛放到 kube-system 名稱空間中執行

成功的話會提示:

serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created

我們也可以手動配置,執行 kubectl version 檢視版本號,找到 GitVersion:v1.21.1 ,替換 yaml 檔案的地址 https://cloud.weave.works/k8s/net?k8s-version=v1.21.1,然後執行 kubectl apply -n kube-system -f net.yaml 即可。

3,加入叢集

前面已經建立了 Master 節點,接下來將另一個伺服器以 Worker 節點的方式加入叢集中。如果讀者只有一臺伺服器,則可以跳過這個步驟。

當節點加入 kubeadm 初始化的叢集時,雙方需要建立雙向信任,分為發現(Worker信任Master) 和 TLS 引導(Master信任待加入Worker)兩部分。目前有兩種加入方式,一種是通過令牌加入,一種是通過 kubeconfig 檔案加入。

格式:

kubeadm join --discovery-token abcdef.xxx {IP}:6443 --discovery-token-ca-cert-hash sha256:xxx
kubeadm join--discovery-file file.conf

在第二個節點中,使用之前備份好的命令,直接執行,加入叢集,格式如下命令所示

kubeadm join 192.168.0.8:6443 --token q25z3f.v5uo5bphvgxkjnmz \
    --discovery-token-ca-cert-hash sha256:0496adc212112b5485d0ff12796f66b29237d066fbc1d4d2c5e45e6add501f64

複製貼上時,要注意,可能會由於 \ 換行符,導致貼上時,多了一個小數點,導致報錯。

貼上出錯

可能碰到的問題

檢視 docker 版本:yum list installed | grep docker 和 docker version

如果部署過程中出現 failed to parse kernel config: unable to load kernel module,也說明了 docker 版本太高,需要降級。

如果伺服器裝了 dnf,那麼降級 docker 版本的命令:

dnf remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
dnf -y install dnf-plugins-core
dnf install docker-ce-18.06.3.ce-3.el7 docker-ce-cli containerd.io

不行的話就按照 https://docs.docker.com/engine/install/centos/ 降級,或者自行按照其它方法處理。

注意,docker version 會看到 client 和 server 版本,兩者的版本號可能不一致。

刪除節點

在生產環境中,由於節點上已經部署著服務,因此直接刪除節點,可能會導致嚴重的故障問題。因此需要移除一個節點時,首先要在此節點上驅逐所有 Pods,Kubernetes 會自動將此節點上的 Pod 轉移到其它節點上部署(第三章會講)。

獲取叢集中的所有節點,找到需要驅逐的節點名稱。

kubectl get nodes

驅逐此節點上所有的 Pod:

kubectl drain {node名稱}

雖然驅逐了節點上所有的服務,但是節點依然在叢集中,只是 Kubernetes 不會再部署 Pod 到此節點上。如果需要恢復此節點,允許繼續部署 Pod,可使用:

kubectl uncordon {節點名稱}

關於驅逐,後面的章節會學習到。

注:驅逐 Pod,並一定能夠驅逐所有 Pod,有些 Pod 可能不會被清除。

最終刪除此節點:

kubectl delete node {節點名稱}

叢集刪除了此節點後,節點上還保留著一些資料,可以繼續清除環境。

清除環境

如果步驟做錯了想重來,或者移除節點需要清除環境,可以執行 kubeadm reset [flags] 命令。

注:只執行 kubeadm reset 命令無效。

[flags] 有四種型別:

preflight              Run reset pre-flight checks
update-cluster-status  Remove this node from the ClusterStatus object.
remove-etcd-member     Remove a local etcd member.
cleanup-node           Run cleanup node.

我們需要執行:

kubeadm reset cleanup-node 
kubeadm reset

即可在當前伺服器上清除 Kubernetes 殘留的 容器或者其它資料。

相關文章