← 返回上一頁
Kubernetes

使用 KubeFed 實現 Kubernetes 多叢集聯邦部署實戰

本頁目錄
KubeFed Kubernetes Federation 多集群管理架構概念圖

前言

在實際營運中,隨著業務規模不斷擴大,單一 Kubernetes 叢集往往難以滿足高可用與異地容災的需求。Kubernetes Federation v2(簡稱 KubeFed)正是官方推出的多叢集管理方案,讓我們能透過一個統一的控制平面,同時管理與協調散佈在不同區域的多套 Kubernetes 叢集。這篇文章我會分享自己部署 KubeFed 的實戰經驗,以及在過程中踩過的一些坑。

KubeFed Kubernetes Federation 多集群管理架構概念圖


KubeFed 是什麼?能解決哪些問題?

簡單來說,KubeFed 就是把多個 Kubernetes 叢集「聯邦化」,讓它們看起來像一個超級大集群。這樣一來,我們就不需要逐一登入不同叢集去手動操作,而是從一個入口統一管理所有資源。

KubeFed 多集群聯邦拓撲架構圖

核心架構元件

元件 說明
Federated API Server 提供統一的 API 介面,管理所有加入聯邦的叢集資源
Federated Controller Manager 負責根據使用者定義的策略,將資源分發並調度到各個成員叢集
Federated Custom Resources 包含 FederatedDeployment、FederatedService 等 CRD,用來定義跨叢集的資源

KubeFed 的主要優勢

優勢 說明
跨叢集資源管理 Deployment、Service、ConfigMap 等資源一次定義、多叢集部署
集中化控制 單一控制平面管理所有叢集,大幅降低維運複雜度
資源調度與負載均衡 根據實際負載在多個叢集間動態分配工作負載
可擴充性 支援自訂控制器與自訂資源,依需求彈性擴展

實際可達成的效果

功能 描述
統一資源管理 跨叢集的資源可從單一入口進行 CRUD 操作
跨叢集 Service Discovery 支援跨叢集的服務發現與負載均衡
跨叢集調度 實現工作負載在多叢集之間的自動協調
資料備份與容災 跨叢集備份提升資料可靠性與容錯能力

總結來說,KubeFed 對於需要多叢集管理的團隊來說是一個相當實用的工具,能有效簡化跨叢集的維運流程。

部署安裝實戰

接下來是實際的安裝步驟,我會盡量把每個環節寫清楚,方便大家照著做。

步驟一:加入 Helm Repo 並拉取 Chart

專案位址:https://github.com/kubernetes-sigs/kubefed

# 加入 kubefed 的 helm repo
helm repo add kubefed https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts

# 更新 repo
helm repo update

# 搜尋可用的 chart
helm search repo kubefed
# NAME             CHART VERSION  APP VERSION  DESCRIPTION
# kubefed/kubefed  0.9.1                       KubeFed helm chart

步驟二:建立 Namespace 並安裝 KubeFed

# 建立命名空間
kubectl create ns kube-federation-system

# 安裝 kubefed
helm upgrade -i kubefed kubefed/kubefed --version=0.9.1 --namespace kube-federation-system

安裝完成後,確認 Pod 是否正常運行:

kubectl get pods -n kube-federation-system
# NAME                                          READY   STATUS    RESTARTS   AGE
# kubefed-admission-webhook-67fdf854db-bdw4r    1/1     Running   0          2m19s
# kubefed-controller-manager-74c5c5846d-2ddcj   1/1     Running   0          62s
# kubefed-controller-manager-74c5c5846d-dbq7s   1/1     Running   0          63s

步驟三:安裝 kubefedctl 命令列工具

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

步驟四:合併 kubeconfig 並加入叢集

這一步很關鍵,需要把所有要加入聯邦的叢集設定檔整合在一起:

# 合併多個 kubeconfig
KUBECONFIG=config1:config2 kubectl config view --flatten > $HOME/.kube/config

# 確認所有 context 已正確載入
kubectl config get-contexts

如果需要取得叢集的 user token,可以用以下指令:

kubectl describe secret -n kube-system \
  $(kubectl get secret -n kube-system | awk '/clusterrole-aggregation-controller-token/ {print $1}') \
  | awk '/^token:/{print $2}'

步驟五:用 kubefedctl 加入成員叢集

# 語法
kubefedctl join <叢集名稱> \
  --cluster-context <要加入叢集的 context 名稱> \
  --host-cluster-context <Host 叢集的 context 名稱> \
  --v=2

# 範例:加入兩個叢集
kubefedctl join kubernetes-admin@kubernetes \
  --cluster-context kubernetes-admin@kubernetes \
  --host-cluster-context kubernetes-admin@kubernetes --v=2

kubefedctl join zzak8s \
  --cluster-context zzak8s \
  --host-cluster-context zzak8s --v=2

驗證叢集加入狀態:

kubectl get kubefedclusters -n kube-federation-system
# NAME      AGE   READY
# ksphere   15m   True
# kube      30m   True

看到 READY 都是 True 就代表加入成功了。

實測:跨叢集部署 Deployment

環境就緒後,來實際測試一下跨叢集部署的效果。

建立 FederatedNamespace

注意:需要先在所有成員叢集中手動建立對應的 Namespace。

apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
  name: test-namespace
  namespace: test-namespace
spec:
  placement:
    clusters:
    - name: kube
    - name: ksphere

建立 FederatedDeployment

apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: test-deployment
  namespace: test-namespace
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
  placement:
    clusters:
    - name: kube
    - name: ksphere

驗證部署結果

分別在兩個叢集中查看 Pod 狀態:

# 叢集一
kubectl get pod -n test-namespace
# NAME                               READY   STATUS    RESTARTS   AGE
# test-deployment-7b4f94bb64-5d6rz   1/1     Running   0          4m36s
# test-deployment-7b4f94bb64-bbgr8   1/1     Running   0          4m36s
# test-deployment-7b4f94bb64-hj7nr   1/1     Running   0          4m36s

# 叢集二
kubectl --context=ksphere-admin@ksphere get pod -n test-namespace
# NAME                               READY   STATUS    RESTARTS   AGE
# test-deployment-69bddffb77-c9lxd   1/1     Running   0          5m21s
# test-deployment-69bddffb77-d8qqw   1/1     Running   0          5m21s
# test-deployment-69bddffb77-kv2p6   1/1     Running   0          5m21s

兩個叢集都成功跑起了 3 個 Pod,跨叢集部署驗證成功!

總結

KubeFed 在多叢集管理的場景下確實提供了不少便利,特別是需要跨區域部署或做容災備援的時候。不過要注意的是,KubeFed 目前已被官方歸檔(archived),社群正在推動更新一代的多叢集方案。如果是全新專案,也可以考慮評估 Karmada、Open Cluster Management 等替代方案。但理解 KubeFed 的概念與架構,對於掌握 Kubernetes 多叢集管理的基本思路還是很有幫助的。

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料