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

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

核心架構元件
| 元件 | 說明 |
|---|---|
| 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 多叢集管理的基本思路還是很有幫助的。

發佈留言