kubernetes集群聯邦


概念

集群聯邦 Federation 的目的是實現單一集群統一管理多個kubernetes集群的機制。這些集群可以是跨地域的,跨雲廠商的或者是用戶內部自建集群。一旦集群建立聯邦后,就可以使用集群 Federation API 來管理多個集群的 kubernetes API 資源。

目標

  • 簡化管理多個聯邦集群的Kubernetes API 資源
  • 在多個集群之間分散工作負載(容器),以提升應用(服務)的可靠性
  • 在不同集群中,能更快速更容易地遷移應用(服務)
  • 跨集群的服務發現,服務可以就近訪問,以降低延遲
  • 實踐多雲(Multi-cloud)或混合雲(Hybird Cloud)的部署

集群聯邦最初是 v1 版本,因為方案設計問題,導致可擴展性比較差,已經被廢棄,目前社區提出了新的方案 Federation V2

Federation V1


從上圖架構中得知Federation v1 的設計沿用類似Kubernetes 模型,其主要組件有以下:

  • federation-apiserver :提供Federation API資源,只支持部分Kubernetes API resources。
  • federation-controller-manager :協調不同集群之間的狀態,如同步Federated資源與策略,並建立Kubernetes組件至對應集群上。
  • etcd :儲存Federation的狀態。

該方案設計之初沒有考慮到crd的特性,支持的 Federation API 資源類型都是寫死的,無法有效的擴展,不能兼容新的api資源,不支持跨集群權限管理,如不支持RBAC。聯邦層級的設定與策略依賴API 資源的Annotations 內容,這使得彈性不佳。

Federation V2

Federation V2 是Kubernetes SIG Multi-Cluster團隊新提出的集群聯邦架構( Architecture Doc與Brainstorming Doc ),新架構在Federation v1基礎之上,簡化擴展Federated API過程,並加強跨集群服務發現與編排的功能。

相較於V1,Federation V2移除了 federation-apiserver 組件,通過 crd 機制來完成 federated resource的擴充,kubefed-controller 組件通過監聽crd的變化來完成聯邦資源的同步和調度等功能。

聯邦成員注冊

集群聯邦安裝文檔 DOC,集群成員注冊后,會在管理集群創建一個 KubeFedCluster 資源來存儲集群的基本信息,如API Endpoint、CA Bundle等,kubefed controller 通過這些信息來訪問和管理聯邦集群成員。

聯邦化資源

Federation V2 可以聯邦化任意資源,包括自定義的crd資源。對集群資源聯邦化的實現主要是通過兩種CRD來完成,分別是 FederatedTypeConfig 和 Federated<API Type> ,FederatedTypeConfig定義了 Federated<API Type> 和kubernetes api資源的關聯關系。而 Federated<API Type> 用來定義怎么去聯邦化對應的kubernetes api資源。

比如我們想將 configmap 通過聯邦機制在多個集群中創建,則需要先在Federation Host集群中創建 FederatedConfigMap CRD資源,然后創建FederatedTypeConfig 資源將 FederatedConfigMap 和 Configmap 建立關聯。

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,執行 kubefedctl enable <kubernetes resource api type> ,如下,如果想要聯邦化新的資源crd資源 etcdclusters,則可以執行 kubefedctl enable etcdclusters ,執行后會自動生成新的crd聯邦資源 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提供了一種自動化機制來將工作負載實例分散到不同的集群中,且能夠基於總副本數與集群的定義策略來將Deployment或ReplicaSet資源進行編排。編排策略是通過創建ReplicaSchedulingPreference(RSP),再由KubeFed RSP Controller監聽與獲取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創建后,kubefed rsp controller 會監聽到變化,並獲取rsp內容,根據rsp定義的 name/namespace 找到對應的 federatedDeployment 資源,根據定義的策略計算出每個集群的副本數量,之后修改 federatedDeployment 資源的spec.overrides內,最好 kubefed sync cnotroller 會監聽到 federatedDeployment 的變化,並將新的副本同步到聯邦集群中。

跨集群服務發現

kubefed 提供了一系列api 資源和controller來實現跨集群Service/Ingress的DNS records自動發現和生成,並通過 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

假設我們已經創建了一個名為nginx 的 FederatedDeployment ,並且創建了對應的 FederatedService 來提供 LoadBalancer。這時當創建以上 Domain與ServiceDNSRecord 資源后,KubeFed Service DNS Controller 會監聽到 ServiceDNSRecord 的創建,並收集聯邦集群成員的 Service 信息,更新到 ServiceDNSRecord 中;同時 DNS Endpoint Controller 會依據 ServiceDNSRecord 的內容生成並更新 DNSEndpoint 資源,最后ExternalDNS組件收集 DNSEndpoint 信息同步到DNS服務提供商。

若是Ingress 的話,會由IngressDNSRecord 資源取代,並由Ingress DNS Controller 收集信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM