# 集群聯邦
Kubernetes v1.9聲稱單集群最多可支持5000個節點和15萬個Pod,我相信很少有公司會部署如此龐大的一個單集群,總有很多情況下因為各種各樣的原因我們可能會部署多個集群,但是有時候有想將他們統一起來管理,這時候就需要用到集群聯邦(Federation)。
## 為什么要使用 federation
Federation 使管理多個集群變得簡單。它通過提供兩個主要構建模塊來實現:
- 跨集群同步資源:Federation 提供了在多個集群中保持資源同步的能力。例如,可以保證同一個 deployment 在多個集群中存在。
- 跨集群服務發現:Federation 提供了自動配置 DNS 服務以及在所有集群后端上進行負載均衡的能力。例如,可以提供一個全局 VIP 或者 DNS 記錄,通過它可以訪問多個集群后端。
Federation 還可以提供一些其它用例:
- 高可用:通過在集群間分布負載并自動配置 DNS 服務和負載均衡,federation 最大限度地減少集群故障的影響。
- 避免廠商鎖定:通過更簡單的跨集群應用遷移方式,federation 可以防止集群廠商鎖定。
Federation 對于單個集群沒有用處。基于下面這些原因您可能會需要多個集群:
- 低延遲:通過在多個區域部署集群可以最大限度減少區域近端用戶的延遲。
- 故障隔離:擁有多個小集群可能比單個大集群更利于故障隔離(例如:在云服務提供商的不同可用區中的多個集群)。詳情請參考 [多集群指南](https://kubernetes.io/docs/concepts/cluster-administration/federation)。
- 可伸縮性:單個集群有可伸縮性限制(對于大多數用戶這不是典型場景。更多細節請參考 [Kubernetes 彈性伸縮與性能目標](https://git.k8s.io/community/sig-scalability/goals.md))。
- [混合云](https://kubernetes.io/docs/concepts/cluster-administration/federation/):您可以在不同的云服務提供商或本地數據中心中擁有多個集群。
### 警告
雖然 federation 有很多吸引人的使用案例,但也有一些注意事項:
- 增加網絡帶寬和成本:federation 控制平面監控所有集群以確保當前狀態符合預期。如果集群在云服務提供商的不同區域或者不同的云服務提供商上運行時,這將導致明顯的網絡成本增加。
- 減少跨集群隔離:federation 控制平面中的 bug 可能影響所有集群。通過在 federation 中實現最少的邏輯可以緩解這種情況。只要有可能,它就將盡力把工作委托給 kubernetes 集群中的控制平面。這種設計和實現在安全性及避免多集群停止運行上也是錯誤的。
- 成熟度:federation 項目相對比較新,還不是很成熟。并不是所有資源都可用,許多仍然處于 alpha 狀態。 [Issue 88](https://github.com/kubernetes/kubernetes/issues/88) 列舉了團隊目前正忙于解決的與系統相關的已知問題。
### 混合云能力
Kubernetes 集群 federation 可以包含運行在不同云服務提供商(例如 Google Cloud、AWS)及本地(例如在 OpenStack 上)的集群。您只需要按需在適合的云服務提供商和/或地點上簡單的創建集群,然后向 Federation API Server 注冊每個集群的 API endpoint 和憑據即可。
此后,您的 [API 資源](https://kubernetes.io/docs/concepts/cluster-administration/federation/) 就可以跨越不同的集群和云服務提供商。
## 設置 federation
為了能夠聯合(federate)多個集群,首先需要建立一個 federation 控制平面。請按照 [設置指南](https://kubernetes.io/docs/tutorials/federation/set-up-cluster-federation-kubefed) 設置 federation 控制平面。
## API 資源
一旦設置了控制平面,您就可以開始創建 federation API 資源。 以下指南詳細介紹了一些資源:
- [Cluster](https://kubernetes.io/docs/tasks/administer-federation/cluster)
- [ConfigMap](https://kubernetes.io/docs/tasks/administer-federation/configmap)
- [DaemonSets](https://kubernetes.io/docs/tasks/administer-federation/daemonset)
- [Deployment](https://kubernetes.io/docs/tasks/administer-federation/deployment)
- [Events](https://kubernetes.io/docs/tasks/administer-federation/events)
- [Hpa](https://kubernetes.io/docs/tasks/administer-federation/hpa)
- [Ingress](https://kubernetes.io/docs/tasks/administer-federation/ingress)
- [Jobs](https://kubernetes.io/docs/tasks/administer-federation/job)
- [Namespaces](https://kubernetes.io/docs/tasks/administer-federation/namespaces)
- [ReplicaSets](https://kubernetes.io/docs/tasks/administer-federation/replicaset)
- [Secrets](https://kubernetes.io/docs/tasks/administer-federation/secret)
- [Services](https://kubernetes.io/docs/concepts/cluster-administration/federation-service-discovery)
[API 參考文檔](https://kubernetes.io/docs/reference/federation) 列舉了 federation apiserver 支持的所有資源。
## 級聯刪除
Kubernetes 1.6 版本包括了對聯邦資源(federated resources)級聯刪除的支持。通過級聯刪除,當您從 federation 控制平面刪除一個資源時,會同時刪除所有底層集群中對應的資源。
當使用 REST API 時,級聯刪除沒有默認開啟。要想在使用 REST API 從 federation 控制平面刪除資源時啟用級聯刪除,請設置 `DeleteOptions.orphanDependents=false` 選項。使用 `kubectl delete` 時默認使用級聯刪除。您可以通過運行 `kubectl delete --cascade=false` 來禁用該功能。
注意:Kubernetes 1.5 版本支持的級聯刪除僅支持部分 federation 資源。
## 單個集群范圍
在諸如 Google Compute Engine 或者 Amazon Web Services 等 IaaS 服務提供商中,虛擬機存在于 [區域](https://cloud.google.com/compute/docs/zones) 或 [可用區](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html) 上。我們建議 Kubernetes 集群中的所有虛擬機應該位于相同的可用區,因為:
- 與擁有單個全局 Kubernetes 集群相比,單點故障更少。
- 與跨可用區集群相比,推測單區域集群的可用性屬性更容易。
- 當 Kubernetes 開發人員設計系統時(例如對延遲,帶寬或相關故障進行假設),它們假設所有的機器都在一個單一的數據中心,或以其它方式緊密連接。
在每個可用區域同時擁有多個集群也是可以的,但總體而言,我們認為少一點更好。 選擇較少集群的理由是:
- 某些情況下,在一個集群中擁有更多的節點可以改進 Pod 的裝箱打包(較少資源碎片)。
- 減少運維開銷(盡管隨著運維工具和流程的成熟,優勢已經減少)。
- 減少每個集群固定資源成本的開銷,例如 apiserver 虛擬機(但對于大中型集群的整體集群成本來說百分比很小)。
擁有多個集群的原因包括:
- 嚴格的安全策略要求將一類工作與另一類工作隔離開來(但是,請參見下面的分區集群(Partitioning Clusters))。
- 對新的 Kubernetes 發行版或其它集群軟件進行灰度測試。
## 選擇正確的集群數量
Kubernetes 集群數量的選擇可能是一個相對靜態的選擇,只是偶爾重新設置。相比之下,依據負載情況和增長,集群的節點數量和 service 的 pod 數量可能會經常變化。
要選擇集群的數量,首先要確定使用哪些區域,以便為所有終端用戶提供足夠低的延遲,以在 Kubernetes 上運行服務(如果您使用內容分發網絡(Content Distribution Network,CDN),則 CDN 托管內容的時延要求不需要考慮)。法律問題也可能影響到這一點。例如,擁有全球客戶群的公司可能會決定在美國、歐盟、亞太和南亞地區擁有集群。我們將選擇的區域數量稱為 `R`。
其次,決定在整體仍然可用的前提下,可以同時有多少集群不可用。將不可用集群的數量稱為 `U`。如果您不能確定,那么 1 是一個不錯的選擇。
如果在集群故障的情形下允許負載均衡將流量引導到任何區域,則至少需要有比 `R` 或 `U + 1` 數量更大的集群。如果不行的話(例如希望在集群發生故障時對所有用戶確保低延遲),那么您需要有數量為 `R * (U + 1)` 的集群(`R` 個區域,每個中有 `U + 1` 個集群)。無論如何,請嘗試將每個集群放在不同的區域中。
最后,如果您的任何集群需要比 Kubernetes 集群最大建議節點數更多的節點,那么您可能需要更多的集群。 Kubernetes v1.3 支持最多 1000 個節點的集群。 Kubernetes v1.8 支持最多 5000 個節點的集群。
---
原文地址:https://kubernetes.io/docs/concepts/cluster-administration/federation/
譯文地址:https://k8smeetup.github.io/docs/concepts/cluster-administration/federation/
- 序言
- 云原生
- 云原生(Cloud Native)的定義
- CNCF - 云原生計算基金會簡介
- CNCF章程
- 云原生的設計哲學
- Play with Kubernetes
- 快速部署一個云原生本地實驗環境
- Kubernetes與云原生應用概覽
- 云原生應用之路——從Kubernetes到Cloud Native
- 云原生編程語言
- 云原生編程語言Ballerina
- 云原生編程語言Pulumi
- 云原生的未來
- Kubernetes架構
- 設計理念
- Etcd解析
- 開放接口
- CRI - Container Runtime Interface(容器運行時接口)
- CNI - Container Network Interface(容器網絡接口)
- CSI - Container Storage Interface(容器存儲接口)
- Kubernetes中的網絡
- Kubernetes中的網絡解析——以flannel為例
- Kubernetes中的網絡解析——以calico為例
- 具備API感知的網絡和安全性管理開源軟件Cilium
- Cilium架構設計與概念解析
- 資源對象與基本概念解析
- Pod狀態與生命周期管理
- Pod概覽
- Pod解析
- Init容器
- Pause容器
- Pod安全策略
- Pod的生命周期
- Pod Hook
- Pod Preset
- Pod中斷與PDB(Pod中斷預算)
- 集群資源管理
- Node
- Namespace
- Label
- Annotation
- Taint和Toleration(污點和容忍)
- 垃圾收集
- 控制器
- Deployment
- StatefulSet
- DaemonSet
- ReplicationController和ReplicaSet
- Job
- CronJob
- Horizontal Pod Autoscaling
- 自定義指標HPA
- 準入控制器(Admission Controller)
- 服務發現
- Service
- Ingress
- Traefik Ingress Controller
- 身份與權限控制
- ServiceAccount
- RBAC——基于角色的訪問控制
- NetworkPolicy
- 存儲
- Secret
- ConfigMap
- ConfigMap的熱更新
- Volume
- Persistent Volume(持久化卷)
- Storage Class
- 本地持久化存儲
- 集群擴展
- 使用自定義資源擴展API
- 使用CRD擴展Kubernetes API
- Aggregated API Server
- APIService
- Service Catalog
- 資源調度
- QoS(服務質量等級)
- 用戶指南
- 資源對象配置
- 配置Pod的liveness和readiness探針
- 配置Pod的Service Account
- Secret配置
- 管理namespace中的資源配額
- 命令使用
- Docker用戶過度到kubectl命令行指南
- kubectl命令概覽
- kubectl命令技巧大全
- 使用etcdctl訪問kubernetes數據
- 集群安全性管理
- 管理集群中的TLS
- kubelet的認證授權
- TLS bootstrap
- 創建用戶認證授權的kubeconfig文件
- IP偽裝代理
- 使用kubeconfig或token進行用戶身份認證
- Kubernetes中的用戶與身份認證授權
- Kubernetes集群安全性配置最佳實踐
- 訪問Kubernetes集群
- 訪問集群
- 使用kubeconfig文件配置跨集群認證
- 通過端口轉發訪問集群中的應用程序
- 使用service訪問群集中的應用程序
- 從外部訪問Kubernetes中的Pod
- Cabin - Kubernetes手機客戶端
- Kubernetic - Kubernetes桌面客戶端
- Kubernator - 更底層的Kubernetes UI
- 在Kubernetes中開發部署應用
- 適用于kubernetes的應用開發部署流程
- 遷移傳統應用到Kubernetes中——以Hadoop YARN為例
- 最佳實踐概覽
- 在CentOS上部署Kubernetes集群
- 創建TLS證書和秘鑰
- 創建kubeconfig文件
- 創建高可用etcd集群
- 安裝kubectl命令行工具
- 部署master節點
- 安裝flannel網絡插件
- 部署node節點
- 安裝kubedns插件
- 安裝dashboard插件
- 安裝heapster插件
- 安裝EFK插件
- 生產級的Kubernetes簡化管理工具kubeadm
- 使用kubeadm在Ubuntu Server 16.04上快速構建測試集群
- 服務發現與負載均衡
- 安裝Traefik ingress
- 分布式負載測試
- 網絡和集群性能測試
- 邊緣節點配置
- 安裝Nginx ingress
- 安裝配置DNS
- 安裝配置Kube-dns
- 安裝配置CoreDNS
- 運維管理
- Master節點高可用
- 服務滾動升級
- 應用日志收集
- 配置最佳實踐
- 集群及應用監控
- 數據持久化問題
- 管理容器的計算資源
- 集群聯邦
- 存儲管理
- GlusterFS
- 使用GlusterFS做持久化存儲
- 使用Heketi作為Kubernetes的持久存儲GlusterFS的external provisioner
- 在OpenShift中使用GlusterFS做持久化存儲
- GlusterD-2.0
- Ceph
- 用Helm托管安裝Ceph集群并提供后端存儲
- 使用Ceph做持久化存儲
- 使用rbd-provisioner提供rbd持久化存儲
- OpenEBS
- 使用OpenEBS做持久化存儲
- Rook
- NFS
- 利用NFS動態提供Kubernetes后端存儲卷
- 集群與應用監控
- Heapster
- 使用Heapster獲取集群和對象的metric數據
- Prometheus
- 使用Prometheus監控kubernetes集群
- Prometheus查詢語言PromQL使用說明
- 使用Vistio監控Istio服務網格中的流量
- 分布式跟蹤
- OpenTracing
- 服務編排管理
- 使用Helm管理Kubernetes應用
- 構建私有Chart倉庫
- 持續集成與發布
- 使用Jenkins進行持續集成與發布
- 使用Drone進行持續集成與發布
- 更新與升級
- 手動升級Kubernetes集群
- 升級dashboard
- 領域應用概覽
- 微服務架構
- 微服務中的服務發現
- 使用Java構建微服務并發布到Kubernetes平臺
- Spring Boot快速開始指南
- Service Mesh 服務網格
- 企業級服務網格架構
- Service Mesh基礎
- Service Mesh技術對比
- 采納和演進
- 定制和集成
- 總結
- Istio
- 安裝并試用Istio service mesh
- 配置請求的路由規則
- 安裝和拓展Istio service mesh
- 集成虛擬機
- Istio中sidecar的注入規范及示例
- 如何參與Istio社區及注意事項
- Istio教程
- Istio免費學習資源匯總
- 深入理解Istio Service Mesh中的Envoy Sidecar注入與流量劫持
- 深入理解Istio Service Mesh中的Envoy Sidecar代理的路由轉發
- Linkerd
- Linkerd 使用指南
- Conduit
- Condiut概覽
- 安裝Conduit
- Envoy
- Envoy的架構與基本術語
- Envoy作為前端代理
- Envoy mesh教程
- SOFAMesh
- SOFAMesh中的Dubbo on x-protocol
- SOFAMosn
- 使用 SOFAMosn 構建 SOFAMesh
- 大數據
- Spark standalone on Kubernetes
- 運行支持Kubernetes原生調度的Spark程序
- Serverless架構
- 理解Serverless
- FaaS-函數即服務
- OpenFaaS快速入門指南
- 邊緣計算
- 人工智能