1. 程式人生 > >基於 kubeadm 部署單控制平面的 k8s 叢集

基於 kubeadm 部署單控制平面的 k8s 叢集

單控制平面不符合 HA 要求,但用於開發/測試環境不會有任何問題,如果資源足夠的話(10臺以上伺服器,3臺用於APIserver、3臺用於 etcd 儲存、至少3臺用於工作節點、1臺作為負載均衡),可以部署多控制平面的高可用叢集環境。下面是高可用叢集拓補結構,供參考:

安裝步驟其實大同小異,高可用多了幾個步驟,安裝時可參看官網文件,也比較好操作。本文著重記錄單控制平面K8S叢集安裝步驟。

一、準備工作

硬體資源要求,4核心以上CPU,8GB以上記憶體,所有伺服器間網路正常通訊,Ubuntu 16.04 以上或 CentOS 7以上版本作業系統,一臺伺服器作為控制平面節點,若干伺服器作為工作節點,我這裡準備了4個工作節點。大致資訊如下:

名稱 CPU 記憶體 IP OS 安裝 用途
CPN-1 4U 8GB 10.163.10.6 ubuntu18.04 docker , kubeadm, kubelet , kubectl Control Plane Node
WN-1 4U 8GB 10.163.10.7 ubuntu18.04 docker , kubeadm, kubelet Worker Node
WN-2 4U 8GB 10.163.10.8 ubuntu18.04 docker , kubeadm, kubelet Worker Node
WN-2 4U 8GB 10.163.10.9 ubuntu18.04 docker , kubeadm, kubelet Worker Node
WN-2 4U 8GB 10.163.10.10 ubuntu18.04 docker , kubeadm, kubelet Worker Node

安裝 docker

K8S 支援多種容器執行時環境,這裡選擇 docker 作為執行時環境,首先為所有節點伺服器安裝 docker,目前 kubernetes 最新版(v1.15.2) 可以完全相容支援的 docker 最高版本為 v18.06,所以這裡安裝 v18.06 這個版本。
參考 官網文件。

# 刪除舊版本docker
$ sudo apt-get remove docker docker-engine docker.io containerd runc

# 更新 apt 
$ sudo apt-get update

# 安裝工具包
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# 新增Docker官方 GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 新增 stable apt 源
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# 安裝 Docker CE
$ sudo apt-get update
$ sudo apt-get install docker-ce=18.06.3~ce~3-0~ubuntu docker-ce-cli=18.06.3~ce~3-0~ubuntu containerd.io

如果因網路環境原因從官網倉庫安裝速度較慢,可以使用阿里雲映象倉庫安裝,具體步驟如下:

# step 1: 安裝必要的一些系統工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟體源資訊
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝 Docker-CE
sudo apt-get -y update

# 選擇安裝版本,這裡選擇 18.06.3
apt-cache madison docker-ce
# sudo apt-get -y install docker-ce=[version]
sudo apt-get -y install docker-ce=18.06.3~ce~3-0~ubuntu

後續操作

** 1、當前使用者加入"docker"使用者組**

$ sudo usermod -aG docker $USER

***2、 配置 cgroup 驅動為 systemd

#  建立檔案 /etc/docker/daemon.json ,內容如下:
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

# 重啟服務生效配置
sudo systemctl daemon-reload
sudo systemctl restart docker.service

# 檢查配置是否生效
docker info | grep Cgroup

# ECHO ---
Cgroup Driver: systemd

關閉 swap

swapoff -a && sudo sed -i 's/^.*swap/#&/g' /etc/fstab

安裝 kubelet kubeadm kubectl

由於網路原因,直接 APT-GET 安裝可能安裝不了,這裡需要配置一下映象倉庫。

# 配置阿里雲 kubernetes 映象倉庫
$ sudo apt-get update && sudo apt-get install -y apt-transport-https

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

# 建立檔案 /etc/apt/sources.list.d/kubernetes.list, 內容如下:
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

# 安裝 kubelet kubectl kubeadm
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl

# 設定kubelet開機啟動
$ sudo systemctl enable kubelet

二、部署控制平面節點

過程中會用到一些列 docker 映象檔案,這些檔案在 Google 的映象倉庫,可以通過 kubeadm config images pull 命令驗證網路是否能夠正常拉取映象。國內環境,十有八九無法直接連線,可從其他映象倉庫下載,然後再修改映象標籤,以便啟動相關 pod。

準備映象

列出安裝過程中需要用到的映象檔案,命令為

kubeadm config images list

# ECHO ------
k8s.gcr.io/kube-apiserver:v1.15.2
k8s.gcr.io/kube-controller-manager:v1.15.2
k8s.gcr.io/kube-scheduler:v1.15.2
k8s.gcr.io/kube-proxy:v1.15.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

這裡選擇從 docker hub 中的 mirrorgooglecontainers 拉取映象副本,然後更新tag,再刪除映象副本,指令碼如下:

images=(kube-proxy:v1.15.2 kube-scheduler-amd64:v1.15.2 kube-controller-manager-amd64:v1.15.2 kube-apiserver:v1.15.2 etcd:3.3.10 pause:3.1)
for imageName in ${images[@]} ; do
  docker pull mirrorgooglecontainers/$imageName  
  docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName  
  docker rmi mirrorgooglecontainers/$imageName
done

mirrorgooglecontainers 下面沒有 coredns,我們可以從另一個位置單獨拉取,命令如下:

docker pull coredns/coredns:1.3.1
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
docker rmi coredns/coredns:1.3.1

初始化控制平面節點

控制平面節點是控制平面元件執行的機器,包括etcd(叢集資料庫)和 API server (kubectl CLI與之通訊)。

需要安裝pod網路外掛,才能使得叢集 pod 間可以相互通訊,必須在任何應用程式之前部署 pod 網路。此外,CoreDNS將不會在安裝網路之前啟動。kubeadm僅支援基於容器網路介面(CNI)的網路,有幾個專案使用CNI提供了Kubernetes pod網路,其中一些還支援網路策略。有關可用網路載入項的完整列表,請參閱網路元件頁面。

另外,請注意,Pod網路不得與任何主機網路重疊,因為這可能會導致問題。如果發現網路外掛的首選Pod網路與某些主機網路之間發生衝突,應為 kubeadm init 指定 --pod-network-cidr 引數配置網路網路,並在網路外掛的YAML中修改相應資訊。

這裡我選擇 calico 網路,根據 calico 文件說明,我們需為 kubeadm init 指定 --pod-network-cidr=192.168.0.0/16引數。現在執行 kubeadm init <args>

kubeadm init \
    --kubernetes-version v1.15.2 \
    --apiserver-advertise-address=10.163.10.6 \
    --pod-network-cidr=192.168.0.0/16

###--ECHO

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:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

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

kubeadm join 10.163.10.6:6443 --token xxxxxx.xxxxxxxxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

輸出上述資訊,則說明 控制平面初始化完成,根據提示訊息,依次執行以下命令:

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

注意記錄輸出結果中的 kubeadm join *** 資訊,隨後在新增工作節點到叢集時需要用到,可以複製後暫時存到某個地方。

安裝網路

此時,我們通過 kubectl get pods --all-namespaces 命令,應該可以看到 coredns 處於 pending 狀態,安裝網網路以後,它才能處於 running 狀態。我們選擇 calico 為 pod 提供網路,pod 網路本身以k8s 應用的形式執行,執行下面命令進行安裝。

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

安裝了pod網路後,可以通過檢查 CoreDNS pod 是否在輸出中執行來確認它是否正常工作 kubectl get pods --all-namespaces

kubectl get pods --all-namespaces

# ECHO ----
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-7bd78b474d-vmq2w   1/1     Running   0          4m57s
kube-system   calico-node-2cwtx                          1/1     Running   0          4m57s
kube-system   coredns-5c98db65d4-gv2j6                   1/1     Running   0          10m
kube-system   coredns-5c98db65d4-n6lpj                   1/1     Running   0          10m
kube-system   etcd-vm-10-13-ubuntu                       1/1     Running   0          8m54s
kube-system   kube-apiserver-vm-10-13-ubuntu             1/1     Running   0          9m10s
kube-system   kube-controller-manager-vm-10-13-ubuntu    1/1     Running   0          9m3s
kube-system   kube-proxy-qbk66                           1/1     Running   0          10m
kube-system   kube-scheduler-vm-10-13-ubuntu             1/1     Running   0          9m8s

pod 啟動需要時間,請耐心等待。

加入節點

CoreDNS pod 啟動並執行後,我們可以為叢集新增工作節點。工作節點伺服器需安裝docker 、kubeadm 和 kubelet,安裝過程參考 master 節點部署流程。

拉取映象

工作節點伺服器需要至少啟動兩個 pod ,需要用到的映象為 kube-proxypause ,同理我們無法直接從 k8s.grc.io 下載,需要提前拉取後修改 tag ,執行下面命令:

images=(kube-proxy:v1.15.2 pause:3.1)
for imageName in ${images[@]} ; do
  docker pull mirrorgooglecontainers/$imageName  
  docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName  
  docker rmi mirrorgooglecontainers/$imageName
done

加入叢集

執行控制平面節點初始化完成後提供的新增工作節點命令,格式如下:

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

命令中的 --token--discovery-token-ca-cert-hash 在叢集master節點部署完成後的結果資訊中有體現,直接複製出來即可使用。

可以通過在控制平面節點執行kubeadm token list來獲取token資訊,token 令牌會在 24 小時候失效,如果要建立新的令牌,使用 kubeadm token create 命令。

可以通過下面命令獲取 --discovery-token-ca-cert-hash

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

注意,如果需要重新執行 kubeadm join ,需先先執行 kubeadm reset 進行一些清理工作。

節點執行完 join 命令後,可以在控制平面節點檢查 pod 啟動進度 watch kubectl get pods --all-namespaces -o wide,觀察新節點伺服器上的 pod 啟動狀態,正常啟動則加入成功。參照上述步驟,依次講所有工作節點加入叢集。

檢查工作節點狀態

工作節點加入集群后,隨著工作節點上相應 pod 的正常啟動,工作節點狀態會由有 NotReady 切換到 Ready,Pod 啟動需要時間,請耐心等待。所有節點正常加入集群后,可以通過命令檢視節點狀態:

kubectl get nodes

# ECHO ------
NAME              STATUS     ROLES    AGE     VERSION
vm-10-6-ubuntu   Ready      master   7h48m   v1.15.2
vm-10-7-ubuntu   Ready      <none>   7h1m    v1.15.2
vm-10-8-ubuntu    Ready      <none>   7h11m   v1.15.2
vm-10-9-ubuntu    Ready      <none>   6h50m   v1.15.2
vm-10-10-ubuntu    Ready      <none>   43s     v1.15.2

安裝 dashboard

dashboard 不會隨機群一起安裝,需要單獨部署,執行下面命令安裝:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta3/aio/deploy/recommended.yaml

這裡要注意 dashboard 的版本,並非所有版本的dashboard都能和任意版本的 k8s 叢集完全相容。引用官網對照表

Kubernetes version 1.11 1.12 1.13 1.14 1.15
Compatibility ? ? ? ?

✓ Fully supported version range.
? Due to breaking changes between Kubernetes API versions, some features might not work correctly in the Dashboard.

預設情況下,Dashboard 使用最小 RBAC 配置進行部署。目前,Dashboard 僅支援使用 Bearer Token 登入。可以按照關於建立示例使用者的指南 進行操作。

關於 dashboard 的使用,隨後會抽時間再詳細寫一篇進行介紹。

結語

現在我們已經擁有一個 4 工作節點的單控制平面 k8s 叢集,本文只是簡單介紹了部署過程,關於叢集的管理、使用還會涉及到非常多的 k8s 概念及領域知識,官網文件基本上很詳細的介紹了各類概念還有詳盡的操作演示,可以多看、多實踐。

最後,祝大家身體健康、工作順利、學有所成、萬事如意