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 如何解决这些差异化配置难题
通用化配置或者全局化配置,比如对于某些资源进行无差异化的打标签,预配置等等; 专属于某个集群的配置,比如更改 Deployment
在某集群对应的副本数,升级镜像,增加 Sidecar 容器等等;
Subscription
)和差异化配置(Localization
/Globalization
)即可实现多集群的应用分发。Localization 与 Globalization
Localization
和 Globalization
这两个 CRD 用于声明差异化配置。Localization
描述 namespace-scoped (命名空间作用域)的差异化配置策略,可用于对单个集群进行配置,比如 Deployment
在这个集群中的副本数目等。而 Globalization
描述 cluster-scoped (集群作用域) 的差异化配置策略,比如修改某个 HelmChart
的通用配置等。Override 策略
ApplyLater
(默认的策略)和 ApplyNow
。ApplyLater
意味着该 Localization
/Globalization
的差异化配置不会立即应用到资源上,只会在随后新创建出来的 Description
对象或者 HelmChart
/Subscription
/Description
等各个资源对象更新的时候才生效。而 ApplyNow
意味着会创建后即时生效,Clusternet 会将定义的差异化配置应用到所有匹配的对象中,即时下发到对应的子集群中。Priority 优先级
Globalization
(低优先级) -> Globalization
(高优先级) -> Localization
(低优先级) -> Localization
(高优先级) 的次序,依次将声明的 Override 进行 apply。Globalization
和 Localization
对象,并设置不同的优先级策略。支持 Patch 操作
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
替换镜像及副本数目
JSONPatch
。在实际使用的时候,可以根据需要选择一个合适的 override 类型即可。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 项目开源进行时,欢迎关注 https://github.com/clusternet/clusternet 点赞支持。
专属开源技术粉丝交流群
与项目作者、业内专家等直接交流
更多社区活动和福利等你来参加
互动赢好礼
精读文章,填问卷赢T恤
诚挚感兴趣的开发者和合作伙伴一起参与 Clusternet 项目,点击链接/点击“阅读原文”参与Clusternet调查(https://wj.qq.com/s2/8944628/e91f/) ,我们准备了 10 件腾讯定制技术范T恤给到填写问卷的同学,马上参与吧!活动截止到10月22日上午11点。
参考资料
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】
往期精选推荐