Skip to content

Latest commit

 

History

History
128 lines (99 loc) · 3.45 KB

dynamic-config.md

File metadata and controls

128 lines (99 loc) · 3.45 KB

Terway 节点动态配置

Terway的配置文件是作为 ConfigMap 资源对象存放在 etcd 中(默认名称为 eni-config )。其内容如下:

{
  "version": "1",
  "access_key": "ak",
  "access_secret": "ak",
  "security_group": "sg-xxx",
  "service_cidr": "10.96.0.0/12",
  "vswitches": {
    "cn-hangzhou-g": ["vsw-xxx"]
  },
  "max_pool_size": 5,
  "min_pool_size": 0
}
名称 描述
version 版本
access_key AccessKey
access_secret AccessSecret
security_group 安全组ID
service_cidr 服务CIDR(使用ipvlan时)
vswitches 关联的虚拟交换机(ENI多IP模式)
max_pool_size 资源池最大水位
min_pool_size 资源池最小水位

关于terway的资源管理机制可见此处

ConfigMap 将挂载入 terway daemon 的Pod中,并在 daemon 启动时读取。下文中将其称为默认配置

除此之外,Terway 还加入通过label为单节点指定动态配置文件的功能。

在节点标签中加入:

terway-config: <config_name>

daemon 在启动时会获得配置文件名,并获取同命名空间下ConfigMap: <config_name>

并以其中的eni_conf值作为动态配置

(如 terway-config: eni-config-node1 则会获取 eni-config-node1 作为动态配置的 ConfigMap)

获取到的该动态配置将会以MergePatch的形式合并到默认配置上。

如动态配置为:

{
  "vswitches": {
    "cn-hangzhou-g": ["vsw-10000"]
  },
  "max_pool_size": 10
}

默认配置如上,则最终 daemon 中读取的配置为:

{
  "version": "1",
  "access_key": "ak",
  "access_secret": "ak",
  "security_group": "sg-xxx",
  "service_cidr": "10.96.0.0/12",
  "vswitches": {
    "cn-hangzhou-g": ["vsw-10000"]
  },
  "max_pool_size": 10,
  "min_pool_size": 0
}

image.png

注:若在现有节点上设置或更换动态配置,需要对daemon进行重启才能够应用。且daemon之前已经申请到的与配置相关的资源(如ENI等)可能仍旧会保留在daemon中。

可以结合阿里云容器服务控制台的节点池功能,批量为多个节点指定不同配置,达到对集群中不同节点的网络分划、资源水位调节、访问控制等精细化配置。

关于合并配置

terway 使用了 json-patch 库来对配置进行合并,其实现了 RFC7396 中声明的 MergePatch 过程。

当遇到多层嵌套的 Object 结构时,也会进行部分合并。如默认配置(部分)

{
    "vswitches": {
      "cn-hangzhou-g": ["vsw-xxx"],
      "cn-hangzhou-i": ["vsw-yyy"]
  }
}

应用动态配置

{
    "vswitches": {
      "cn-hangzhou-g": ["vsw-10000"]
  }
}

时,最终得到的结果为

{
    "vswitches": {
      "cn-hangzhou-g": ["vsw-10000"],
      "cn-hangzhou-i": ["vsw-yyy"]
    }
}

若要移除 cn-hangzhou-i,请设置动态配置为

{
    "vswitches": {
      "cn-hangzhou-g": ["vsw-10000"],
      "cn-hangzhou-i": null
  }
}