概念
集群聯(lián)邦 Federation 的目的是實現(xiàn)單一集群統(tǒng)一管理多個kubernetes集群的機制榨为。這些集群可以是跨地域的镐依,跨云廠商的或者是用戶內部自建集群。一旦集群建立聯(lián)邦后,就可以使用集群 Federation API 來管理多個集群的 kubernetes API 資源腕侄。
目標
- 簡化管理多個聯(lián)邦集群的Kubernetes API 資源
- 在多個集群之間分散工作負載(容器),以提升應用(服務)的可靠性
- 在不同集群中脐区,能更快速更容易地遷移應用(服務)
- 跨集群的服務發(fā)現(xiàn)块促,服務可以就近訪問,以降低延遲
- 實踐多云(Multi-cloud)或混合云(Hybird Cloud)的部署
集群聯(lián)邦最初是 v1 版本淹辞,因為方案設計問題医舆,導致可擴展性比較差,已經(jīng)被廢棄象缀,目前社區(qū)提出了新的方案 Federation V2
Federation V1
從上圖架構中得知Federation v1 的設計沿用類似Kubernetes 模型蔬将,其主要組件有以下:
- federation-apiserver :提供Federation API資源,只支持部分Kubernetes API resources央星。
- federation-controller-manager :協(xié)調不同集群之間的狀態(tài)霞怀,如同步Federated資源與策略,并建立Kubernetes組件至對應集群上莉给。
- etcd :儲存Federation的狀態(tài)毙石。
該方案設計之初沒有考慮到crd的特性,支持的 Federation API 資源類型都是寫死的颓遏,無法有效的擴展徐矩,不能兼容新的api資源,不支持跨集群權限管理叁幢,如不支持RBAC滤灯。聯(lián)邦層級的設定與策略依賴API 資源的Annotations 內容,這使得彈性不佳曼玩。
Federation V2
Federation V2 是Kubernetes SIG Multi-Cluster團隊新提出的集群聯(lián)邦架構( Architecture Doc與Brainstorming Doc )鳞骤,新架構在Federation v1基礎之上,簡化擴展Federated API過程演训,并加強跨集群服務發(fā)現(xiàn)與編排的功能弟孟。
相較于V1,F(xiàn)ederation V2移除了 federation-apiserver 組件样悟,通過 crd 機制來完成 federated resource的擴充拂募,kubefed-controller 組件通過監(jiān)聽crd的變化來完成聯(lián)邦資源的同步和調度等功能。
聯(lián)邦成員注冊
集群聯(lián)邦安裝文檔 DOC窟她,集群成員注冊后陈症,會在管理集群創(chuàng)建一個 KubeFedCluster 資源來存儲集群的基本信息,如API Endpoint震糖、CA Bundle等录肯,kubefed controller 通過這些信息來訪問和管理聯(lián)邦集群成員。
聯(lián)邦化資源
Federation V2 可以聯(lián)邦化任意資源吊说,包括自定義的crd資源论咏。對集群資源聯(lián)邦化的實現(xiàn)主要是通過兩種CRD來完成优炬,分別是 FederatedTypeConfig 和 Federated<API Type> ,F(xiàn)ederatedTypeConfig定義了 Federated<API Type> 和kubernetes api資源的關聯(lián)關系厅贪。而 Federated<API Type> 用來定義怎么去聯(lián)邦化對應的kubernetes api資源蠢护。
比如我們想將 configmap 通過聯(lián)邦機制在多個集群中創(chuàng)建,則需要先在Federation Host集群中創(chuàng)建 FederatedConfigMap CRD資源养涮,然后創(chuàng)建FederatedTypeConfig 資源將 FederatedConfigMap 和 Configmap 建立關聯(lián)葵硕。
apiVersion: core.kubefed.k8s.io/v1beta1
kind: FederatedTypeConfig
metadata:
name: configmaps
namespace: kube-federation-system
spec:
federatedType:
group: types.kubefed.k8s.io
kind: FederatedConfigMap
pluralName: federatedconfigmaps
scope: Namespaced
version: v1beta1
propagation: Enabled
targetType:
kind: ConfigMap
pluralName: configmaps
scope: Namespaced
version: v1
如果要新增新的 federate type api,執(zhí)行 kubefedctl enable <kubernetes resource api type>
贯吓,如下懈凹,如果想要聯(lián)邦化新的資源crd資源 etcdclusters,則可以執(zhí)行 kubefedctl enable etcdclusters
悄谐,執(zhí)行后會自動生成新的crd聯(lián)邦資源 federatedetcdclusters介评,以及類型為 federatedtypeconfigs 的cr資源 etcdclusters.<api_group>。
$ kubefedctl enable etcdclusters
$ kubectl api-resources | grep etcd
etcdclusters etcd etcd.database.coreos.com true EtcdCluster
federatedetcdclusters fetcd types.kubefed.k8s.io true FederatedEtcdCluster
$ kubectl -n kube-federation-system get federatedtypeconfigs | grep etcd
etcdclusters.etcd.database.coreos.com 3m16s
跨集群調度
KubeFed提供了一種自動化機制來將工作負載實例分散到不同的集群中尊沸,且能夠基于總副本數(shù)與集群的定義策略來將Deployment或ReplicaSet資源進行編排威沫。編排策略是通過創(chuàng)建ReplicaSchedulingPreference(RSP),再由KubeFed RSP Controller監(jiān)聽與獲取RSP內容來將工作負載實例建立到指定的集群上洼专。
如下例子,假設有三個集群 cluser1孵构,cluser2屁商,cluser3
apiVersion: scheduling.kubefed.k8s.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: test-deployment
namespace: test-namespace
spec:
targetKind: FederatedDeployment
totalReplicas: 15
clusters:
"*":
weight: 2
maxReplicas: 12
cluster3:
minReplicas: 1
maxReplicas: 3
weight: 1
當rsp創(chuàng)建后,kubefed rsp controller 會監(jiān)聽到變化颈墅,并獲取rsp內容蜡镶,根據(jù)rsp定義的 name/namespace 找到對應的 federatedDeployment 資源,根據(jù)定義的策略計算出每個集群的副本數(shù)量恤筛,之后修改 federatedDeployment 資源的spec.overrides內官还,最好 kubefed sync cnotroller 會監(jiān)聽到 federatedDeployment 的變化,并將新的副本同步到聯(lián)邦集群中毒坛。
跨集群服務發(fā)現(xiàn)
kubefed 提供了一系列api 資源和controller來實現(xiàn)跨集群Service/Ingress的DNS records自動發(fā)現(xiàn)和生成望伦,并通過 ExternalDNS 將dns記錄同步更新到服務提供商。
apiVersion: multiclusterdns.kubefed.k8s.io/v1alpha1
kind: Domain
metadata:
name: test
namespace: kube-federation-system
domain: k8s.example.com
---
apiVersion: multiclusterdns.kubefed.k8s.io/v1alpha1
kind: ServiceDNSRecord
metadata:
name: nginx
namespace: development
spec:
domainRef: test
recordTTL: 300
假設我們已經(jīng)創(chuàng)建了一個名為nginx 的 FederatedDeployment 煎殷,并且創(chuàng)建了對應的 FederatedService 來提供 LoadBalancer屯伞。這時當創(chuàng)建以上 Domain與ServiceDNSRecord 資源后,KubeFed Service DNS Controller 會監(jiān)聽到 ServiceDNSRecord 的創(chuàng)建豪直,并收集聯(lián)邦集群成員的 Service 信息劣摇,更新到 ServiceDNSRecord 中;同時 DNS Endpoint Controller 會依據(jù) ServiceDNSRecord 的內容生成并更新 DNSEndpoint 資源弓乙,最后ExternalDNS組件收集 DNSEndpoint 信息同步到DNS服務提供商末融。
若是Ingress 的話钧惧,會由IngressDNSRecord 資源取代,并由Ingress DNS Controller 收集信息勾习。