热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes1.2新功能解析:multizone(多区)支持

导论Kubernetes1.2增加的一个新的功能是把一个集群跑在多个failurezone里(谷歌GCE管它叫“zone”,亚马逊AWS管它们叫“ava

导论

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 kubernetes/cluster/kube-down.shKUBERNETES_PROVIDER=aws KUBE_USE_EXISTING_MASTER=true KUBE_AWS_ZONE=us-west-2b kubernetes/cluster/kube-down.shKUBERNETES_PROVIDER=aws KUBE_AWS_ZONE=us-west-2a kubernetes/cluster/kube-down.sh

原文链接点这里



推荐阅读
  • 本文探讨了K近邻(KNN)算法中K值的选择对模型复杂度的影响,通过实验分析不同K值下的模型表现,旨在为KNN算法的应用提供指导。 ... [详细]
  • 使用 NDB 提升 Node.js 应用调试体验
    本文介绍了由 Google Chrome 实验室推出的新一代 Node.js 调试工具 NDB,旨在为开发者提供更加高效和便捷的调试解决方案。 ... [详细]
  • JavaScript 实现购物商城商品图片放大功能
    本文介绍了如何使用 JavaScript 和 CSS 实现购物商城中商品图片的放大功能,解决了图片放大时文字位置变化的问题,并提供了详细的代码示例。 ... [详细]
  • 本文介绍了如何利用高德地图API实现一个高效的地点选择组件,适用于需要用户选择具体位置的应用场景,如活动邀请函填写等。该组件支持从地图中选择地点,并自动将地点信息回填至表单中。 ... [详细]
  • vue基础——表单输入绑定
    一、基础用法你可以用v-model指令在表单及元素上创建双向数据绑定。它会根据控件类型自动选择正确的方法来更新元素。尽管有些神奇,但 ... [详细]
  • 解决getallheaders函数导致的500错误及8种服务器性能优化策略
    本文探讨了解决getallheaders函数引起的服务器500错误的方法,并介绍八种有效的服务器性能优化技术,包括内存数据库的应用、Spark RDD的使用、缓存策略的实施、SSD的引入、数据库优化、IO模型的选择、多核处理策略以及分布式部署方案。 ... [详细]
  • 本文介绍了如何在 Linux 系统上构建网络路由器,特别关注于使用 Zebra 软件实现动态路由功能。通过具体的案例,展示了如何配置 RIP 和 OSPF 协议,以及如何利用多路由器查看工具(MRLG)监控网络状态。 ... [详细]
  • 本文详细介绍了如何通过 `vue.config.js` 文件配置 Vue CLI 的打包和代理设置,包括开发服务器配置、跨域处理以及生产环境下的代码压缩和资源压缩。 ... [详细]
  • Web安全入门:MySQL基础操作与SQL注入防范
    本文详细介绍了MySQL数据库的基础操作命令,包括数据库和表的基本管理,以及数据的增删查改等常用操作。同时,针对Web安全领域常见的SQL注入问题,提供了初步的理解和防范措施。 ... [详细]
  • 实现‘点击恢复’功能 - Tap-to-Resume Feature in SpriteKit
    了解如何在应用程序从非活动状态返回时,在SpriteKit游戏中添加一个‘点击恢复’的文字提示。 ... [详细]
  • 前端进阶:深入解析uni-app页面配置
    本文详细探讨了uni-app框架中的页面配置方法,包括启动页设置、全局样式调整以及底部导航栏的设计等关键点。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • IOSG Weekly Brief | Fat NFT Thesis 与艺术朋克 #68
    IOSG Weekly Brief | Fat NFT Thesis 与艺术朋克 #68 ... [详细]
  • CSV 文件的存取
    CSV文件介绍CSV(Comma-SeparatedValues),中文通常叫做逗号分割值。CSV文件由任意数目的记录(行& ... [详细]
  • GNU 发布的 glibc 是 Linux 系统中最基础的 C 运行库,提供了一系列底层 API,几乎所有其他运行库都依赖于它。本文详细介绍了 glibc 的主要功能和服务,并探讨了其在系统开发中的重要性。 ... [详细]
author-avatar
秋天的紫丁香
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有