写点什么

KubeFed 集群联邦

用户头像
陈迪
关注
发布于: 2021 年 04 月 25 日
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 有三种策略:


  1. Template 定义跨集群的常见资源

  2. Placement 定义资源出现在某个集群中

  3. Overrides 定义要应用于模板的每个集群的字段级别差异


三种策略提供了在多个集群中的资源简洁声明。


基本概念提供了可被更高级别的 API 使用的构建基块:


  • status 收集由 Kubefed 在所有联合集群中分配资源的状态

  • Policy 确定允许将资源分配给哪些集群子集

  • Scheduler 指是一种决策能力,可以决定工作负载如何在不同集群之间分配

使用

Type Configuration

定义了 Kubernetes 的哪些资源要用于联邦管理,例如是 Configmap 要联邦管理那么就需要在 Host 集群中,使用 CRD 建立新的资源 FederatedConfigMap,接着再建立名称为 configmaps 的 Type configuration(FederatedTypeConfig) 资源,然后描述 ConfigMap 要被 FederatedConfigMap 所管理,这样 KubeFed Controllers 才能知道如何建立 Federated 资源。


范例


apiVersion: core.kubefed.k8s.io/v1beta1kind: FederatedTypeConfigmetadata:  name: configmaps  namespace: kube-federation-systemspec:  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
复制代码

安装实现

获取软件


git clone https://github.com/kubernetes-sigs/kubefed.git


启动 kind


是运行使用容器“节点”本地 Kubernetes 集群的工具。这种类型主要是为了测试 Kubernetes 本身而设计的,但可用于本地开发或 CI。


[root@Host kubefed-master]# kind create clusterCreating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.19.1) 🖼 ✓ Preparing nodes 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾Set kubectl context to "kind-kind"You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a nice day! 👋
复制代码


创建集群时指定集群名称,rke 安装


nodes:  - address: 10.0.0.96    user: docker    role: [controlplane, worker, etcd]cluster_name: cluster0
复制代码


安装完成后将多个集群的 kubeconfig 文件整合成一个


apiVersion: v1clusters:- cluster:    certificate-authority-data: ...    server: https://10.0.0.96:6443  name: cluster0- cluster:    certificate-authority-data: ...    server: https://10.0.0.97:6443  name: cluster1contexts:- context:    cluster: cluster0    user: kube-admin-cluster0  name: cluster0- context:    cluster: cluster1    user: kube-admin-cluster1  name: cluster1current-context: cluster1kind: Configpreferences: {}users:- name: kube-admin-cluster0  user:    client-certificate-data: ...    client-key-data: ...- name: kube-admin-cluster1  user:    client-certificate-data: ...    client-key-data: ...
复制代码


实现效果为下图


[root@Host kubefed]# kubectl config get-contextsCURRENT   NAME       CLUSTER    AUTHINFO              NAMESPACE          cluster0   cluster0   kube-admin-cluster0*         cluster1   cluster1   kube-admin-cluster1
复制代码


安装 kubefed 控制平面,使用 helm 安装


kubectl create namespace kube-federation-systemhelm repo add kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/chartshelm repo listhelm repo updatehelm search repo kubefedhelm --namespace kube-federation-system upgrade -i kubefed kubefed-charts/kubefed --version=0.7.0 --create-namespacekubectl label namespaces kube-federation-system name=kube-federation-system
复制代码


加入集群


kubefedctl join cluster0 --cluster-context cluster0 \    --host-cluster-context cluster1 --v=2kubefedctl join cluster1 --cluster-context cluster1 \    --host-cluster-context cluster1 --v=2
复制代码


--host-cluster-context 指定的是 host 集群

--cluster-context 指定的是要加入的集群

删除集群使用 unjoin 进行删除,kubefedctl unjoin cluster2 --cluster-context cluster2 --host-cluster-context cluster1 --v=2


验证加入集群状态


[root@Host kubefed]# kubectl -n kube-federation-system get kubefedclustersNAME       AGE    READYcluster0   100m   Truecluster1   100m   True
复制代码


创建联合名称空间


kubectl create ns federate-me
复制代码


告诉 kubefed 联合该名称空间


./bin/kubefedctl federate ns federate-me
复制代码


创建一个联合的 Deployment


apiVersion: apps/v1kind: Deploymentmetadata:  name: test-deployment1  namespace: federate-mespec:  replicas: 3  selector:    matchExpressions:    - key: app      operator: In      values:      - nginx  template:    metadata:      name: nginx      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx
kubectl apply -f deployment.yaml
复制代码


告诉 kubefed 联盟Deployment


[root@Host kubefed]# kubefedctl -n federate-me federate deployment test-deployment1
复制代码


验证FederatedDeployment已经创建并正确传播


[root@Host kubefed]# kubectl describe FederatedDeployment -n federate-me
复制代码


  • Placement :定义 Federated 资源要分散到哪些集群上,若没有该文件,则不会分散到任何集群中。如 FederatedDeployment 中的 spec.placement 定义了两个集群时,这些集群将被同步建立相同的 Deployment。另外也支用 spec.placement.clusterSelector 的方式来选择要放置的集群。

  • Override :定义修改指定集群的 Federated 资源中的 spec.template 内容。如部署 FederatedDeployment 到不同公有云上的集群时,就能通过 spec.overrides 来调整 Volume 或副本数。


切换集群查看 deployment 是否已经创建,查看 deployment 验证即可


[root@Host kubefed]# kubectl config use-context cluster0
复制代码


至此实现集群联合。

网络方面验证

验证方式

  1. 在 host 集群中创建 deployment 并开启联合,创建 Service 验证是否可以在 host 访问到 member 集群中的 service


结果为可以,使用 tcpdump 抓包显示会通过 default 名称空间中的主机 IP 转换到内部


  1. 验证 host 集群中的联合资源被删除,另一个集群会不会被删除


不会被删除


  1. 验证 Service 中的 Endpoints 是否可以整合进多个集群的 target


不会整合进多个集群的 target,只会整合自己的集群

发布于: 2021 年 04 月 25 日阅读数: 43
用户头像

陈迪

关注

期望 2021.03.29 加入

容器云方向 正在学习Go......

评论

发布
暂无评论
KubeFed集群联邦