如何使用 K8s 實現跨集羣管理,這篇文章告訴你了!趕緊收藏

語言: CN / TW / HK

一、背景

集羣聯邦(Federation)的目的是實現單一集羣統一管理多個Kubernetes集羣的機制,這些集羣可能是跨地區(Region),也可能是在不同公有云供應商上,或者是公司內部自行建立的集羣。

一但集羣進行聯邦後,就可以利用 Federation API資源來統一管理多個集羣的Kubernetes API資源,如定義Deployment如何部署到不同集羣上,其集羣所需的副本數等。

通過集羣聯邦,我們可以:

  • 簡化管理多個集羣的Kubernetes 組件,如Deployment, Service 等

  • 在多個集羣之間分散工作負載,以提升應用的可靠性

  • 跨集羣的資源編排,依據編排策略在多個集羣進行應用部署

  • 在不同集羣中,能更快速更容易地遷移應用

  • 跨集羣的服務發現,服務可以實現地理位置感知,以降低延遲(不一定必須用kubefed實現)

  • 實踐多雲(Multi-cloud)或混合雲(Hybird Cloud)的部署

使用場景

  • 跨集羣同步資源:正如您所料,同步資源是那些部署聯合或分佈式Kubernetes集羣的人面臨的核心挑戰。Kubernetes中的機制可以自動同步運行在本地或遠程系統,雲而非雲上的多個集羣上的部署。

  • 跨集羣服務發現:這解決了自動配置DNS服務器和負載均衡器的功能。

這篇文章主要記錄跨集羣資源同步的內容,跨集羣服務發現的開新的文章記錄。

二、安裝

Federation v2 的安裝分兩個部分,一是 Controller Plan 和 kubefedctl。其中 Controller Plan是基於 helm 安裝的,所以我們先安裝helm。

helm 安裝

可自行查找文檔安裝。

Controller Plan

Controller Plan 可以使用 Helm 部署(目前 Helm 還是使用 v2 版本),參考官方安裝文檔:https://github.com/kubernetes-sigs/kubefed/blob/master/charts/kubefed/README.md

添加源

$ helm repo add kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts

搜索

$ helm search repo kubefed

安裝

$ helm --namespace kube-federation-system upgrade -i kubefed kubefed-charts/kubefed --version=0.6.1 --create-namespace


Release "kubefed" does not exist. Installing it now.
NAME: kubefed
LAST DEPLOYED: Wed Aug 5 16:03:46 2020
NAMESPACE: kube-federation-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

kubefedctl

kubefedctl 是一個二進制程序,可以在 Github 的 Release 頁面找到最新版本的下載地址:https://github.com/kubernetes-sigs/kubefed/releases

$ wget https://github.com/kubernetes-sigs/kubefed/releases/download/v0.6.1/kubefedctl-0.6.1-linux-amd64.tgz
$ tar -zxvf kubefedctl-0.6.1-linux-amd64.tgz
$ mv kubefedctl /usr/local/bin/

三、集羣操作

在主集羣上設置從集羣context信息

參考我先前的文章 《kubernetes switch context》

kubectl config get-contexts
kubectl config use-context n1
kubectl config use-context context-cluster1-admin

從集羣加入主集羣

基本使用方式為:

kubefedctl join <集羣名稱CLUSTER> --cluster-context <要接入集羣的 context NAME> --host-cluster-context <HOST 集羣的 context name>

例如:

kubefedctl join n1 --cluster-context n1 --host-cluster-context context-cluster1-admin --v=2
kubefedctl join n2 --cluster-context n2 --host-cluster-context context-cluster1-admin --v=2

從集羣解綁

kubefedctl unjoin n2 --cluster-context n2 --host-cluster-context context-cluster1-admin --v=2

獲得集羣信息

Kubefed 是利用 CRD 來存儲自己所需要的數據,因此當使用 kubefedctl join 後,可以在 host cluster 查看到集羣信息:

$ kubectl -n kube-federation-system get kubefedclusters

kubefedctl join 命令只是將 Kubeconfig 裏的配置轉化為 KubeFedCluster 自定義資源存儲到 kube-federation-system 命名空間中。

kubectl -n kube-federation-system get kubefedclusters -oyaml n1

四、跨集羣同步資源

啟用資源聯邦化

對於 KubeFed 來説,資源管理分兩類,一是資源的類型管理,另一個是被聯邦(federated)的資源管理。

對於資源類型,kubefedctl 提供了 enable 來使新的資源可以被聯邦管理:

kubefedctl enable <target kubernetes API type>

其中可以使用以下的描述:

  • 類型,即 Kind (比如 Deployment)

  • 複數名詞 (比如 deployments)

  • 帶 api group 的複數資源名詞 (比如 deployment.apps)

  • 縮寫 (比如 deploy)

因為 Kubefed 是通過 CRD 管理資源,因此,當 enable 執行之後可以看到 Host Cluster 中新增了一種名為 federatedvirtualservices 的 CRD:

$ kubectl get crd | grep federated

默認已啟用的聯邦資源:

也可以對自定義CRD資源啟用聯邦。kubefedctl enable 完成了資源類型的管理,對於需要被聯邦的資源管理編輯基於新創建的 CRD 展開的。

不過要部署資源之前,需要先創建 federatednamespaces ,多集羣的資源只會部署到被 kubefed 管理的 namespace 中。

資源操作示例

使用官方的demo,可以快速體驗示例:https://github.com/kubernetes-sigs/kubefed/tree/master/example/sample1

創建ns

kubectl apply -f example/sample1/namespace.yaml -f example/sample1/federatednamespace.yaml

創建測試資源

kubectl apply -R -f example/sample1

注意,官方特地留了一個資源讓我們手動enable,運行上面命令後會出現如下提示:

unable to recognize "example/sample1/federated<type>.yaml": no matches for kind "Federated<type>" in version "types.kubefed.io/v1beta1",

需要對ClusterRoleBinding 類型啟用聯邦化。

kubefedctl enable ClusterRoleBinding
kubectl apply -R -f example/sample1

最後在n1 n2集羣上運行結果如下:

確認正常運行:

常用命令備忘

helm list --all-namespaces


// 安裝集羣
helm --namespace kube-federation-system-666 upgrade -i kubefed kubefed --version=0.3.0 --create-namespace
kubefedctl join <cluster name> --cluster-context <context name> --host-cluster-context <context name> --v=2


// context
kubectl config get-contexts
kubectl config use-context n1
kubectl config use-context context-cluster1-admin


// get cluster
kubectl -n kube-federation-system get kubefedclusters // 獲得集羣信息
kubectl api-resources | grep kubefed // 查看集羣得api信息


$ helm --namespace kube-federation-system upgrade -i kubefed kubefed-charts/kubefed --version=0.6.1 --create-namespace


kubefedctl unjoin n1 --cluster-context n1 --host-cluster-context m1 --v=2
kubectl config get-contexts


// 卸載集羣
kubectl -n kube-federation-system delete FederatedTypeConfig --all
helm --namespace kube-federation-system uninstall kubefed

來源:https://blog.kelu.org/tech/2021/02/19/kubefed.html

還不過癮?XOps 風向標!GOPS 2022 · 上海站正式來襲!GOPS 全球運維大會 2022 · 上海站正在努力進行中,歡迎長按下方二維碼,瞭解更 多!

掃碼更精彩 :arrow_double_down:

近期好文:

第二曲線中的隱藏變量,中國電信“騰雲記”

“高效運維”公眾號誠邀廣大技術人員投稿

投稿郵箱:[email protected],或添加聯繫人微信:greatops1118.

點個“在看”,一年不宕