阿里云上Kubernetes集群联邦

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

kubernetes集群让您能够方便的部署管理运维容器化的应用。但是实际情况中经常遇到的一些问题,就是单个集群通常无法跨单个云厂商的多个Region,更不用说支持跨跨域不同的云厂商。这样会给企业带来一些担忧,如何应对可用区级别的Fail,以及容灾备份?是否会造成厂商锁定,增加迁移成本?如何应对线上线下突发流量?如何统一管理调度容器资源?单个集群规模的上限等等。

Federation集群联邦可以一定程度上解决这些问题。Federation是可以将分布在多个Region或者多个云厂商的Kubernetes集群整合成一个大的集群,统一管理与调度。

本文档演示搭建一个杭州和北京的kubernetes集群组成集群联邦,其中杭州集群作为联邦的控制平面

准备域名

Federation使用域名将不同子集群的同一个服务暴露出来,因此需要用户提供一个可配置的域名。您可以通过万网在阿里云上购买域名然后配置到您的Federation集群上。
以域名spacexnice.xyz为例,请按照购买域名文档购买好域名。

配置域名

由于Federation在添加域名解析记录的时候设置域名的TTL为3分钟,域名层级为5级,因此需要到阿里云上对您刚购买的域名进行设置,使得该域名允许的最小TTL值小于3分钟,同时域名层级大于5.

进入云解析控制台选择您刚刚购买的域名,更多里面选[升级]或者[升级VIP]
image

image

在弹出的页面中更改最低TTL值为60s,子域名级别为7级,然后保存。

创建多个子集群

本示例创建的Federation集群包含两个子集群,分别在杭州和北京region。我们首先需要在这两个Region创建出两个可用的集群,集群创建步骤参考文档

杭州集群

[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的宿主集群,安装Federation的控制平面。并配置好本地的kubeconfig。通过运行kubefed init命令来初始化主集群。具体步骤如下:

安装kubefed

在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

配置kubeconfig

在杭州集群master节点中配置hangzhou,beijing两个集群的context,让改节点能通过切换context连接不同的子集群。要修改的内容如下:

  1. 修改hangzhou集群的kubeconfig的cluster,user,context的名字为hangzhou
  2. 拷贝beijing集群kubeconfig中的cluster,user,context内容到a)步骤中kubeconfig,并修改相应的cluster,user,context名字为beijing

为了方便初学者,我们提供了一个自动化的脚本,可以自动通过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

配置alidns.yaml文件

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平面

通过本条命令初始化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的控制平面。接下来需要将各个子集群加入到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集群中创建.

  • Federated ConfigMap
  • Federated Service
  • Federated DaemonSet
  • Federated Deployment
  • Federated Ingress
  • Federated Namespaces
  • Federated ReplicaSets
  • Federated Secrets
  • Federated Events(仅存在federation控制平面)

创建service

[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

创建deployment

[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

查看federation service

[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>

查看云解析dns的record记录

我们可以在阿里云云解析控制台看见刚刚添加的nginx的dns记录。

image

总结

Federation为您提供一种多集群管理的途径,统一管理多云(multi-cloud)资源,并提供了一种灾备的新途径。阿里云Kubernetes服务也将进一步简化Federation的用户体验,将容器服务Kubernetes集群管理与Federation完美结合在一起。也欢迎您的意见和建议,帮助我们迭代产品能力。
阿里云Kubernetes服务 全球首批通过Kubernetes一致性认证,简化了Kubernetes集群生命周期管理,内置了与阿里云产品集成,也将进一步简化Kubernetes的开发者体验,帮助用户关注云端应用价值创新。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
21天前
|
数据库 存储 监控
什么是 SAP HANA 内存数据库 的 Delta Storage
什么是 SAP HANA 内存数据库 的 Delta Storage
16 0
什么是 SAP HANA 内存数据库 的 Delta Storage
|
1天前
|
存储 运维 Kubernetes
Kubernetes 集群的监控与维护策略
【4月更文挑战第23天】 在微服务架构日益盛行的当下,容器编排工具如 Kubernetes 成为了运维工作的重要环节。然而,随着集群规模的增长和复杂性的提升,如何确保 Kubernetes 集群的高效稳定运行成为了一大挑战。本文将深入探讨 Kubernetes 集群的监控要点、常见问题及解决方案,并提出一系列切实可行的维护策略,旨在帮助运维人员有效管理和维护 Kubernetes 环境,保障服务的持续可用性和性能优化。
|
2天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化实践
【4月更文挑战第22天】在动态且复杂的微服务架构中,确保 Kubernetes 集群的高性能运行是至关重要的。本文将深入探讨针对 Kubernetes 集群性能优化的策略与实践,从节点资源配置、网络优化到应用部署模式等多个维度展开,旨在为运维工程师提供一套系统的性能调优方法论。通过实际案例分析与经验总结,读者可以掌握持续优化 Kubernetes 集群性能的有效手段,以适应不断变化的业务需求和技术挑战。
14 4
|
10天前
|
Kubernetes 搜索推荐 Docker
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
48 17
|
23天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
16 0
|
23天前
|
Kubernetes 安全 网络安全
搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群
搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群
106 0
|
30天前
|
Kubernetes Cloud Native Docker
【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0
Kubernetes 是一个开源平台,用于管理容器化工作负载和服务,提供声明式配置和自动化。源自 Google 的大规模运维经验,它拥有广泛的生态支持。本文档详细介绍了 Kubernetes 集群的搭建过程,包括服务器配置、Docker 和 Kubernetes 组件的安装,以及 Master 和 Node 的部署。此外,还提到了使用 Calico 作为 CNI 网络插件,并提供了集群功能的测试步骤。
218 0
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
27 0
|
30天前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
|
1月前
|
存储 分布式计算 网络协议
阿里云服务器内存型r7、r8a、r8y实例区别参考
在阿里云目前的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y这几个实例规格,相比于活动内的经济型e、通用算力型u1实例来说,这些实例规格等性能更强,与计算型和通用型相比,它的内存更大,因此这些内存型实例规格主要适用于数据库、中间件和数据分析与挖掘,Hadoop、Spark集群等场景,本文为大家介绍内存型r7、r8a、r8y实例区别及最新活动价格,以供参考。
阿里云服务器内存型r7、r8a、r8y实例区别参考

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多