阿里云上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的开发者体验,帮助用户关注云端应用价值创新。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
15天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
4天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
18 2
|
15天前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
15天前
|
弹性计算 调度 数据中心
阿里云 ACK One 注册集群云上弹性:扩展业务新利器
随着企业数字化转型深入,传统IDC数据中心因物理容量限制,难以实现动态扩容,缺乏弹性能力。阿里云ACK One注册集群凭借其高度灵活性和丰富资源选择,成为解决此问题的最佳方案。通过与阿里云资源的整合,ACK One不仅实现了计算资源的按需扩展,提高了资源利用率,还通过按需付费模式降低了成本,使企业能够更高效地应对业务增长和高峰需求。
|
15天前
|
运维 Kubernetes Serverless
阿里云Argo X K8s玩转工作流引擎,实现大规模并行计算
本文基于2024云栖大会田双坤的演讲,介绍了Kubernetes作为云原生操作系统的角色及其在各类任务中的应用,重点探讨了Argo Workflows在Kubernetes上编排并行任务的能力。面对自建Argo Workflows的挑战,如稳定性、成本和安全性等问题,阿里巴巴云推出了全托管的Serverless Argo工作流,提供全托管、免运维、可观测和易集成的特点,显著提升了任务编排的效率和稳定性。适用于数据处理、科学计算、自动驾驶仿真等多个领域。
|
15天前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
15天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
容器 Kubernetes Perl
阿里云Kubernetes平台构建和管理实践(上)
阿里云智能容器平台解决方案架构师徐征讲解阿里云Kubernetes平台构建和管理实践,徐征主要从事帮助企业在面向云原生的应用转型的过程中提供解决方案和相应的工作。
10914 0
|
容器 Perl 监控
阿里云Kubernetes平台构建和管理实践(下)
阿里云智能容器平台解决方案架构师徐征讲解阿里云Kubernetes平台构建和管理实践,徐征主要从事帮助企业在面向云原生的应用转型的过程中提供解决方案和相应的工作。
3292 0

相关产品

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

    更多