Clusternet v0.5.0 重磅发布: 全面解决多集群应用分发的差异化配置难题
作者:
徐迪,腾讯云容器技术专家。
汝英哲,腾讯云高级产品经理。
在做多集群应用分发的时候,经常会遇到以下的差异化问题,比如:
-
在分发的资源上全部打上统一的标签,比如
apps.my.company/deployed-by: my-platform
; -
在分发到子集群的资源上标记集群的信息,比如
apps.my.company/running-in: cluster-01
; -
调整应用在每个集群中的副本数目、镜像名称等等,比如有一个名为
my-nginx
(声明的副本数为 3)的Deployment
应用要分发到集群 cluster-01,集群 cluster-02,集群 cluster-03 中,我希望在这三个集群的副本数目分别为 3,5,7; -
在分发到集群 cluster-01 之前,调整应用在该集群中的一些配置,比如注入一个 Sidecar 容器等;
-
遇到某些特殊场景时,例如大促,动态扩容,应用灰度升级时,希望可以针对某个集群进行操作,变更范围小,不影响到其他集群,同时出现问题的时候,可以及时回滚,恢复到变更前的状态;
-
如果定义了多个差异化配置,相互之间出现冲突时,该如何解决;
开源 Clusternet 项目简介
Clusternet ( Cluster Internet ) 是腾讯云开源的兼具多集群管理和跨集群应用编排的云原生管控项目,让使用多集群就像上网一样简单。无论你的 Kubernetes 集群是运行在公有云、私有云、混合云还是边缘云上,都拥有一致的管理/访问体验,利用 K8s API 集中部署和协调多集群的应用程序和服务。
Clusternet 采用 Addon 插件的方式,方便用户一键安装、运维及集成,轻松地管理数以百万计的 Kubernetes 集群,让云计算像 Internet 一样无所不在,自由便捷。
Clusternet 支持向不同集群分发和管理各种应用资源,包括原生 Kubernetes 各类资源(Deployment/StatefulSet/ConfigMap/Secret 等)、各类 CRD 资源,以及 HelmChart 应用等等。
Clusternet 如何解决这些差异化配置难题
Clusternet 在设计应用分发模型的时候,就充分考虑到了上述的那些场景,不希望引入过多的复杂设计,尽量减少用户的重复定义,做到精简化、方便配置、可扩展性强、便于变更回滚等等。
如果我们将上述的差异化问题进行归纳,大致可以归纳为以下两类:
- 通用化配置或者全局化配置,比如对于某些资源进行无差异化的打标签,预配置等等;
- 专属于某个集群的配置,比如更改
Deployment
在某集群对应的副本数,升级镜像,增加 Sidecar 容器等等;
下图是 Clusternet 的多集群应用分发模型,其中绿色的模块是需要用户去创建的,紫色的模块是 Clusternet 内部做流转的资源对象。Clusternet 提供了 kubectl 插件,可以通过 “kubectl clusternet apply” 命令来创建资源。欢迎阅读 Clusternet - 新一代开源多集群管理与应用治理项目,了解图中的相关概念。
Clusternet 资源分发模型采用松耦合的设计,用户无须更改或重新编写已有的资源对象,仅需要额外定义分发策略 (Subscription
)和差异化配置(Localization
/Globalization
)即可实现多集群的应用分发。
Localization 与 Globalization
在 Clusternet 中,每个注册的集群,都会拥有一个专属的 namespace (命名空间),因此我们分别定义了 Localization
和 Globalization
这两个 CRD 用于声明差异化配置。
其中 Localization
描述 namespace-scoped (命名空间作用域)的差异化配置策略,可用于对单个集群进行配置,比如 Deployment
在这个集群中的副本数目等。而 Globalization
描述 cluster-scoped (集群作用域) 的差异化配置策略,比如修改某个 HelmChart
的通用配置等。
Override 策略
Clusternet 还提供了两种 Overide 策略:ApplyLater
(默认的策略)和 ApplyNow
。
ApplyLater
意味着该 Localization
/Globalization
的差异化配置不会立即应用到资源上,只会在随后新创建出来的 Description
对象或者 HelmChart
/Subscription
/Description
等各个资源对象更新的时候才生效。而 ApplyNow
意味着会创建后即时生效,Clusternet 会将定义的差异化配置应用到所有匹配的对象中,即时下发到对应的子集群中。
Priority 优先级
此外,两者均支持按照 Priority(优先级)进行管理和配置,优先级的高低通过 0-1000 的数值来定义,值越小,优先级越低,默认是500。在进行差异化渲染的时候,Clusternet 会按照 Globalization
(低优先级) -> Globalization
(高优先级) -> Localization
(低优先级) -> Localization
(高优先级) 的次序,依次将声明的 Override 进行 apply。
正是借助于这种两阶段基于优先级(two-stage priority based)的差异化配置能力,Clusternet 可以很方便地支持面向多集群的蓝绿发布、金丝雀发布、版本升级等场景。在使用过程中, 你可以定义多个 Globalization
和 Localization
对象,并设置不同的优先级策略。
支持 Patch 操作
Clusternet 支持两种格式的 Override,JSON Patch
(RFC 6902[1]) 和 JSON Merge Patch
(RFC 7396[2])。有关 JSON patch 和 JSON 合并 patch 的比较,大家可以查看 JSON Patch 和 JSON Merge Patch[3],也可以参照如下的典型示例。
典型示例
下面我们来看几个典型的差异化配置场景。在如下的例子中,我们通过 Localization
对象来统一展示。这里使用 Globalization
也是可以的,这两者的 Spec 定义都是一样的,唯一的区别这两者的作用域和优先级差别。大家在实际使用的时候,可以根据需要进行改写。
增加/更新标签
如果我们想给某个对象增加或者更新标签,可以这么定义如下的 Localization
对象。在使用的时候,请将 metadata.namespace
的值替换为真实的注册集群的专属 namespace。
apiVersion: apps.clusternet.io/v1alpha1 kind: Localization metadata: name: nginx-local-overrides-demo-label namespace: clusternet-5l82l # 请更新这个值为对应集群的 namespace spec: overridePolicy: ApplyLater # 优先级反映着该对象的重要性,数值范围从 0 到 1000,值越小表示优先级越低 # 默认的值为 500. priority: 300 feed: # 这里表示要 override 的对象 apiVersion: apps/v1 kind: Deployment name: my-nginx namespace: foo overrides: # 这里可以定义着多个 override - name: add-update-labels type: MergePatch # 这里需要指定 override 的类型 # value 可以是 yaml 格式,也可以是 json 格式。 # 如下是 json 格式的例子 value: '{"metadata":{"labels":{"deployed-in-cluster":"clusternet-5l82l"}}}'
可以在一个 Localization
对象中定义多个 overrides,在上面的例子中,我们只定义了一个名为 add-update-labels
的 override,其值为 json 格式的字符串,目的是增加或者更新一个标签 deployed-in-cluster: clusternet-5l82l
到 spec.feed
所定义的对象中。
这里 override 的值也可以 yaml 格式,见如下的例子。
apiVersion: apps.clusternet.io/v1alpha1 kind: Localization metadata: name: nginx-local-overrides-demo-label namespace: clusternet-5l82l # 请更新这个值为对应集群的 namespace spec: overridePolicy: ApplyLater # 优先级反映着该对象的重要性,数值范围从 0 到 1000,值越小表示优先级越低 # 默认的值为 500. priority: 300 feed: # 这里表示要 override 的对象 apiVersion: apps/v1 kind: Deployment name: my-nginx namespace: foo overrides: # 这里定义着 override value - name: add-update-labels type: MergePatch # value 可以是 yaml 格式,也可以是 json 格式。 # 如下是 yaml 格式的例子 value: |- metadata: labels: deployed-in-cluster: clusternet-5l82l
替换镜像及副本数目
Override 的类型也可以指定为 JSONPatch
。在实际使用的时候,可以根据需要选择一个合适的 override 类型即可。
通过如下的例子,可以将 Deployment foo/my-nginx
在 clusternet-5l82l
子集群中的副本数更改为 3,替换容器的镜像为 nginx:1.14.0-alpine
,并增加一个新的注释 foo: bar
。
apiVersion: apps.clusternet.io/v1alpha1 kind: Localization metadata: name: nginx-local-overrides-demo-image-replicas namespace: clusternet-5l82l # 请更新这个值为对应集群的 namespace spec: overridePolicy: ApplyLater # 优先级反映着该对象的重要性,数值范围从 0 到 1000,值越小表示优先级越低 # 默认的值为 500. priority: 400 feed: # 这里表示要 override 的对象 apiVersion: apps/v1 kind: Deployment name: my-nginx namespace: foo overrides: # 这里定义着 override value - name: scale-and-add-annotations type: JSONPatch # value 可以是 yaml 格式,也可以是 json 格式。 value: |- - path: /spec/replicas value: 3 op: replace - path: "/spec/template/spec/containers/0/image" value: "nginx:1.14.0-alpine" op: replace - path: /metadata/annotations value: foo: bar op: add
注入 Sidecar 容器
我们还可以通过 Localization
来为 Deployment foo/my-nginx
在 clusternet-5l82l
子集群下的实例注入 Sidecar 容器,见如下的示例,
apiVersion: apps.clusternet.io/v1alpha1 kind: Localization metadata: name: nginx-local-overrides-demo-sidecar namespace: clusternet-5l82l # 请更新这个值为对应集群的 namespace spec: overridePolicy: ApplyLater # 优先级反映着该对象的重要性,数值范围从 0 到 1000,值越小表示优先级越低 # 默认的值为 500. priority: 600 feed: # 这里表示要 override 的对象 apiVersion: apps/v1 kind: Deployment name: my-nginx namespace: foo overrides: # 这里定义着 override value - name: inject-new-container type: JSONPatch # value 可以是 yaml 格式,也可以是 json 格式。 value: |- - op: add path: "/spec/template/spec/containers/1" value: name: "redis-container" image: "redis:6.2.5"
通过 Localization
和 Globalization
不仅仅可以做如上的差异化配置,还有更多的场景等待着大家去发掘。
为了方便大家上手体验一番,Clusternet 提供了例子[4],大家可以参照 README 中的步骤[5]来实践一下多集群的应用分发。
参考资料
[1]RFC 6902: 【https://tools.ietf.org/html/rfc6902】
[2]RFC 7396: 【https://tools.ietf.org/html/rfc7386】
[3]JSON Patch 和 JSON Merge Patch: 【https://erosb.github.io/post/json-patch-vs-merge-patch/】
[4]例子: 【https://github.com/clusternet/clusternet/tree/main/examples/applications】
[5]README 中的步骤: 【https://github.com/clusternet/clusternet#deploying-applications-to-multiple-clusters】
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
五个维度打造研发管理体系
背景 技术管理者(技术总监/经理/CTO)期望通过体系化的管理方式建设,能够在百人,千人以上的团队中有效的构建聚焦目标,自我成长,高效能的研发作战团队,快速拿出成果,支撑业务的快速发展。 痛点 从小团队人员快速扩张,团队文化稀释,人员效能下降,目标逐渐弱化。 各自团队管理方式及标准不统一,人员管理及协同逐渐混乱。 组织扩大后,难以有效关注个人,无法准确评判个人的成长,贡献等。 目标 通过构建完整研发管理体系,建立管理机制,让技术组织聚焦目标,高效运转,同时激励团队不断优化提升。 研发管理体系构建思考 通过道,法,术,器,势五个维度去思考整个管理体系的构建。 道: 在于文化,思维,准则,价值观,领导力的构建,是思维和思想,它需要我们落到实处。 通常团队小的时候,leader 可以深入到日常的管理事务中,管理者的智慧和想法可以体现在明处并落到做事上。而当团队规模过百人的时候,组织架构一般已拆分层级,各项目和人员已经聚焦于各自产线上,甚至人员都已经分布在各个角落,新人的面孔逐渐陌生,此时我们也许需要构建文化,思维,基本准则,团队的价值观和管理者的领导力。 关注团队文化 文...
- 下一篇
从飞天到倚天 阿里云底层自研技术大爆发
10月20日,2021云栖大会上,阿里云发布了倚天、磐久、神龙4.0、龙蜥、灵杰等多款重磅产品,阿里云“做深基础”成果浮出水面,底层自研技术迎来大爆发。 阿里云智能总裁张建锋表示,过去十二年,阿里云打造出中国唯一自研的飞天云操作系统。今天阿里云坚持自研,继续“向下生长”,从飞天到倚天,打造以云为基础的软硬件技术体系。“构建完整的技术体系,是我们在数字时代具备全球竞争力的决定性因素”。 倚天:为云而生的芯片 飞天云操作系统是阿里云的核心“引擎”, 为了提供更好的计算产品和服务,飞天向下延伸、定义硬件。19日,阿里巴巴发布首款通用芯片——倚天710,这是一款为云而生的芯片,针对云计算的特点做了大量优化,性能超过业界标杆20%,能效比提升50%以上。 架构层面,倚天710采用最新ARMv9架构,多达128核,主频最高3.2GHz,可同时兼顾性能和功耗。同时,集成了业界最领先的DDR5、PCIE5.0等技术,能有效提升芯片的传输速率,并且可适配云的不同应用场景。 磐久:自研云原生服务器系列 面向下一代云原生架构,19日阿里云还推出了磐久自研服务器系列,采用了最新型的模块化设计,可实现计算存储分...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器
- Hadoop3单机部署,实现最简伪集群