在Sidecar中配置ACK动态超卖资源

接入到ASM中的ACK Pro版集群在启用动态资源超卖模式下,注入到应用Deployment中的Sidecar代理支持超卖模式的资源类型,以提升集群资源利用率。本文介绍如何在Sidecar中配置ACK动态超卖资源。

前提条件

  • 已创建ACK Pro版集群。具体操作,请参见创建ACK Pro版集群
    说明 本功能仅支持ACK Pro版集群。
  • ACK Pro版集群已支持动态资源超卖功能。具体操作,请参见动态资源超卖
  • 已添加ACK Pro版集群到ASM实例,且ASM实例版本为1.16及以上。具体操作,请参见添加集群到ASM实例

动态资源超卖功能介绍

在Kubernetes系统中,Kubelet通过参考Pod的QoS等级来管理单机容器的资源质量,例如OOM(Out of Memory)优先级控制等。Pod的QoS级别分为Guaranteed、Burstable和BestEffort。QoS级别取决于Pod配置的Request和Limit(CPU、内存)。

ack-koordinator提供动态资源超卖功能,通过对节点负载数据的实时收集,可以充分挖掘集群中已分配但未使用的资源量,以实现对集群资源的动态超卖。为体现与原生资源类型的差异性,ack-koordinator使用Batch优先级的概念描述该部分超卖资源,对应的字段为batch-cpubatch-memory。更多信息,请参见动态资源超卖

操作步骤

  1. 部署ConfigMap ack-slo-config。
    1. 使用以下内容,创建configmap.yaml
      通过修改ConfigMap中的配置项,可以实现对资源的灵活管理。关于配置项的说明,请参见动态资源超卖
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: ack-slo-config
        namespace: kube-system
      data:
        colocation-config: |
          {
            "enable": true,
            "metricAggregateDurationSeconds": 60,
            "cpuReclaimThresholdPercent": 60,
            "memoryReclaimThresholdPercent": 70,
            "memoryCalculatePolicy": "usage"
          }
    2. 在命名空间kube-system下,查看是否存在ConfigMap ack-slo-config。
      • 若存在ConfigMap ack-slo-config,请使用PATCH方式进行更新,避免干扰ConfigMap中其他配置项。
        kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
      • 若不存在ConfigMap ack-slo-config,请执行以下命令,创建ConfigMap。
        kubectl apply -f configmap.yaml
  2. 执行以下命令,查看当前Batch资源总量。
    # 请将$nodeName替换为要查询的目标节点名称。
    kubectl get node $nodeName -o yaml
    预期输出:
    #Node
    status:
      allocatable:
        # 单位为千分之一核,以下表示50核。
        kubernetes.io/batch-cpu: 50000
        # 单位为字节,以下表示50 GB。
        kubernetes.io/batch-memory: 53687091200
  3. 为Sidecar设定ACK动态超卖资源。
    您可以设置注入的Istio代理以及isito-init初始化容器的ACK动态超卖资源。更多信息,请参见配置Sidecar代理
    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理
    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择数据面组件管理 > Sidecar代理配置
    3. Sidecar代理配置页面的全局页签,单击资源设置,选中为Sidecar设定ACK动态超卖资源,配置相关信息,然后在页面下方,单击更新设置
      一般不强制资源限制所需资源配置为相同值。建议您参照工作负载类型,对资源限制所需资源进行配置。
      • 若QoS为Guaranteed类型的工作负载,建议您两者配置为相同值。
      • 若为其他类型的Pod,建议您保持与原生资源类型中所需资源小于资源限制的约定。

      本示例配置如下。

      配置项配置子项说明
      注入的Istio代理资源设置(ACK动态超卖资源)资源限制配置CPU2000千分之一核,内存2048 MiB。
      所需资源配置CPU200 千分之一核,内存256 MiB。
      istio-init初始化容器资源(ACK动态超卖资源)资源限制配置CPU1000千分之一核,内存1024 MiB。
      所需资源配置CPU100 千分之一核,内存128 MiB。
  4. 部署应用并申请Batch资源。
    1. 使用以下内容,创建demo.yaml
      以下YAML将创建应用Deployment并申请Batch资源。在Label中指定QoS等级,并在Request和Limit中添加对应的Batch资源配置,即可使Pod使用动态超卖资源。
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep
        template:
          metadata:
            labels:
              app: sleep
              # 必填,标记为低优先级Pod。
              koordinator.sh/qosClass: "BE"
          spec:
            terminationGracePeriodSeconds: 0
            containers:
            - name: sleep
              image: curlimages/curl
              command: ["/bin/sleep", "infinity"]
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  # 单位为千分之一核,如下表示1核。
                  kubernetes.io/batch-cpu: "1k"
                  # 单位为字节,如下表示1 GB。
                  kubernetes.io/batch-memory: "1Gi"
                limits:
                  kubernetes.io/batch-cpu: "1k"
                  kubernetes.io/batch-memory: "1Gi"
    2. 执行以下命令,部署demo作为目标评测应用。
      kubectl apply -f demo.yaml
  5. 可选:查看BE Pod资源限制是否生效。
    部署应用并申请Batch资源后,您可以查看Pod资源限制的生效情况。更多信息,请参见动态资源超卖
    1. 登录到Pod所在的节点,执行以下命令,查看CPU资源限制参数。
      cat /sys/fs/cgroup/cpu,cpuacct/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod****.slice/cri-containerd-****.scope/cpu.cfs_quota_us
      预期输出:
      # 容器对应的CPU Cgroup为1核。
      100000
    2. 登录到Pod所在的节点,执行以下命令,查看Memory资源限制参数。
      cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod****.slice/cri-containerd-****.scope/memory.limit_in_bytes
      预期输出:
      # 容器对应的Memory Cgroup为1 GB。
      1073741824
    若输出结果的CPU资源限制参数和Memory资源限制参数与步骤4的配置相同,表明BE Pod资源限制生效。