ITPub博客

首页 > 云计算 > 容器服务 > Clusternet v0.5.0 重磅发布: 全面解决多集群应用分发的差异化配置难题

Clusternet v0.5.0 重磅发布: 全面解决多集群应用分发的差异化配置难题

原创 容器服务 作者:腾讯云原生 时间:2021-10-21 15:31:24 0 删除 编辑

徐迪,腾讯云容器技术专家。
汝英哲,腾讯云高级产品经理。


在做多集群应用分发的时候,经常会遇到以下的差异化问题,比如:
  1. 在分发的资源上全部打上统一的标签 ,比如  apps.my.company/deployed-by: my-platform ;

  2. 在分发到子集群的资源上标记集群的信息 ,比如  apps.my.company/running-in: cluster-01 ;

  3. 调整应用在每个集群中的副本数目、镜像名称等等 ,比如有一个名为  my-nginx  (声明的副本数为 3)的  Deployment  应用要分发到集群 cluster-01,集群 cluster-02,集群 cluster-03 中,我希望在这三个集群的副本数目分别为 3,5,7;

  4. 在分发到集群 cluster-01 之前,调整应用在该集群中的一些配置,比如注入一个 Sidecar 容器等;

  5. 遇到某些特殊场景时 ,例如大促,动态扩容,应用灰度升级时,希望可以针对某个集群进行操作,变更范围小,不影响到其他集群,同时出现问题的时候,可以及时回滚,恢复到变更前的状态;

  6. 如果定义了多个差异化配置,相互之间出现冲突时,该如何解决;

开源 Clusternet 项目简介

Clusternet (  Cluster Inter net ) 是腾讯云开源的兼具多集群管理和跨集群应用编排的云原生管控项目, 让使用多集群就像上网一样简单。无论你的 Kubernetes 集群是运行在公有云、私有云、混合云还是边缘云上,都 拥有一致的管理/访问体验,利用 K8s API 集中部署和协调多集群的应用程序和服务。

Clusternet 采用  Addon  插件的方式, 方便用户一键安装、运维及集成,轻松地管理数以百万计的 Kubernetes 集群, 让云计算像 Internet 一样无所不在,自由便捷。
Clusternet 支持向不同集群分发和管理各种应用资源,包括原生 Kubernetes 各类资源(Deployment/StatefulSet/ConfigMap/Secret 等)、各类 CRD 资源,以及 HelmChart 应用等等。

Clusternet 如何解决这些差异化配置难题

Clusternet 在设计应用分发模型的时候,就充分考虑到了上述的那些场景,不希望引入过多的复杂设计, 尽量 减少用户的重复定义,做到精简化、方便配置、可扩展性强、便于变更回滚等等。
如果我们将上述的差异化问题进行归纳,大致可以归纳为以下两类:
  1. 通用化配置或者全局化配置,比如对于某些资源进行无差异化的打标签,预配置等等;
  2. 专属于某个集群的配置,比如更改  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]来实践一下多集群的应用分发。

加入我们

Clusternet 项目开源进行时,欢迎关注  https://github.com/clusternet/clusternet  点赞支持。

我们正在限量召集 Clusternet 的开源技术粉丝,只要你对 Clusternet 或者多集群管理相关技术感兴趣,都欢迎加入,参与方式: 添加腾小云二维码,回复: clusternet,小云会拉你进群。
图片
我们的开源技术粉丝将可以享受到以下特殊福利哦~
  • 专属开源技术粉丝交流群

  • 与项目作者、业内专家等直接交流

  • 更多社区活动和福利等你来参加


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69984638/viewspace-2838586/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-09-27

  • 博文量
    115
  • 访问量
    62042