KubeFed 集群联邦
Kubernetes 集群联邦
通过托管集群中的一组 API 协调多个 kubernetes 集群的配置。
简化管理多个集群的 Kubernetes 组件(如 Deployment, Service 等)。
在多个集群之间分散工作负载(容器),以提升应用(服务)的可靠性。
跨集群的资源编排,依据编排策略在多个集群进行应用(服务)部署。
在不同集群中,能更快速更容易地迁移应用(服务)。
跨集群的服务发现,服务可以提供给当地存取,以降低延迟。
实践多云(Multi-cloud)或混合云(Hybird Cloud)的部署。
kubefed v1 为什么被废弃
控制平面组件会因为发生问题,而影响整体集群效率。
无法兼容新的 Kubernetes API 资源。
无法有效的在多个集群管理权限,如不支持 RBAC。
联邦层级的设定与策略依赖 API 资源的 Annotations 内容,这使得弹性不佳。
federation-apiserver :提供 Federation API 资源,只支持部分 Kubernetes API resources。
federation-controller-manager :协调不同集群之间的状态,如同步 Federated 资源与策略,并建立 Kubernetes 组件至对应集群上。
etcd :储存 Federation 的状态。
kubefed v2 版本
实现了模块化和定制化,最大的改变是将 API Server 移除,并且通过 CRD 机制完成 Federated Resource 的扩充。KubeFed Controller 管理这些 CRD,并实现同步 Resources 跨集群编排等功能。
在 Federation 中会分为 Host 和 Member 两种类型的集群。
Host :用于提供 KubeFed API 与控制平面的集群。
Member :通过 KubeFed API 注册的集群,并提供相关身份凭证来让 KubeFed Controller 能够存取集群。Host 集群也可以作为 Member 被加入。
KubeFed
是 Kubernetes 集群联盟中孕育而生的技术,可以实现提供一种机制,表达哪些集群应该对其配置进行管理。
Type Configuration 声明 Kubefed 可以处理那些 API 类型
Cluster Configuration 声明 Kubefed 将哪些集群设置为 target
Propagation 指向联合集群分配资源的机制
Type Configuration 有三种策略:
Template 定义跨集群的常见资源
Placement 定义资源出现在某个集群中
Overrides 定义要应用于模板的每个集群的字段级别差异
三种策略提供了在多个集群中的资源简洁声明。
基本概念提供了可被更高级别的 API 使用的构建基块:
status 收集由 Kubefed 在所有联合集群中分配资源的状态
Policy 确定允许将资源分配给哪些集群子集
Scheduler 指是一种决策能力,可以决定工作负载如何在不同集群之间分配
使用
Type Configuration
定义了 Kubernetes 的哪些资源要用于联邦管理,例如是 Configmap 要联邦管理那么就需要在 Host 集群中,使用 CRD 建立新的资源 FederatedConfigMap,接着再建立名称为 configmaps 的 Type configuration(FederatedTypeConfig) 资源,然后描述 ConfigMap 要被 FederatedConfigMap 所管理,这样 KubeFed Controllers 才能知道如何建立 Federated 资源。
范例
安装实现
获取软件
git clone https://github.com/kubernetes-sigs/kubefed.git
启动 kind
是运行使用容器“节点”本地 Kubernetes 集群的工具。这种类型主要是为了测试 Kubernetes 本身而设计的,但可用于本地开发或 CI。
创建集群时指定集群名称,rke 安装
安装完成后将多个集群的 kubeconfig 文件整合成一个
实现效果为下图
安装 kubefed 控制平面,使用 helm 安装
加入集群
--host-cluster-context
指定的是 host 集群
--cluster-context
指定的是要加入的集群删除集群使用
unjoin
进行删除,kubefedctl unjoin cluster2 --cluster-context cluster2 --host-cluster-context cluster1 --v=2
验证加入集群状态
创建联合名称空间
告诉 kubefed 联合该名称空间
创建一个联合的 Deployment
告诉 kubefed 联盟Deployment
验证FederatedDeployment
已经创建并正确传播
Placement :定义 Federated 资源要分散到哪些集群上,若没有该文件,则不会分散到任何集群中。如 FederatedDeployment 中的 spec.placement 定义了两个集群时,这些集群将被同步建立相同的 Deployment。另外也支用 spec.placement.clusterSelector 的方式来选择要放置的集群。
Override :定义修改指定集群的 Federated 资源中的 spec.template 内容。如部署 FederatedDeployment 到不同公有云上的集群时,就能通过 spec.overrides 来调整 Volume 或副本数。
切换集群查看 deployment 是否已经创建,查看 deployment 验证即可
至此实现集群联合。
网络方面验证
验证方式
在 host 集群中创建 deployment 并开启联合,创建 Service 验证是否可以在 host 访问到 member 集群中的 service
结果为可以,使用 tcpdump 抓包显示会通过 default 名称空间中的主机 IP 转换到内部
验证 host 集群中的联合资源被删除,另一个集群会不会被删除
不会被删除
验证 Service 中的 Endpoints 是否可以整合进多个集群的 target
不会整合进多个集群的 target,只会整合自己的集群
版权声明: 本文为 InfoQ 作者【陈迪】的原创文章。
原文链接:【http://xie.infoq.cn/article/947f671f43324f46ed1cb6d3e】。未经作者许可,禁止转载。
评论