摘要: kubernetes集群让您可以方便的部署管理运维容器化的应用。可是实际状况中常常遇到的一些问题,就是单个集群一般没法跨单个云厂商的多个Region,更不用说支持跨跨域不一样的云厂商。这样会给企业带来一些担心,如何应对可用区级别的Fail,以及容灾备份?是否会形成厂商锁定,增长迁移成本?如何应对线上线下突发流量?如何统一管理调度容器资源?单个集群规模的上限等等。html
点此查看原文:http://click.aliyun.com/m/43608/ python
kubernetes集群让您可以方便的部署管理运维容器化的应用。可是实际状况中常常遇到的一些问题,就是单个集群一般没法跨单个云厂商的多个Region,更不用说支持跨跨域不一样的云厂商。这样会给企业带来一些担心,如何应对可用区级别的Fail,以及容灾备份?是否会形成厂商锁定,增长迁移成本?如何应对线上线下突发流量?如何统一管理调度容器资源?单个集群规模的上限等等。nginx
Federation集群联邦能够必定程度上解决这些问题。Federation是能够将分布在多个Region或者多个云厂商的Kubernetes集群整合成一个大的集群,统一管理与调度。web
本文档演示搭建一个杭州和北京的kubernetes集群组成集群联邦,其中杭州集群做为联邦的控制平面api
Federation使用域名将不一样子集群的同一个服务暴露出来,所以须要用户提供一个可配置的域名。您能够经过万网在阿里云上购买域名而后配置到您的Federation集群上。
以域名spacexnice.xyz
为例,请按照购买域名文档购买好域名。跨域
因为Federation在添加域名解析记录的时候设置域名的TTL为3分钟,域名层级为5级,所以须要到阿里云上对您刚购买的域名进行设置,使得该域名容许的最小TTL值小于3分钟,同时域名层级大于5.app
进入云解析控制台选择您刚刚购买的域名,更多里面选[升级]或者[升级VIP]
运维
在弹出的页面中更改最低TTL值为60s,子域名级别为7级,而后保存。ssh
本示例建立的Federation集群包含两个子集群,分别在杭州和北京region。咱们首先须要在这两个Region建立出两个可用的集群,集群建立步骤参考文档curl
杭州集群
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get no NAME STATUS ROLES AGE VERSION cn-hangzhou.i-bp11ajet2v9o3tp0o2uw Ready master 3d v1.8.4 cn-hangzhou.i-bp15pt2475mgw64k72ma Ready master 3d v1.8.4 cn-hangzhou.i-bp18fggko6p3vyr0p0ew Ready <none> 3d v1.8.4 cn-hangzhou.i-bp18fggko6p3vyr0p0ex Ready <none> 3d v1.8.4 cn-hangzhou.i-bp1bpj58bdzdosdxxf82 Ready master 3d v1.8.4
北京集群
[root@iZze7z98ssc50pfzt6be9 ~]# kubectl get no NAME STATUS ROLES AGE VERSION cn-beijing.i-2ze7z98ssc50pfzt6be9 Ready master 3d v1.8.4 cn-beijing.i-2ze8hr6k03ccroopicd2 Ready master 3d v1.8.4 cn-beijing.i-2zeipodwz2junslmihqz Ready master 3d v1.8.4 cn-beijing.i-2zeipodwz2junyipunrf Ready <none> 3d v1.8.4
选择杭州的子集群做为Federation的宿主集群,安装Federation的控制平面。并配置好本地的kubeconfig。经过运行kubefed init命令来初始化主集群。具体步骤以下:
在hangzhou集群的master节点安装kubefed
[root@iZze7z98ssc50pfzt6be9 ~]# curl -L http://aliacs-k8s-cn-hangzhou.oss.aliyuncs.com/bin/kubefed-1.8.4 -o kubefed [root@iZze7z98ssc50pfzt6be9 ~]# sudo cp kubefed /usr/bin [root@iZze7z98ssc50pfzt6be9 ~]# sudo chmod +x /usr/bin/kubefed [root@iZze7z98ssc50pfzt6be9 ~]# kubefed version
在杭州集群master节点中配置hangzhou,beijing两个集群的context,让改节点能经过切换context链接不一样的子集群。要修改的内容以下:
为了方便初学者,咱们提供了一个自动化的脚本,能够自动经过ssh从您指定的集群中下载kubeconfig配置文件,并合并成一个总体。
经过执行脚原本自动生成~/.kube/config
文件。脚本须要指明从哪些集群上下载kubeconfig文件并合并,格式以下python context.py -H hangzhou:1.1.1.1,beijing:2.2.2.2
注意参数替换成你本身的集群Region和IP,脚本可能会要求您输入ssh的登陆密码。
[root@iZbp1bpj58bdzdosdxxf82Z ~]# curl http://aliacs-k8s-cn-hangzhou.oss.aliyuncs.com/tools/context.py > context.py [root@iZbp1bpj58bdzdosdxxf82Z ~]# sudo pip install pyyaml [root@iZbp1bpj58bdzdosdxxf82Z ~]# unset KUBECONFIG [root@iZbp1bpj58bdzdosdxxf82Z ~]# python context.py -H ${HOST} Info: host, hangzhou:118.31.177.21,beijing:47.95.96.234 . Info: file /root/.kube/config successfully generated.
配置结果以下:
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE hangzhou kubernetes-hangzhou kubernetes-admin-hangzhou * beijing kubernetes-beijing kubernetes-admin-beijing
zones填写您前面申请的域名,注意以点号结尾。而且替换您的accesskeyid和accesskeysecret.
cat >alidns.yaml <<EOF [Global] access-key-id = <Your-key-id> access-key-secret = <Your-key-secret> zones = spacexnice.xyz. EOF
经过本条命令初始化federation控制平面,参数以下: kubefed init federation \ # 联邦的名字 --host-cluster-context=hangzhou \ # 主集群的context名字 --dns-provider="alidns" \ # DNS服务提供商 --dns-zone-name="spacexnice.xyz." \ # 前面注册好的域名,必须以.结束 --dns-provider-config="alidns.yaml" \ # alidns配置文件 --image="registry.cn-hangzhou.aliyuncs.com/google-containers/hyperkube-amd64:v1.8.4-4_99c084ce" \ # hyperkube镜像 --etcd-image='registry.cn-hangzhou.aliyuncs.com/google-containers/etcd-amd64:3.1.11' \ #etcd 镜像 --etcd-persistent-storage=false # 关闭etcd持久存储
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed init federation \ --host-cluster-context=hangzhou \ --dns-provider="alidns" \ --dns-zone-name="spacexnice.xyz." \ --dns-provider-config="alidns.yaml" \ --image="registry.cn-hangzhou.aliyuncs.com/google-containers/hyperkube-amd64:v1.8.4-4_99c084ce" \ --etcd-image='registry.cn-hangzhou.aliyuncs.com/google-containers/etcd-amd64:3.1.11' \ --etcd-persistent-storage=false Creating a namespace federation-system for federation system components... done Creating federation control plane service..... done Creating federation control plane objects (credentials, persistent volume claim)... done Creating federation component deployments... done Updating kubeconfig... done Waiting for federation control plane to come up..................................................................................................................................................... done Federation API server is running at: 120.55.196.1
目前为止您已经成功的初始化好了Federation的控制平面。接下来须要将各个子集群加入到Federation集群中。
添加hangzhou集群
命令行参数解析 kubefed join hangzhou \ #加入联邦的集群命名名字 --context=federation \ #联邦的context --cluster-context=hangzhou \ #要添加集群的context --host-cluster-context=hangzhou #主集群的context
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed join hangzhou \ --context=federation \ --cluster-context=hangzhou \ --host-cluster-context=hangzhou [root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get cluster --context=federation NAME STATUS AGE hangzhou Ready 28s
添加beijing集群
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed join beijing \ --context=federation \ --cluster-context=beijing \ --host-cluster-context=hangzhou [root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get cluster --context=federation NAME STATUS AGE hangzhou Ready 4m beijing Ready 59s
后面介绍下集群查询,移除集群,删除联邦等命令
查询注册到Federation的kubernetes集群列表
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get cluster --context=federation NAME STATUS AGE hangzhou Ready 4m beijing Ready 59s
移除beijing集群
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed unjoin beijing --host-cluster-context=hangzhou --context=federation [root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get clusters --context=federation NAME STATUS AGE hangzhou Ready 1d
集群联邦控制平面的删除功能还在开发中,目前能够经过删除namespace federation-system的方法来清理(注意pv不会删除)。命令在host-cluster-context上执行。
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl delete ns federation-system
集群联邦支持如下联邦资源,这些资源会自动在全部注册的kubernetes集群中建立.
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl run nginx --image nginx --context=federation [root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl expose deploy nginx --port 80 --target-port 80 --type LoadBalancer --context=federation [root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get svc --context=federation
您还能够经过kubectl scale deploy nginx --replicas=3 --context=federation
来扩展nginx副本,而后观察nginx应用在各个子集群中的分布状况。
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get deploy --context=beijing [root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get deploy --context=hangzhou
[root@iZbp1bpj58bdzdosdxxf82Z ~]# cat deployment-nginx.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 [root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl create -f deployment-nginx.yaml --context=federation
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl describe svc nginx --context=federation Name: nginx Namespace: default Labels: app=nginx Annotations: federation.kubernetes.io/service-ingresses={"items":[{"cluster":"hangzhou","items":[{"ip":"120.55.149.69"}]},{"cluster":"shanghai","items":[{"ip":"139.196.70.146"}]}]} Selector: app=nginx Type: LoadBalancer IP: LoadBalancer Ingress: 120.55.149.69, 139.196.70.146 Port: http 80/TCP Endpoints: <none> Session Affinity: None Events: <none>
经过域名访问服务:
[root@iZbp1bpj58bdzdosdxxf82Z ~]# curl nginx.default.fed.svc.spacexnice.xyz <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
咱们能够在阿里云云解析控制台看见刚刚添加的nginx的dns记录。
Federation为您提供一种多集群管理的途径,统一管理多云(multi-cloud)资源,并提供了一种灾备的新途径。阿里云Kubernetes服务也将进一步简化Federation的用户体验,将容器服务Kubernetes集群管理与Federation完美结合在一块儿。也欢迎您的意见和建议,帮助咱们迭代产品能力。 阿里云Kubernetes服务 全球首批经过Kubernetes一致性认证,简化了Kubernetes集群生命周期管理,内置了与阿里云产品集成,也将进一步简化Kubernetes的开发者体验,帮助用户关注云端应用价值创新。