写点什么

Kubernetes 1.2 新功能解析:multizone(多区)支持

  • 2020-03-12
  • 本文字数:2679 字

    阅读完需:约 9 分钟

Kubernetes 1.2 新功能解析:multizone(多区)支持

Kubernetes 1.2 增加的一个新的功能是把一个集群跑在多个 failure zone 里(谷歌 GCE 管它叫“zone”,亚马逊 AWS 管它们叫“availability zones”,这里我们统称它们为“zones”)。这是把多个 K8S 集群联合起来(被称为“Ubernetes”)的一个轻便的版本。Ubernetes 会允许把在多个云或者不同地区的多个 K8S 集群联合起来。然而,很多开发者近是简单地想把他们云上地 K8S 集群跑在不同 zone 里,这就是 K8S 的 1.2 版本所提供的 multizone(多区)支持(我们称之为“Ubernetes Lite”)。


K8S 1.2 特意对多区支持做了一些限制:一个简单的 K8S 集群可以跑在多区,但只能是在同一个地区(和同一个云上)。只有谷歌的 GCE 和亚马逊的 AWS 目前被自动的支持(尽管通过给节点和数据卷安排添加适当的标签来给其他云或者裸机加入类似的支持很容易)。

功能:

当节点启动之后,kubelet 自动给它们添加 zone 信息的标签。K8S 会自动在单个区的单个集群的冗余控制器(RC)内平均分布 pods 或者在节点上分布服务(来减少失败带来的影响)。对于多区集群来说,这种平均分布的行为也应该是跨区(来减少区挂掉的影响)。(这是通过 SelectorSpreadPriority 来实现的)。这是最理想的方式,但如果你集群所在的 zone 是不同的(比如,节点数量不同,节点类型不同或者不同的节点资源要求),这些都会有可能导致无法完美的跨区平均分布 pods。如果可以的话,你可以使用同一个区(同样的节点数量和节点类型)来减少不平均分配的概率。


当建立持久数据卷时,PersistentVolumeLabel 管理控制器自动会把 zone 标签加给数据卷。调度器(通过 VolumeZonePredicate)会确保 pod 和分配给这个 pod 的数据卷在同一个 zone 里,因为数据卷不能跨区。

限制:

对于多区支持有如下几个限制


  1. 我们假定不同的区互相距离很近,所以我们不做任何路由。尤其,通过服务过来的请求可能是跨区的(即使在一些 pods 里的 pod 是支持这些服务的且这些 pods 和 client 同区),这可能会导致额外的延迟和开销。


2.数据卷对区有粘性,只能以 PersistentVolume 来工作,比如说如果你特地在 pod 的参数里指定一个 EBS 数据卷是无法奏效的。


3.集群不能跨云跨地区(这个功能要靠 K8S 完整版的集群联合支持)。


4.尽管你的节点在多个区,kube-up 现在默认是跑一个单一的 master node。尽管服务是高可用,能在一个区内容忍一些损失,控制层是在某个单一区内。需要高可用控制层的开发者需留意关于 K8S 高可用方面的指南。

代码梳理:

现在来梳理一下如何在 GCE 和 AWS 上建立和使用一个多区集群。你需要建一个完整的集群(指定 MULTIZONE=1),然后通过再跑 kube-up 在其他区增加节点(设定 KUBE_USE_EXISTING_MASTER=true)


1. 建立你的集群


和往常一样来建立集群,传入 MULTIZONE 让集群知道去管理多区,在 us-central1-a 里创建节点:


GCE:curl -sS https://get.k8s.io | MULTIZONE=1 KUBERNETES_PROVIDER=gce KUBE_GCE_ZONE=us-central1-aNUM_NODES=3 bash
复制代码


AWS:curl -sS https://get.k8s.io | MULTIZONE=1 KUBERNETES_PROVIDER=aws KUBE_AWS_ZONE=us-west-2a NUM_NODES=3 bash
复制代码


通过这步就常规建立了一个集群,仍然在单区跑(但通过 MULTIZONE=1 赋予了多区的能力)


2. 节点打标签


看下节点,你能看到它们被打了 zone 信息的标签。它们目前都在 us-central1-a (GCE) 或者在 us-west-2a (AWS) 。这些标签,对地区来说,是 failure-domain.beta.kubernetes.io/region ;对 zone 来说是 failure-domain.beta.kubernetes.io/zone


3. 在第二个区内再加一些节点


现在让我们在一个不同的 zone 内(us-central1-b 或者 us-west-2b)利用已有的 master,在现有的集群里再加入一些节点。我们可以再跑一下 kube-up,但如果指定 KUBE_USE_EXISTING_MASTER=1 的话,kube-up 不会创建一个新的 master,但会重复使用之前已有的。


GCE:KUBE_USE_EXISTING_MASTER=true MULTIZONE=1 KUBERNETES_PROVIDER=gce KUBE_GCE_ZONE=us-central1-b NUM_NODES=3 kubernetes/cluster/kube-up.sh
复制代码


在 AWS 上我们也需要给子网指定网络 CIDR,和 master 内部的 IP 地址:


KUBE_USE_EXISTING_MASTER=true MULTIZONE=1 KUBERNETES_PROVIDER=aws KUBE_AWS_ZONE=us-west-2b NUM_NODES=3 KUBE_SUBNET_CIDR=172.20.1.0/24 MASTER_INTERNAL_IP=172.20.0.9 kubernetes/cluster/kube-up.sh


这时候再看下节点,应该增加了三个节点,在 us-central1-b 里。


4. 数据卷和 zone 的粘性


通过新的动态数据卷创建来创立一个数据卷(只有持久数据卷才能保证数据卷和 zone 的粘性)



持久数据卷也被打了标签,标明了它被创建的地区和 zone。在 K8S 1.2 版本里,动态的持久数据卷总是被建在集群 master 同区(在现在这个例子里,是在 us-centaral1-a / us-west-2a);这在完整版中会提高。


所以,现在我们要来创建一个 pod,来使用持久数据卷。因为 GCE PDS/AWS EBS 数据卷都不能跨区,这意味着 pod 只能被创建在和数据卷同区内。



5. Pods 跨区的分布


在冗余控制器(RC)里的 pod 或者服务会被自动地跨区分布。首先,让我们在第三个区内再生成一些节点


GCE:


KUBE_USE_EXISTING_MASTER=true MULTIZONE=1 KUBERNETES_PROVIDER=gce KUBE_GCE_ZONE=us-central1-f NUM_NODES=3 kubernetes/cluster/kube-up.sh
复制代码


AWS:


KUBE_USE_EXISTING_MASTER=true MULTIZONE=1 KUBERNETES_PROVIDER=aws KUBE_AWS_ZONE=us-west-2c NUM_NODES=3 KUBE_SUBNET_CIDR=172.20.2.0/24 MASTER_INTERNAL_IP=172.20.0.9 kubernetes/cluster/kube-up.sh
复制代码


检查一下你在三个区里有节点:


kubectl get nodes --show-labels
复制代码


建立一个 K8S 教程里 guestbook-go 例子,包含一个 RC,数量写 3,跑一个简单的 web 应用:


find kubernetes/examples/guestbook-go/ -name '*.json' | xargs -I {} kubectl create -f {}
复制代码


pods 应该跨三个区分布:



负载均衡器在一个集群之内跨区,在 K8S 标准教程 guestbook-go 里有这个负载均衡器服务的例子:



负载均衡器目前指向所有的 pods,尽管它们在不同的区里。


6. 关闭集群


结束之后,清理一下


GCE:


KUBERNETES_PROVIDER=gce KUBE_USE_EXISTING_MASTER=true KUBE_GCE_ZONE=us-central1-f kubernetes/cluster/kube-down.shKUBERNETES_PROVIDER=gce KUBE_USE_EXISTING_MASTER=true KUBE_GCE_ZONE=us-central1-b kubernetes/cluster/kube-down.shKUBERNETES_PROVIDER=gce KUBE_GCE_ZONE=us-central1-a kubernetes/cluster/kube-down.sh
复制代码


AWS:


KUBERNETES_PROVIDER=aws KUBE_USE_EXISTING_MASTER=true KUBE_AWS_ZONE=us-west-2c kuberne
复制代码


本文转载自才云 Caicloud 公众号。


原文链接: https://mp.weixin.qq.com/s/dzgWthBXVOqYRmw-W4OkjA


2020-03-12 22:52817

评论

发布
暂无评论
发现更多内容

如何预测市场趋势和潜在价格变动?请收好这份「加密货币蜡烛图」解读指南

TechubNews

鸿蒙Flutter实战:02-Windows环境搭建踩坑指南

星释

flutter 鸿蒙 HarmonyOS

鸿蒙Flutter实战:07-混合开发

星释

flutter 鸿蒙 HarmonyOS

DApp开发定制:合约设计与源码搭建支持快速上线

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

Premiere Pro 2025 for mac(adobe pr 2025) 特别版

你的猪会飞吗

mac破解软件下载 pr2025下载

哪些开源项目管理工具值得尝试?8款功能对比

爱吃小舅的鱼

开源项目管理工具

ABB宣布收购Aurora Motors

财见

鸿蒙Flutter实战:05-使用第三方插件

星释

flutter 鸿蒙 HarmonyOS

实时防护,清洗服务可用性达99.95%,江苏杰邦芜湖DC安全基地正式上线

江湖老铁

鸿蒙Flutter实战:09-现有Flutter项目支持鸿蒙

星释

flutter 鸿蒙 HarmonyOS

鸿蒙Flutter实战:04-如何使用DevTools调试Webview

星释

flutter 鸿蒙 HarmonyOS

鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0

星释

flutter 鸿蒙 HarmonyOS

MySQL 8.0 执行COUNT()很慢原因分析

GreatSQL

如何确保度量过程中收集到的数据是有实际意义的?

思码逸研发效能

研发效能 数据研发 研发效能度量 研发效能管理

团子东子开奖了,这泼天的富贵!

王磊

【论文速读】| APOLLO:一种基于 GPT 的用于检测钓鱼邮件并生成警告用户的解释的工具

云起无垠

项目管理:产品经理的成功之道

爱吃小舅的鱼

产品经理

鸿蒙Flutter实战:08-如何调试代码

星释

flutter 鸿蒙 HarmonyOS

豆包MarsCode 助力:Canvas 上的素描变色魔法✨

豆包MarsCode

程序员 AI 开发 代码 可画

TDengine 签约蘑菇物联,改造通用设备工业互联网平台

TDengine

数据库 tdengine 时序数据库

亚太地区人工智能应用加速,战略数据管理仍是关键

财见

鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview

星释

flutter 鸿蒙 HarmonyOS

开发全球化体育直播平台,如何克服语言与版权挑战?

软件开发-梦幻运营部

从热数据到冷数据:TDengine 多级存储如何助力智能数据管理

TDengine

数据库 tdengine 时序数据库

如何理解ETLCloud在iPaas中的关键角色

RestCloud

数据可视化 ETL 数据集成 集成平台 ipaas

鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件

星释

flutter 鸿蒙 HarmonyOS

鸿蒙Flutter实战:10-常见问题集合

星释

flutter 鸿蒙 HarmonyOS

度量数据是人工凭感觉录入的,产生的偏差如何解决?

思码逸研发效能

DevOps 研发效能 效能度量 研发效能管理

Playwright:掌握Web自动化测试的新利器

霍格沃兹测试开发学社

研发团队管理中的常见挑战与解决方案

爱吃小舅的鱼

团队管理

如何选择适合中小型企业的项目管理工具?10款精选

爱吃小舅的鱼

项目管理工具

Kubernetes 1.2 新功能解析:multizone(多区)支持_语言 & 开发_才云科技_InfoQ精选文章