1. 程式人生 > 其它 >Addon SuperEdge 讓原生 K8s 叢集可管理邊緣應用和節點

Addon SuperEdge 讓原生 K8s 叢集可管理邊緣應用和節點

作者

樑豪,騰訊TEG工程師,雲原生開源愛好者,SuperEdge 開發者,現負責TKEX-TEG容器平臺運維相關工作。

王冬,騰訊雲TKE後臺研發工程師,專注容器雲原生領域,SuperEdge 核心開發人員,現負責騰訊雲邊緣容器TKE Edge私有化相關工作。

李騰飛,騰訊容器技術研發工程師,騰訊雲TKE後臺研發,SuperEdge核心開發成員。

Addon SuperEdge讓原生K8s叢集可管理邊緣應用和節點視訊連結

邊緣能力

先說說 Addon SuperEdge 後,您的普通 Kubernetes 叢集將具備哪些能力:

既能管理中心應用和節點,也能管理邊緣應用和節點

可以用一個Kubernetes叢集管理中心的應用和節點,也可以同時管理邊緣的應用和節點,使用上沒有任何區別

。此設計將Kubernetes分散式的邏輯概念和實際IDC機房的物理位置完美契合,實現真正意義的雲邊一朵雲。

能Join任意位置的節點

只要節點能訪問到kube-apiserver,無論節點位於哪裡,或以怎麼的狀存在,一個edgeadm join命令就能將節點加入到中心叢集。用一個Kubernetes叢集就可以統一管理各個地方的機器,匯聚各個IDC機房的算力,將機器的利用率發揮到極致

同時管理數十個邊緣網點,並具備灰度能力

SuperEdge 的 ServiceGroup 設計,一個應用只要提交一次,就能同時部署到數十個網點,並且在各個網點內實現流量閉環,而且允許各個網點在基礎應用的基礎上有差異,無論灰度,還是差異化配置都可以支援。

邊緣節點具備邊緣自治能力

邊緣節點和 kube-apiserver 之間網路情況不可預測,可能是專線,也可能是WIFI,公網和內網可能都存在。SuperEdge 讓邊緣節點即使雲邊斷網也不影響邊緣的服務,就是斷電重啟,邊緣服務也能被正常拉起。

Addon SuperEdge的邊緣能力

安裝條件

  • 使用者已有 Kubernetes 叢集,所有 kube-controller-manager 已開啟
--controllers=*,bootstrapsigner,tokencleaner

引數

  • 目前僅支援通過 kubeadm 搭建的 Kubernetes 叢集,其他方式搭建的 Kubernetes 叢集並不是不支援,而是可能會有相容性問題,可看原理部分;

  • 要是沒有 kubeadm 搭建的 Kubernetes 叢集,可用edgeadm init一鍵建立一個原生的Kubernetes 叢集,可參考: 用edgeadm一鍵建立邊緣k8s叢集或原生k8s叢集;

  • 支援的 Kubernetes 版本:v1.16~v1.19,edgeadm 提供的安裝包是 Kubernetes v1.18.2 版本;

    • 使用者需要考慮邊緣節點kubelet和原始 Kubernetes 版本的相容性,統一最好;
    • 其他 Kubernetes 版本可參考 一鍵安裝邊緣Kubernetes叢集中的 5. 自定義 Kubernetes 靜態安裝包,自行製作。

下載 edgeadm 靜態安裝包

在任意一個 Master 節點上下載 edgeadm 靜態安裝包,並拷貝到準備加入叢集的邊緣節點中。

arch=amd64 version=v0.4.0 && rm -rf edgeadm-linux-* && wget https://superedge-1253687700.cos.ap-guangzhou.myqcloud.com/$version/$arch/edgeadm-linux-$arch-$version.tgz && tar -xzvf edgeadm-linux-* && cd edgeadm-linux-$arch-$version && ./edgeadm

目前支援目前支援 [[amd64, arm64], 兩個體系,下載自己機器對應的體系結構, 其他體系可自行編譯edgeadm和製作相應體系安裝包,具體可參考 一鍵安裝邊緣 Kubernetes 叢集中的5. 自定義Kubernetes靜態安裝包

Addon SuperEdge

在原有叢集任意一個 Master 節點上 addon 邊緣能力元件

./edgeadm addon edge-apps --ca.cert <叢集 CA 證書地址> --ca.key <叢集的 CA 證書金鑰路徑> --master-public-addr <Master節點外網IP/Master節點內網IP/域名>:<Port>

其中:

  • --ca.cert: 叢集的 CA 證書路徑,預設 /etc/kubernetes/pki/ca.crt
  • --ca.key: 叢集的 CA 證書金鑰路徑,預設 /etc/kubernetes/pki/ca.key
  • --master-public-addr:是邊緣節點訪問 kube-apiserver服務的地址,預設為 <Master節點內網IP>:<埠>

如果edgeadm addon edge-apps過程沒有問題,終端會輸出印如下日誌:

...
I0606 12:52:51.976165   26593 deploy_tunnel.go:35] Deploy tunnel-coredns.yaml success!
Create tunnel-cloud.yaml success!

執行過程中如果出現問題會直接返回相應的錯誤資訊,並中斷邊緣元件的安裝,可使用./edgeadm detach命令解除安裝邊緣元件恢復叢集。

./edgeadm detach edge-apps --ca.cert <叢集 CA 證書地址> --ca.key <叢集的 CA 證書金鑰路徑>

到此原有的 Kubernetes 叢集就變成了一個既能管理雲端應用,也能下發和管理邊緣應用的 Kubernetes。

Join邊緣節點

安裝條件

邊緣節點遵循 kubeadm 的最低要求 ,最低2C2G,磁碟空間不小於1G;

⚠️注意:儘可能提供乾淨的機器,避免其他因素引起安裝錯誤。要有機器上有容器服務在安裝過程中可能會被清理,請在執行之前細心確認

建立 Join 邊緣節點的 token

邊緣能力元件 addon 成功後,Join 邊緣節點和 kubeadm 的用法類似,可執行以下命令獲取:

./edgeadm token create --print-join-command 

如果執行過程中沒有問題,終端會輸出 Join 的命令

...
edgeadm join <Master節點內網IP>:Port --token xxxx \
     --discovery-token-ca-cert-hash sha256:xxxxxxxxxx 

提示:建立 token 的有效期和 kubeadm 一樣是24h,過期之後可再次執行上述命令獲取Join 命令;

邊緣節點加入原有叢集

在邊緣節點上下載 2.<2>.中的 edgeadm 靜態安裝包,或者通過其他方式把 edgeadm 靜態安裝包上傳到邊緣節點,然後在邊緣節點上執行3.<2>得到的 Join 命令:

./edgeadm join <Master 節點外網 IP/Master 節點內網IP/域名>:Port 
     --token xxxx \
     --discovery-token-ca-cert-hash sha256:xxxxxxxxxx 
     --install-pkg-path <edgeadm Kube-*靜態安裝包地址/FTP路徑> 

注意:可以把edgeadm create token --print-join-command列印的 join 提示命令kube-apiserver的服務地址,視情況換成Master節點外網IP/Master節點內網IP/域名,主要取決於想讓邊緣節點通過外網還是內網訪問 kube-apiserver 服務,預設輸出的 Master 節點內網 IP。

其中:

  • --install-pkg-path: Kubernetes 靜態安裝包的路徑;
  • <Master節點外網IP/Master節點內網IP/域名>:Port 是邊緣節點訪問 kube-apiserver 服務的地址

要是執行過程中沒有問題,新的 Node 成功加入叢集,會輸出如下內容:

This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

執行過程中如果出現問題會直接返回相應的錯誤資訊,並中斷節點的新增,可使用./edgeadm reset命令回滾加入節點的操作,重新 Join。

提示:邊緣節點 join 成功後都會被打上標籤: superedge.io/edge-node=enable,方便後續應用通過 nodeSelector 選擇應用排程到邊緣節點;

以上操作如有問題,可以加入到SuperEdge的SlackGoogle論壇微信群和我們進行交流,也可在社群提Issues給我們反饋。

實現原理

主要步驟

其實Addon SuperEdge 實現的原理很簡單,主要分為兩步:

  • 第一步:Addon SuperEdge 的邊緣能力元件;
  • 第二步:準備邊緣節點 Join 進原生 Kubernetes 叢集所需要的配置;

第一步沒有什麼可細說的,就是把邊緣能力元件以 Addon 的方式部署進原生的 Kubernetes 叢集,使用者也可以很方便的用edgeadm detach把 SuperEdge 邊緣能力元件解除安裝掉。

關鍵是第二步:把邊緣節點 Join 進原生的 Kubernetes 叢集,面對的問題如下:

1. kube-apiserver 證書處理

原生 Kubernetes 叢集的 Kube-apiserver 服務端證書也許並沒有簽訂外網IP或者外網的訪問的域名,那麼邊緣節點如何以公網IP訪問 Kube-apiserver?

2. 使用者的 Kubernetes 叢集不是 Kubeadm 搭建的

要是使用者的 Kubernetes 叢集不是 Kubeadm 搭建的,根本沒有 kubeadm-config、kubelet-config、cluster-info 等等的配置資訊,那麼又如何把邊緣節點 Join 進去?

3. 使用者的 Kubernetes 叢集是 kubeadm 搭建的

要是使用者的 Kubernetes 叢集是 kubeadm 搭建的,邊緣節點如何以公網 Join 進使用者的 Kubernetes,如何保證對使用者原 Join 普通節點不受影響?
……

所以說實現 Addon Superedge 核心不在 Addon SuperEdge 的邊緣能力元件,而是如何把邊緣節點 Join 進使用者原先的 Kubernetes 叢集,又不對使用者的 Kubernetes 叢集有什麼影響。

設計實踐

整體的實現思路是為使用者任何方式搭建的 Kubernetes 叢集準備好 Kubeadm 方式Join節點的配置,然後把邊緣節點像 Kubeadm join 一樣 Join 進去

1. kube-apiserver 證書處理

對 kube-apiserver 我們並沒有更換使用者原 Kubernetes 叢集證書和重啟 kube-apiserver,那麼我們是如何實現讓邊緣節點通過公網新增進使用者的 Kubernetes 叢集的?
答案是通過寫邊緣節點 hosts。一般 Kubernetes 叢集的 kube-apiserver 都會籤如下幾個地址:

kuberneteskubernetes.defaultkubernetes.default.svckubernetes.default.svc.cluster.local

在使用者執行 Join 命令的時候:

./edgeadm join<Master節點外網 IP/Master 節點內網IP/域名>:Port ...

我們給邊緣節點了句hosts:

Master 節點外網IP/Master節點內網 IP kubernetes.default

然後邊緣節點訪問雲端 kube-apiserver 都是通過kubernetes.default:Port, 既繞過了 kube-apiserver 證書沒有籤公網IP的問題,也成功把邊緣 Join 到了使用者的 Kubernetes 叢集。對於域名,我們不會寫 hosts, 所以使用者需要注意給定的域名是否在 Kube-apiserver 的證書中已經簽定了。
要是使用者的 Kube-apiserver 證書中沒有簽訂kubernetes.default怎麼辦?

那使用者 Join 邊緣節點的時候就不能給IP了,只能用域名,需要保證給定的域名自己 kubernetes 的 kube-apiserver 證書已經簽訂了該地址,並且邊緣節點能夠訪問到。

2. 使用者的 Kubernetes 叢集不是 Kubeadm 搭建的

處理辦法是不是Kubeadm搭建的就把他變成Kubeadm搭建的, 只要把 kubeadm join 需要的資訊備全,那麼就可以通過類似 kubeadm join 的方式將邊緣節點加入叢集。具體實現是在執行edgeadm addon edge-apps安裝部署邊緣元件的階段把 edgeadm join 邊緣節點的條件準備好,典型的有如下條件:

  • 建立 kube-public 名稱空間以及該名稱空間下 cluster-info的 ConfigMap
  • 建立存在 kube-system 名稱空間下的 kubeadm-config 和 kubelet-config 的 ConfigMap
  • 建立邊緣節點加入叢集時 kubelet 訪問上述 ConfigMap 和叢集其它資源所需要的 RBAC 許可權

3. 使用者的 Kubernetes 叢集是 kubeadm 搭建的

我們在執行edgeadm addon edge-apps會對需要新增的 ConfigMap 進行檢測,要是使用者的叢集資訊已經存在就不在新增,直接使用者的。
要是使用者 kubeadm 搭建的叢集資訊,比如 cluster-info 的 ConfigMap,不夠我們用,我們自己會生成一個新的避免更改和覆蓋使用者原來的。

叢集經過了上述配置,邊緣節點就可以使用edgeadm join命令加入叢集,其他更詳細的處理請檢視原始碼edgeadm addon edge-apps的詳細處理。

合作和開源

TKE Edge 邊緣容器管理服務的邊緣計算能力核心元件已經開源到 SuperEdge 專案,歡迎共建邊緣計算,參與SuperEdge 開源專案的建設,讓您開發的邊緣能力惠及更多人。以下是 SuperEdge 開源專案的微信群,歡迎參與交流討論。

SuperEdge版本:
TKE Edge相關文章:
落地案例相關資料: