如何安裝一個高可用K3s叢集?

k3s中文社群發表於2020-10-30

作者介紹

Janakiram MSV是Janakiram & Associates的首席分析師,也是國際資訊科技學院的兼職教師。他也是Google
Qualified
Developer、亞馬遜認證解決方案架構師、亞馬遜認證開發者、亞馬遜認證SysOps管理員和微軟認證Azure專業人員。

Janakiram是雲原生計算基金會的大使,也是首批Kubernetes認證管理員和Kubernetes認證應用開發者之一。他曾在微軟、AWS、Gigaom
Research等知名公司工作。

之前的文章中,我們已經瞭解到如何設定一個多節點的etcd叢集。在本文中,我們將利用相同的基礎架構來設定和配置一個基於K3s的高可用Kubernetes叢集。

高可用Kubernetes叢集

Kubernetes叢集的控制平面大多是是無狀態的。唯一有狀態的控制平面元件是etcd資料庫,它為整個叢集充當了唯一事實來源。API Server作為etcd資料庫的閘道器,內部和外部的使用者都可以通過它訪問和操作狀態。

etcd資料庫必須配置在HA模式下,以確保沒有單點故障。配置高可用(HA)Kubernetes叢集的拓撲有兩種選擇,這取決於如何設定etcd。

第一種拓撲是基於堆疊叢集設計的,每個節點與控制平面一起執行一個etcd例項。每個控制平面節點執行一個kube-apiserver、kube-scheduler和kube-controller-manager的例項。kube-apiserver使用負載均衡器暴露給worker節點。

每個控制平面節點建立一個本地etcd成員,並且該etcd成員僅與這一節點的kube-apiserver進行通訊。這同樣適用於本地的kube-controller-manager和kube-scheduler例項。

這種拓撲結構要求HA Kubernetes叢集至少有三種堆疊控制平面模式。Kubeadm,這個流行的叢集安裝工具,使用這種拓撲來配置Kubernetes叢集。

在這裡插入圖片描述

第二種拓撲使用在一組完全不同的主機上安裝和管理的外部etcd叢集。

在此拓撲中,每個控制平面節點都執行kube-apiserverkube-schedulerkube-controller-manager的例項,其中每個etcd主機與每個控制平面節點的kube-apiserver通訊。

在這裡插入圖片描述

這種拓撲需要的主機數量是堆疊式HA拓撲的兩倍。使用該拓撲的 HA 叢集至少需要三個控制平面節點的主機和三個 etcd 節點的主機。

關於啟動叢集的更多資訊,請參考Kubernetes官方文件:

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/

高可用模式的K3s

由於K3s大多部署在邊緣,硬體資源有限,可能無法在專用主機上執行etcd資料庫。部署架構與堆疊式拓撲極為類似,只是事先配置了etcd資料庫。

在這裡插入圖片描述

在這次教程中,我使用的是執行在Intel NUC硬體上的裸機基礎設施,其對映如下:

在這裡插入圖片描述

參考本系列教程的前一部分,在IP地址為10.0.0.60、10.0.0.61和10.0.0.62的前三個節點上安裝和配置etcd。

安裝K3s server

讓我們先在所有安裝etcd的節點中安裝伺服器。SSH進入第一個節點,並設定以下環境變數。這假定你按照前面教程中的步驟配置了etcd叢集。

export K3S_DATASTORE_ENDPOINT='https://10.0.0.60:2379,https://10.0.0.61:2379,https://10.0.0.62:2379'
export K3S_DATASTORE_CAFILE='/etc/etcd/etcd-ca.crt'
export K3S_DATASTORE_CERTFILE='/etc/etcd/server.crt'
export K3S_DATASTORE_KEYFILE='/etc/etcd/server.key'

這些環境變數指示K3s安裝程式利用現有的etcd資料庫進行狀態管理。

接下來,我們將在K3S_TOKEN中填充一個agent加入叢集時使用的token。

export K3S_TOKEN="secret_edgecluster_token"

我們準備好在第一個節點中安裝server。執行以下命令來啟動程式:

curl -sfL https://get.k3s.io | sh -

在節點2和節點3中重複這些步驟以啟動額外的server。

此時,你有一個3節點的K3s叢集,它在高可用模式下執行控制平面和etcd元件。

sudo kubectl get nodes

在這裡插入圖片描述

你可以使用以下命令檢查服務狀態:

sudo systemctl status k3s.service

在這裡插入圖片描述

安裝K3s Agent

隨著控制平面的建立和執行,我們可以輕鬆地將worker節點獲agent新增到叢集中。我們只需要確保使用與server關聯的相同token。

SSH進入其中一個worker節點並執行命令。

export K3S_TOKEN="secret_edgecluster_token"
export K3S_URL=https://10.0.0.60:6443

環境變數K3S_URL是提示安裝程式將節點配置為連線到現有伺服器的agent。

最後,執行與我們上一步相同的指令碼。

curl -sfL https://get.k3s.io | sh -

在這裡插入圖片描述

檢查是否新節點已經新增到叢集。

在這裡插入圖片描述

Congratulations!你已經成功安裝了一個高可用K3s叢集,並備份了一個外部的etcd資料庫。

驗證etcd資料庫

讓我們確保k3s叢集正在使用etcd資料庫進行狀態管理。

我們將在K3s叢集內啟動一個簡單的NGINX Pod。

sudo kubectl run nginx --image nginx --port 80
sudo kubectl get pods

在這裡插入圖片描述

Pod規範和狀態應該儲存在etcd資料庫中。讓我們嘗試通過etcdctl CLI來檢索。安裝jq工具來解析JSON輸出。

由於輸出是以base64編碼的,我們將通過base64工具對其進行解碼。

etcdctl --endpoints https://10.0.0.61:2379 \
--cert /etc/etcd/server.crt \
--cacert /etc/etcd/etcd-ca.crt \
--key /etc/etcd/server.key get /registry/pods/default/nginx \
--prefix=true -w json | jq -r .kvs[].value | base64 -d

在這裡插入圖片描述

輸出顯示 pod 在 etcd 資料庫中有一個相關的鍵和值。特殊字元沒有正確顯示,但它確實向我們展示了足夠的關於pod的資料。

在本文中,我們瞭解瞭如何在高可用模式下設定和配置K3s叢集,希望可以幫助你在邊緣端更順利地進行實踐。

相關文章