其他
KubeFed: Kubernetes Federation v2 详解
作者:Kyle Bai,原文:
https://k2r2bai.com/2019/04/20/kubernetes/federation-v2/
简化管理多个集群的Kubernetes 组件(如Deployment, Service 等)。 在多个集群之间分散工作负载(容器),以提升应用(服务)的可靠性。 跨集群的资源编排,依据编排策略在多个集群进行应用(服务)部署。 在不同集群中,能更快速更容易地迁移应用(服务)。 跨集群的服务发现,服务可以提供给当地存取,以降低延迟。 实践多云(Multi-cloud)或混合云(Hybird Cloud)的部署。
为什么v1 被弃用?
控制平面组件会因为发生问题,而影响整体集群效率。 无法兼容新的Kubernetes API 资源。 无法有效的在多个集群管理权限,如不支持RBAC。 联邦层级的设定与策略依赖API 资源的Annotations 内容,这使得弹性不佳。
federation-apiserver :提供Federation API资源,只支持部分Kubernetes API resources。 federation-controller-manager :协调不同集群之间的状态,如同步Federated资源与策略,并建立Kubernetes组件至对应集群上。 etcd :储存Federation的状态。
Federation v1提供了 kubefed
工具来简化?安装Federation控制平面元件的过程,并提供新增/删除集群的操作。
extensions/v1beta1
版本API,所以当建立一个apps/v1
的Deployment,并且在Annotations设定联邦策略时,就会无法正常运作。Federation v2
Modularization(模块化)
与Customizable(定制化)
,这两个理念大概是希望KubeFed能够跟随着Kubernetes生态发展,并持续保持相容性与扩展性。API Group | 用途 |
Cluster Configuration
kubefedctl join/unjoin
来加入/删除集群,当成功加入时,会建立一个KubeFedCluster组件来储存集群相关信息,如API Endpoint、CA Bundle等。这些信息会被用在KubeFed Controller存取不同Kubernetes集群上,以确保能够建立Kubernetes API资源,示意图如下所示。
Host :用于提供KubeFed API与控制平面的集群。 Member :通过KubeFed API注册的集群,并提供相关身份凭证来让KubeFed Controller能够存取集群。Host集群也可以作为Member被加入。
Type Configuration
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 |
kubefedctl enable <res>
指令来建立,如下:$ 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 |
spec
中由使用者自行定义,如下范例:apiVersion: types.kubefed.k8s.io/v1beta1
kind: FederatedDeployment
metadata:
name: test-deployment
namespace: test-namespace
spec:
template: # 定義 Deployment 的所有內容,可理解成 Deployment 與 Pod 之間的關析。
metadata:
labels:
app: nginx
spec:
...
placement: # 定義哪些叢集要建立該 Federated 物件。
clusters:
- name: cluster2
- name: cluster1
overrides: # 定義叢集的 spec.template 中哪個欄位要被覆寫。
- clusterName: cluster2
clusterOverrides:
- path: spec.replicas
value: 5
Template :定义Federated资源所引用的(即Type configuration的目标资源)文件信息。如FederatedDeployment中的 spec.template
会定义Deployment所有内容。Placement :定义Federated资源要分散到哪些集群上,若没有该文件,则不会分散到任何集群中。如FederatedDeployment中的 spec.placement
定义了两个集群时,这些集群将被同步建立相同的Deployment。另外也支用spec.placement.clusterSelector
的方式来选择要放置的集群。Override :定义修改指定集群的Federated资源中的 spec.template
内容。如部署FederatedDeployment到不同公有云上的集群时,就能通过spec.overrides
来调整Volume或副本数。
目前Override不支持 List(Array)
。比如说无法修改spec.template.spec.containers[0].image
。
Scheduling
总副本数
与集群的定义策略
来将Deployment或ReplicaSet资源进行编排。编排策略是通过建立ReplicaSchedulingPreference(RSP)文件,再由KubeFed RSP Controller监听与撷取RSP内容来将工作负载实例建立到指定的集群上。apiVersion: scheduling.kubefed.k8s.io/v1alpha1 kind: ReplicaSchedulingPreference metadata: name: test-deployment namespace: test-ns spec: targetKind: FederatedDeployment totalReplicas: 15 # 所有叢集 Pod 副本數總和 clusters: # 定義叢集排程策略 "*": weight: 2 maxReplicas: 12 ap-northeast: minReplicas: 1 maxReplicas: 3 weight: 1 |
namespace/name
的FederatedDeployment与FederatedReplicaSet是否存在,若存在的话,会根据设定的策略计算出每个集群预期的副本数,之后覆写Federated资源中的spec.overrides
内容以修改每个集群的副本数,最后再由KubeFed Sync Controller来同步至每个集群的Deployment。以上面为例,结果会是ap-northeast集群会拥有3个Pod,us-east跟us-west则分别会有6个Pod。
若 spec.clusters
未定义的话,则预设为{"*":{Weight: 1}}
。若有定义spec.replicas 的overrides 时,副本会以RSP 为优先考量。 分配的计算机制可以参考kubefed/pkg/controller/util/planner/planner.go。
Multi-Cluster DNS
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 |
若是Ingress 的话,会由IngressDNSRecord 文件取代,并由Ingress DNS Controller 收集信息。
Setup Federation v2 on AWS
KubeFed 官方文件也提供了On-premises(minikube 与kind)、GKE 与IBM ICP 的教学,来让使用者快速学习如何构建。
事前准备
kubectl:用来操作部署完成的Kubernetes集群。版本为 v1.14.1
。kops:用来部署与管理公有云上的Kubernetes集群。版本为 v1.14.0
。Mac OS X: $ brew update && brew install kops Linux distro: $ curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut - d '"' -f 4)/kops-linux-amd64
$ chmod +x kops-linux-amd64 && sudo mv kops-linux-amd64 /usr/ local /bin/kopshelm :用来部署Federation v2组件的工具。 kubefedctl:用来新增与加入集群成为联邦的工具。可以到连结中下载二进制档,版本为 v0.1.0-rc1
AWS CLI:用来操作AWS服务的工具。
$ aws --version aws-cli/1.15.4 |
申请AWS 帐号,并在IAM 服务新增一个User 设定存取所有服务(AdministratorAccess)。另外这边要记住AccessKey 与SecretKey。
一般来说只需开启S3、Route53、EC2、EBS、ELB 与VPC 权限,但由于偷懒就全开。以下为各AWS 服务在本次安装中的用意:
IAM: 提供身份认证与存取管理。 EC2: Kubernetes 集群部署的虚拟机环境。 ELB: Kubernetes 文件与Service 负载平衡。 Route53: 提供Public domain 存取Kubernetes 集群环境与应用。 S3: 储存Kops 状态。 VPC: 提供Kubernetes 的Host 与CNI 网路环境。
拥有自己的Domain Name,这边可以在AWS Route53 注册,或者是到GoDaddy 购买。
设定脚本参数
$ cd aws-k8s-federation $ cp .env.sample .env |
.env
档案并修改一下参数:export KUBERNETES_VERSION= "1.14.1" # Your domain name and envs export DOMAIN_NAME= "k8s.example.com" #你的Domain Name(这边为<hoste_dzone_name>.<domain_name>) |
建立Route53 Hosted Zone
AWS Access Key ID [****************QGEA]: AWS Secret Access Key [****************zJ+ w]: Default region name [None]: Default output format [None]: |
设定的Keys可以在 ~/.aws/credentials
找到。
NameServers
:$ ./0-create-hosted-domain.sh # output ... { "HostedZone": { "ResourceRecordSetCount": 2, "CallerReference": "2018-04-25-16:16", "Config": { "PrivateZone": false }, "Id": "/hostedzone/Z2JR49ADZ0P3WC", "Name": "k8s.example.com." }, "DelegationSet": { "NameServers": [ "ns-1547.awsdns-01.co.uk", "ns-1052.awsdns-03.org", "ns-886.awsdns-46.net", "ns-164.awsdns-20.com" ] }, "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z2JR49ADZ0P3WC", "ChangeInfo": { "Status": "PENDING", "SubmittedAt": "2018-04-25T08:16:57.462Z", "Id": "/change/C3802PE0C1JVW2" } }
|
NameServers
新增至自己的Domain name的record中,如Godaddy:(Multi-cloud)
与混合云(Hybird Cloud)
部署吧(个人觉得拉)。Related Posts
https://k2r2bai.com/2018/03/21/kubernetes/federation-v1/ https://k2r2bai.com/2018/04/21/kubernetes/aws-federation-v1/ https://speakerdeck.com/kairen/setup-kubernetes-federation-v2-on-aws https://speakerdeck.com/kairen/setup-eks-multi-cluster-using-federation-v2
References
https://github.com/kubernetes-sigs/kubefed https://kubernetes.io/blog/2018/12/12/kubernetes-federation-evolution/ https://containerjournal.com/2019/04/09/kubernetes-and-the-challenge-of-federation/ https://blog.openshift.com/combining-federation-v2-and-istio-multicluster/ https://medium.com/condenastengineering/k8s-federation-v2-a-guide-on-how-to-get-started-ec9cc26b1fa7 https://podctl.com/multi-cluster-and-federation-v2/ https://www.youtube.com/watch?v=q27rbaX5Jis&feature=youtu.be&t=7m20s
--end--
K8S培训推荐
Kubernetes线下实战培训,采用3+1+1新的培训模式(3天线下实战培训,1年内可免费再次参加,每期前10名报名,可免费参加价值3600元的线上直播班;),资深一线讲师,实操环境实践,现场答疑互动,培训内容覆盖:Kubernetes集群搭建、Kubernetes设计、Pod、常用对象操作,Kuberentes调度系统、QoS、Helm、网络、存储、CI/CD、日志监控等。点击查看更多课程信息!成都:8月16-18日
推荐阅读