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) 和 JSON Merge Patch
(RFC 7396)。有关 JSON patch 和 JSON 合并 patch 的比较,大家可以查看 JSON Patch 和 JSON Merge Patch,也可以参照如下的典型示例。
典型示例
下面我们来看几个典型的差异化配置场景。在如下的例子中,我们通过 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 提供了例子,大家可以参照 README 中的步骤来实践一下多集群的应用分发。
加入我们
Clusternet 项目开源进行时,请关注 https://github.com/clusternet/clusternet 点赞支持,欢迎加入我们一起贡献更多的功能。
相关链接
[1] https://github.com/clusternet/clusternet
[2] https://github.com/clusternet/kubectl-clusternet
[3] https://krew.sigs.k8s.io/plugins/
关于我们
更多关于云原生的案例和知识,可关注同名【腾讯云原生】公众号~
福利:
①公众号后台回复【手册】,可获得《腾讯云原生路线图手册》&《腾讯云原生最佳实践》~
②公众号后台回复【系列】,可获得《15个系列100+篇超实用云原生原创干货合集》,包含Kubernetes 降本增效、K8s 性能优化实践、最佳实践等系列。
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!
Clusternet v0.5.0 重磅发布: 全面解决多集群应用分发的差异化配置难题的更多相关文章
- 灵雀云开源网络插件Kube-OVN 1.4.0 版发布!支持跨集群容器网络、NetworkPolicy 日志
从 1.4 开始 Kube-OVN 支持将多个 Kubernetes 集群容器网络打通,不同集群之间的 Pod 可以通过 Pod IP 直接互相通信.本版本还支持 ACL 日志,可以记录因 Netwo ...
- julia,集Python、C++、R为一体!Julia 1.0重磅发布, MIT发布史上最强科学计算编程语言?创始人独家解答11个问题
这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 C 语言的速度.Ruby 的灵活.Python 的通用性前所未有地结合在一起,支持并行处理,易于学习和使用,尤其适合科学和工程 ...
- 云数据库 MySQL 8.0 重磅发布,更适合企业使用场景的RDS数据库
点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 云数据库MySQL 8.0 升级发布会 2019年5月29日15时,阿里云云数据 ...
- Sentinel 1.7.0 发布,支持 Envoy 集群流量控制
流控降级中间件Sentinel 1.7.0版本正式发布,引入了 Envoy 集群流量控制支持.properties 文件配置.Consul/Etcd/Spring Cloud Config 动态数据源 ...
- Redis 5.0.7 讲解,单机、集群模式搭建
Redis 5.0.7 讲解,单机.集群模式搭建 一.Redis 介绍 不管你是从事 Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业 ...
- Clusternet:一款开源的跨云多集群云原生管控利器!
作者 徐迪,Clusternet 项目发起人,腾讯云容器技术专家. 摘要 Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云 ...
- Quartz2.0以上版本的单机和集群
(一)Quartz单机 1.Quartz简介 Quartz是一个完全由java编写的开源作业调度框架,能实现业务的定时调度.Quartz主要有三个核心调度器.任务和触发器: ①任务-JobDetail ...
- 国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置
简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster.这次大变革被称为M ...
- redis 4.0.8 源码包安装集群
系统:centos 6.9软件版本:redis-4.0.8,rubygems-2.7.7,gcc version 4.4.7 20120313,openssl-1.1.0h,zlib-1.2.11 y ...
随机推荐
- JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )
题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...
- Zookeeper:进大厂不得不学的分布式协同利器!
大家好,我是冰河~~ 最近,有很多小伙伴让我更新一些Zookeeper的文章,正好也趁着清明假期把之前自己工作过程当中总结的Zookeeper知识点梳理了一番,打算写一个[精通Zookeeper系列] ...
- GoLang设计模式3 - 抽象工厂模式
之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式.抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象. UML类图大致如下: 类图比较复杂 ...
- MyBatis学习总结(四)——字段名与实体类属性名不相同的冲突的解决
表中的字段名和表对应实体类的属性名称不一定都是完全相同的,这种情况下的如何解决字段名与实体类属性名不相同的冲突.如下所示: 一.准备演示需要使用的表和数据 CREATE TABLE my_user( ...
- Shiro02
Shiro认证 Pom依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>s ...
- DSP开发笔记一
前言 本笔记首先对DSP的特点及其选型进行了描述,然后重点记录DSP开发环境的搭建及基础工程示例,对为DSP开发新手有一定的指导作用. 1. DSP简介 1.1 主要特点 在一个指令周期内可完成一 ...
- ipsec.conf配置文件多个保护子网解析流程
Author : Email : vip_13031075266@163.com Date : 2021.01.23 Copyright : 未经同意不得 ...
- 微信小程序开发正常,真机预览模式错误
原因是开发时设置了不检查域名是否合法,去后台设置上就可以了
- Linux系列(22) - 用户登录查看命令
需求 查看当前在线用户情况:历史用户登录情况 W 格式 [root@localhost ~]# w:查看所有登录用户信息 [root@localhost ~]# w [用户名]:查看指定登录用户信息 ...
- 重磅来袭!!!Elasticsearch7.14.1(ES 7.14.1)与Springboot2.5.4的整合
1. 概述 前面我们聊了 Elasticsearch(ES)集群的搭建,今天我们来聊一下,Elasticsearch(ES)集群如何与 Springboot 进行整合. Elasticsearch(E ...