這應該是最適合國內用戶的 K3s HA 方案

作者介紹

王海龍,Rancher 中國社區技術經理,負責 Rancher 中國技術社區的維護和運營。擁有 6 年的雲計算領域經驗,經歷了 OpenStack 到 Kubernetes 的技術變革,無論底層操作系統 Linux,還是虛擬化 KVM 或是 Docker 容器技術都有豐富的運維和實踐經驗。

前 言

在面向生產環境的實踐中,高可用是我們無法避免的問題,K3s 本身也歷經多個版本的迭代,HA 方案也進行了不斷優化,形成了目前的比較穩定的 HA 方案。

目前官方提供兩種 HA 方案:

  1. 嵌入式 DB 的高可用(實驗)

  2. 使用外部數據庫實現高可用

嵌入式 DB 的高可用目前還是實驗性的,本文不過多介紹,請參考:

https://rancher.com/docs/k3s/latest/en/installation/ha-embedded/

使用外部數據庫實現高可用需要搭建一個高可用的外置數據庫,目前,K3s 支持 SQLite/etcd/MySQL/PostgreSQL/DQLite 等 datastore,不同的 datastore 面向不同的使用場景。

目前國內使用最多的公有云環境應該就是阿里雲了,我們可以在阿里雲上利用虛擬機搭建 K3s HA,然後對接到阿里雲的 RDS,這樣可以免去單獨維護一套數據庫的麻煩。本文選擇大家熟知的 MySQL 來做 HA 的實踐,PostgreSQL 與 MySQL 類似,本文不再贅述。

架構圖

圖片

如上圖,終端用戶訪問 SLB,SLB 將流量分別轉發到後端的兩臺 K3s master HA。兩臺 K3s master 節點連接同一個 RDS 創建的外置數據庫。

創建阿里雲實例

K3s 需要至少兩臺實例去組成 HA,所以在阿里雲上創建至少兩臺實例用作演示:

圖片

配置阿里雲 RDS

1、創建 RDS 實例,實例類型要選擇 MySQL 5.7,該版本是 K3s 官方支持的版本,其他參數根據自身需求設置即可。

圖片

2、設置白名單,白名單的內容設置爲你的 K3s 實例的內網 IP 即可。設置成功後,我們將得到一個內網地址用作數據庫連接:rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com

圖片

圖片

3、創建賬號,使用普通賬號(ksd)即可

4、創建數據庫,設置數據庫名稱(k3s),授權賬號(ksd)

之前在使用 docker 啓動的 mysql 時,不需要提前創建數據庫,因爲啓動 k3s 的時候會自動創建。但在阿里雲 RDS 上,必須先在 UI 上創建 K3s 所需的數據庫。

圖片

5、修改數據庫參數

我們需要把數據參數 innodb_large_prefix 設置爲 ON,否則啓動 K3s 的時候會報錯:

Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Service hold-off time over, scheduling restart.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Scheduled restart job, restart counter is at 11.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: Stopped Lightweight Kubernetes.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: Starting Lightweight Kubernetes...
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ k3s[24934]: time="2020-07-29T20:08:07.145963348+08:00" level=info msg="Starting k3s v1.18.6+k3s1 (6f56fa1d)"
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ k3s[24934]: time="2020-07-29T20:08:07.159363656+08:00" level=fatal msg="starting kubernetes: preparing server: creating storage endpoint: building kine: Error 1071: Specified key was too long; max key length is 767 bytes"
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Failed with result 'exit-code'.
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: Failed to start Lightweight Kubernetes.

將 innodb_large_prefix 修改爲 ON 之後,點擊右上角【提交參數】即可完成修改。

圖片

以上步驟操作成功後,K3s 要求的外置數據庫就已經準備完成,下面我們來啓動 K3s HA。

實現 K3s HA

在 k3s-master-1 和 k3s-master-2 上執行相同的命令:

curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh |  \
  INSTALL_K3S_MIRROR=cn \
  K3S_DATASTORE_ENDPOINT='mysql://ksd:your_password@tcp(rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com:3306)/k3s' \
  sh -s - server

稍等片刻,一個 K3s HA 的環境就已經啓動完成了:

如果在阿里雲上 pull K3s 的鏡像比較慢的話,可以配置 mirror 或者 從 http://mirror.cnrancher.com 下載對應版本的離線包,然後參考下面鏈接導入鏡像:https://rancher.com/docs/k3s/latest/en/installation/airgap/#prepare-the-images-directory-and-k3s-binary

root@k3s-master-2:~# kubectl get pods -A -o wide
NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE   IP          NODE           NOMINATED NODE   READINESS GATES
kube-system   local-path-provisioner-6d59f47c7-tshfx   1/1     Running     0          16m   10.42.0.5   k3s-master-1   <none>           <none>
kube-system   metrics-server-7566d596c8-mrc94          1/1     Running     0          16m   10.42.0.2   k3s-master-1   <none>           <none>
kube-system   coredns-8655855d6-sxn7v                  1/1     Running     0          16m   10.42.0.4   k3s-master-1   <none>           <none>
kube-system   helm-install-traefik-cmmsr               0/1     Completed   2          16m   10.42.0.3   k3s-master-1   <none>           <none>
kube-system   svclb-traefik-z6vlb                      2/2     Running     0          11m   10.42.0.6   k3s-master-1   <none>           <none>
kube-system   svclb-traefik-f89x6                      2/2     Running     0          11m   10.42.1.2   k3s-master-2   <none>           <none>
kube-system   traefik-758cd5fc85-chnbc                 1/1     Running     0          11m   10.42.1.3   k3s-master-2   <none>           <none>
root@k3s-master-2:~#
root@k3s-master-2:~# kubectl get node -o wide
NAME           STATUS   ROLES    AGE   VERSION        INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
k3s-master-1   Ready    master   16m   v1.18.6+k3s1   172.17.207.15   <none>        Ubuntu 18.04.4 LTS   4.15.0-106-generic   containerd://1.3.3-k3s2
k3s-master-2   Ready    master   16m   v1.18.6+k3s1   172.17.207.16   <none>        Ubuntu 18.04.4 LTS   4.15.0-106-generic   containerd://1.3.3-k3s2

通過阿里雲 SLB 提供統一訪問入口

現在我們已經擁有了高可用的 MySQL 和 K3s,但現在還缺一個爲多個 K3s server 提供一個統一的訪問入口,這可以使用以下方式實現:

  1. L4 層負載均衡器

  2. Round-robin DNS

  3. VIP 或者彈性 IP

所以,我們可以直接使用阿里雲的 SLB 做 L4 層負載均衡,將 6443 端口轉發到後端的兩臺 K3s master。

圖片

接下來,我們可以把 k3s master 節點的 /etc/rancher/k3s/k3s.yaml 複製到本地的~/.kube/config 目錄,然後將 server 地址修改爲 server: https://39.106.185.201:6443(SLB 的公網 IP)

然後可以通過 kubectl get nodes 測試下是否可以通過 SLB 將流量轉發到 K3s master:

ksd@Hailong-MacBook-Pro  ~  kubectl get nodes
Unable to connect to the server: x509: certificate is valid for 10.43.0.1, 127.0.0.1, 172.17.207.15, 172.17.207.16, not 39.106.185.201

這個錯誤是因爲 K3s mster 啓動時自動創建的證書不信任 39.106.185.201 這個 SLB 的公網 IP,爲了解決這個問題,可以更新 K3s master,添加參數 --tls-san 39.106.185.201:

curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh |  \
  INSTALL_K3S_MIRROR=cn \
  K3S_DATASTORE_ENDPOINT='mysql://ksd:your_password@tcp(rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com:3306)/k3s' \
  sh -s - server \
  --tls-san 39.106.185.201

最後,再回到本地機器上,再次執行 kubectl get nodes,不出意外的話,就應該可以獲取到節點信息了。

ksd@Hailong-MacBook-Pro  ~  kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
k3s-master-2   Ready    master   65m   v1.18.6+k3s1
k3s-master-1   Ready    master   65m   v1.18.6+k3s1

後  記

本文只介紹瞭如何藉助阿里雲的 SLB、RDS 來實現 K3s 的 HA,其他公有云的操作基本大同小異,雖然沒做過詳細的測試,但理論上應該都是支持的。如果是非公有云環境,可以根據自身的需求選擇適合的 datastore 以及對應的 HA 方式。

About k3s

k3s 是目前全球用戶量最大的 CNCF 認證輕量級 K8S 發行版。自 2019 年 3 月發佈以來,備受全球開發者們關注。至今,GitHub Stars 數已超過 13,000,成爲了開源社區最受歡迎的邊緣計算 K8S 解決方案。

k3s 專爲在資源有限的環境中運行 Kubernetes 的研發和運維人員設計,將滿足日益增長的在邊緣計算環境中運行在 x86、ARM64 和 ARMv7 處理器上的小型、易於管理的 Kubernetes 集羣需求。k3s 的發佈,爲開發者們提供了以 “Rancher 2.X + k3s” 爲核心的從數據中心到雲到邊到端的 K8S 即服務(Kubernetes-as-a-Service),推動 Kubernetes Everywhere。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/0Wk2MzfWqMqt8DfUK_2ICA