做者介紹node
Janakiram MSV是Janakiram & Associates的首席分析師,也是國際信息技術學院的兼職教師。他也是Google
Qualified
Developer、亞馬遜認證解決方案架構師、亞馬遜認證開發者、亞馬遜認證SysOps管理員和微軟認證Azure專業人員。nginxJanakiram是雲原生計算基金會的大使,也是首批Kubernetes認證管理員和Kubernetes認證應用開發者之一。他曾在微軟、AWS、Gigaom
Research等知名公司工做。數據庫
在以前的文章中,咱們已經瞭解到如何設置一個多節點的etcd集羣。在本文中,咱們將利用相同的基礎架構來設置和配置一個基於K3s的高可用Kubernetes集羣。json
Kubernetes集羣的控制平面大可能是是無狀態的。惟一有狀態的控制平面組件是etcd數據庫,它爲整個集羣充當了惟一事實來源。API Server做爲etcd數據庫的網關,內部和外部的用戶均可以經過它訪問和操做狀態。api
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集羣。curl
第二種拓撲使用在一組徹底不一樣的主機上安裝和管理的外部etcd集羣。工具
在此拓撲中,每一個控制平面節點都運行kube-apiserver,kube-scheduler和kube-controller-manager的實例,其中每一個etcd主機與每一個控制平面節點的kube-apiserver通訊。
這種拓撲須要的主機數量是堆棧式HA拓撲的兩倍。使用該拓撲的 HA 集羣至少須要三個控制平面節點的主機和三個 etcd 節點的主機。
關於啓動集羣的更多信息,請參考Kubernetes官方文檔:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
因爲K3s大多部署在邊緣,硬件資源有限,可能沒法在專用主機上運行etcd數據庫。部署架構與堆棧式拓撲極爲相似,只是事先配置了etcd數據庫。
在此次教程中,我使用的是運行在Intel NUC硬件上的裸機基礎設施,其映射以下:
參考本系列教程的前一部分,在IP地址爲10.0.0.60、10.0.0.61和10.0.0.62的前三個節點上安裝和配置etcd。
讓咱們先在全部安裝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
隨着控制平面的創建和運行,咱們能夠輕鬆地將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數據庫。
讓咱們確保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集羣,但願能夠幫助你在邊緣端更順利地進行實踐。