You need to enable JavaScript to run this app.
导航

通过配置 vci-profile 使用 VCI

最近更新时间2024.04.08 14:54:44

首次发布时间2024.02.05 10:52:38

弹性容器实例和容器服务提供 vci-profile 能力,可无侵入式支持业务下发至 VCI Pod。

功能介绍

vci-profile 是 VCI 配置文件,提供集群或命名空间维度的 VCI 资源使用统一配置以及全局固定配置的能力。减少用户对于业务工作负载 YAML 的修改,同时能够更加便捷、高效以及无侵入式使用 VCI 能力,避免用户混淆运维管理和业务管理的情况。

使用说明

目前通过 vci-profile 选择并调度至 VCI 资源的行为属于“软性调度”,即最终 Pod 的调度结果会受到集群中的 VCI Annotation、弹性资源优先级调度策略(Resource Policy)等能力共同作用的影响,因此存在可能导致 Pod 最终未调度至 VCI 的情况。

功能之间的相互影响说明如下:

功能说明作用域作用效果
VCI Annotation指强制使用 VCI 的 Annotation:vke.volcengine.com/burst-to-vci: enforce。该功能解决单个 Pod 是否调度到 VCI 的问题。工作负载硬性调度至 VCI,ResourcePolicy 策略无效。
vci-profile 文件该功能解决无侵入式使用 VCI 的问题。集群软性调度至 VCI,会受到 ResourcePolicy 策略影响。详细说明见下方正文。
弹性资源优先级调度该功能解决 Pod 所需计算资源的问题。工作负载ECS、VCI 资源动态混合弹性。

前提条件

  • 已创建容器网络模型为 VPC-CNI 的集群。详细操作,请参见 创建集群

    说明

    目前仅 VPC-CNI 网络模型的集群支持使用 vci-profile 文件。

  • 集群已安装 vci-virtual-kubelet 组件且组件已升级至 v1.26.1 及以上版本。组件信息,请参见 vci-virtual-kubelet

配置 vci-profile

如需使用 vci-profile 能力,需要在满足 前提条件 的集群中创建 vci-profile 文件。

  1. 连接集群。具体操作说明,请参见 连接集群

  2. 创建 vci-profile 的 YAML 文件。
    kube-system 命名空间下以 ConfigMap 形式创建 vci-profile 文件。后续在集群中创建 Pod 时系统会读取 kube-system 命名空间下的 vci-profile 文件,并按照 vci-profile 中的配置来创建 Pod。
    vci-profile 文件的完整 YAML 模板如下:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: vci-profile         # ConfigMap 名称,必须为 vci-profile。
      namespace: kube-system    # vci-profile 文件所属命名空间,必须为 kube-system。
    data:
      preferredSubnetIds: subnet-3tispp1nai1****, subnet-3tispp1nai2****    # VCI Pod 所属的 VPC 子网。
      tlsEnable: "true"    # VCI Pod 是否开启并采集日志到火山引擎日志服务。
      securityContextPrivilegedConfig: ignore    # VCI Pod 的特权模式兼容性配置。
      dnsPolicyClusterFirstWithHostNetConfig: clusterFirst    # VCI Pod 内部的 DNS 解析行为配置。
      volumesHostPathConfig: ignore    # VCI Pod 挂载节点文件目录的配置。
      hostIpConfig: podIp              # VCI Pod 的 status.hostIP 反显字段配置。
      enforceSelectorToVci: "true"     # 是否强制调度 selectors 选中的 Pod 到 VCI。
      selectors: |
        [
          {
            "name": "selector-demo1",
            "namespaceSelector": {
              "matchLabels": {
                "vci": "true"
              },
              "matchExpressions": [
                {
                  "key": "tier",
                  "operator": "In",
                  "values": ["backend"]
                }
              ]
            },
            "effect": {
              "annotations": {
                "vci.volcengine.com/tls-enable": "true"
              },
              "labels": {
                "created-by-vci": "true"
              }
            }
          }
        ]
    

    您可以修改 vci-profile 中的data字段配置。

    data 中的配置项说明详细说明和示例
    selectors通过配置 vci-profile 文件中的selectors,匹配 Pod 使用 VCI 资源并为 Pod 增加相应的 Annotation 和 Label。selectors 配置项
    除 selectors 外,preferredSubnetIds、tlsEnable 等配置项selectors外,支持通过更新preferredSubnetIdstlsEnable等配置项来控制集群级别 VCI Pod 的固定配置。全局固定配置项
  3. 创建 vci-profile 文件对应的 ConfigMap。

    kubectl create -f vci-profile.yaml
    

selectors 配置项

创建 Pod 时,系统会按照 vci-profile 文件中的selectors字段去匹配 Pod。对于 Label 能够匹配上的 Pod,会软性调度到 VCI 资源,并且为 Pod 追加 VCI 相关的 Annotation 和 Label。

selectors 参数说明

selectors中可以包含多个 selector,每个 selector 由namenamespaceSelectorobjectSelectoreffect组成。详细说明如下:

参数必填与否说明
name必填selector 对象名称。不能为空。

namespaceSelector

非必填

通过 NameSpace Label 筛选 Pod。
matchLabels:要匹配的 NameSpace Label。如果填写多个 Label, 相互为 逻辑与 关系。

objectSelector

非必填

通过 Pod Label 筛选 Pod。
matchLabels:要匹配的 Pod Label。如果填写多个 Label, 相互为 逻辑与 关系。

effect

非必填

为 Pod 动态追加的 Annotation 和 Label。

  • annotations:要追加的 Pod Annotation。非必填。
  • labels:要追加的 Pod Label。非必填。

selectors 使用说明

  • 配置单个 selector 时:
    • 建议至少在namespaceSelectorobjectSelector中选择一个进行配置。
    • 若同时配置了namespaceSelectorobjectSelector,则 Pod 需要同时满足两者才会视为匹配,即namespaceSelectorobjectSelector逻辑与 关系。
    • namespaceSelectorobjectSelector均未配置,但是却配置了effect时,effect将对所有通过 vci-profile 判定调度到 VCI 的 Pod 生效。

      注意

      此时 ResourcesPolicy 策略无效。但如果 Pod 上存在 Annotation:vke.volcengine.com/burst-to-vci:enforce,则会受到该类型effect的影响。

  • 配置多个 selector 时:
    • 系统按照先后顺序匹配 selector。
    • selector 匹配 Pod 成功后,会自动把effect中声明的 Annotation 和 Label 追加到 VCI Pod 中(只追加 Key,不覆盖 Value)。
    • 对于重复的 Annotation 和 Label,Pod 中原有 Value 的优先级最高,其次是顺序匹配上的第一个 selector 中的effect,以此类推。
  • 使用namespaceSelector时,建议谨慎设置集群默认创建的命名空间(default、kube-system、kube-node-lease、kube-public)下的全部 Pod 调度到 VCI。因为 VKE 部分系统组件以 Daemonset 形式部署在上述命名空间内,目前 VCI 暂未提供完整的 Daemonset 能力。
  • 配置完成 vci-profile 文件后,仅针对新建的 Pod 或工作负载滚动重启的 Pod 生效,存量正在运行的 Pod 不受影响。

selectors 配置示例

通过配置namespaceSelectorobjectSelector,将 Pod 本身以及所属命名空间均含有 Label:"use-vci": "true"的 Pod 调度到 VCI。

apiVersion: v1
kind: ConfigMap
metadata:
  name: vci-profile         # ConfigMap 名称,必须为 vci-profile。
  namespace: kube-system    # vci-profile 文件所属命名空间,必须为 kube-system。
data:
  selectors: |
    [
      {
        "name": "selector-demo",
        "namespaceSelector": {
          "matchLabels": {
            "vci": "true"
          }
        },
        "objectSelector":{
          "matchLabels":{
            "use-vci": "true"
          }
        }
      }
    ]

配置selectors后,您可以通过以下命令确认selectors是否生效。

kubectl get mutatingwebhookConfiguration general-webhook-mutate-configuration -o yaml

如果返回的 YAML 中已包含配置的selectors字段,则表示配置成功;如果未包含,请检查selectors的格式是否有误。以 CPU 负载配置示例 举例,YAML 中会增加如下配置:

- admissionReviewVersions:
  - v1
  - v1beta1
  clientConfig:
    caBundle: ...
    url: https://xx-general-webhook:9443/vci-profile
  failurePolicy: Fail
  matchPolicy: Equivalent
  name: vciprofile-0.mutating.ek8s.io
  namespaceSelector:
    matchLabels:
      vci: "true"
  objectSelector:
    matchLabels:
      use-vci: "true"
  reinvocationPolicy: Never
  rules:
  - apiGroups:
    - ""
    apiVersions:
    - '*'
    operations:
    - CREATE
    resources:
    - pods
    scope: '*'
  sideEffects: None
  timeoutSeconds: 10

全局固定配置项

data中包含的preferredSubnetIdstlsEnable等固定配置项对应 Pod 的 VPC 子网、日志采集等信息,您可以根据需要进行更新。更新后的配置可以即时生效,无需重启 vci-virtual-kubelet 组件。

说明

vci-profile 文件中的全局固定配置,作用于集群级别,即在集群中创建 VCI Pod 时:

  • 如果没有额外配置,则采用 vci-profile 文件中的全局固定配置。
  • 若已通过 Annotation 为 VCI Pod 进行了额外配置,则 VCI Pod Annotation 配置优先级大于 vci-profile 文件中的全局固定配置优先级。

详细的配置项说明如下:

配置项示例值说明

preferredSubnetIds

subnet-3tispp1nai1****, subnet-3tispp1nai2****

VCI Pod 所属的 VPC 子网。可配置不同可用区的子网,多个子网间使用半角逗号分隔(,)。

说明

若当前虚拟节点(Virtual Node)只能识别当前可用区的单个子网,则按照先后顺序选择。

tlsEnable

true

VCI Pod 是否开启日志采集能力,将日志采集到火山引擎日志服务。Value 取值如下:

  • true:开启日志采集。
  • false:不开启日志采集。

securityContextPrivilegedConfig

ignore

VCI Pod 的特权模式(包括 Pod、Container 级别)兼容性配置。
默认情况下,VCI Pod 开启特权模式会导致 Pod 创建失败,您可以通过全局维度配置忽略特权模式。取值如下:
ignore:以 VCI 方式部署的 Pod 将忽略特权模式相关配置。

dnsPolicyClusterFirstWithHostNetConfig

clusterFirst

VCI Pod 内部的 DNS 解析行为配置。
默认情况下,VCI Pod 的dnsPolicy策略不支持配置为ClusterFirstWithHostNet,您可以通过全局维度配置,自动将ClusterFirstWithHostNet转化为ClusterFirst。取值如下:
clusterFirst:以 VCI 方式部署的 Pod 自动将 DNS 解析行为从ClusterFirstWithHostNet转化为ClusterFirst

volumesHostPathConfig

ignore

VCI Pod 挂载节点文件目录的配置。
默认情况下,VCI Pod 的volumes.hostPath配置会导致 Pod 创建失败,您可以通过全局维度配置忽略该配置项。取值如下:
ignore:以 VCI 方式部署的 Pod 将忽略挂载节点文件目录配置。

hostIpConfig

podIp

VCI Pod 的节点 IP 地址相关参数status.hostIP的反显字段配置。
默认情况下,VCI Pod 的status.hostIP会展示虚拟节点的 IP 地址,您可以通过全局维度配置修改为展示 VCI Pod 的 IP 地址。取值如下:
podIp:以 VCI 方式部署的 Pod 将使用 Pod IP 作为status.hostIP展示。

enforceSelectorToVci

true

vci-profile 文件中,selectors所选中的 Pod 是否强制调度到 VCI。
默认情况下,vci-profile 文件中,selectors所选中的 Pod 更倾向于调度至 VCI,但是会受到 Resource Policy 以及调度器所设置的其他能力影响,导致所选中的 Pod 可能不会全部调度至 VCI。您可以通过全局维度设置selectors能力强制调度至 VCI,忽略调度器和 ResourcePolicy 等资源配置策略能力的影响,确保最终一定调度至 VCI。取值如下:
true:通过 vci-profile 文件部署的 Pod 将强制调度至 VCI,忽略调度器和 ResourcePolicy 等资源配置策略能力的影响。