巨乳 露出 通过Cgroups文献临时动态修改Pod的CPU、内存、磁盘IO等单机窒碍参数

发布日期:2024-11-02 13:19    点击次数:171

巨乳 露出 通过Cgroups文献临时动态修改Pod的CPU、内存、磁盘IO等单机窒碍参数

在Kubernetes 1.27及更早的版块中,如需在Pod运行的历程中临时修改容器参数,只可更新PodSpec后从头提交,这种形式会触发Pod的删除和重建。ACK提供基于Cgroups文献动态修改Pod资源参数的功能,复旧在不重启Pod的情况下巨乳 露出,临时修改Pod的CPU、内存、磁盘IO等单机窒碍参数。

使用以下YAML内容,创建pod-demo.yaml文献。

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
spec:
  containers:
  - name: pod-demo
    image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
    resources:
      requests:
        cpu: 1
        memory: "50Mi"
      limits:
        cpu: 1 
        memory: "1Gi" # 容器内存Limit为1 GB。
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]

实行以下敕令,将pod-demo部署到集群中。

kubectl apply -f pod-demo.yaml

实行以下敕令,稽查现时容器的运行内存限制值。

# 具体旅途可阐发Pod的UID以及Container的ID拼接获得。
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytes

预期输出:

# 对应为1 GB,即1*1024*1024*1024=1073741824。
1073741824

预期输出标明,现时容器的运行内存Limit为1 GB,与活动1的spec.containers.resources.limits.memory形容一致。

使用以下YAML内容,指定需要动态修改容器的内存Limit,创建cgroups-sample.yaml文献。

apiVersion: resources.alibabacloud.com/v1alpha1
kind: Cgroups
metadata:
  name: cgroups-sample
spec:
  pod:
    name: pod-demo
    namespace: default
    containers:
    - name: pod-demo
      memory: 5Gi  # 指定Pod的内存Limit为5 GB。

实行以下敕令,将cgroups-sample.yaml部署到集群中。

kubectl apply -f cgroups-sample.yaml

实行以下敕令,稽查修改后容器的内存限制值。

# 具体旅途可阐发Pod的UID拼接获得。
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytes

预期输出:

# 对应为5 GB,即5*1024*1024*1024=5368709120
5368709120

预期输出标明,容器的内存限制值为5 GB,与活动4的spec.pod.containers.memory形容一致,即本次修改奏凯。

实行以下敕令,稽查Pod运行情况。

kubectl describe pod pod-demo

预期输出:

Events:
  Type    Reason          Age   From               Message
  ----    ------          ----  ----               -------
  Normal  Scheduled       36m   default-scheduler  Successfully assigned default/pod-demo to cn-hangzhou.192.168.0.50
  Normal  AllocIPSucceed  36m   terway-daemon      Alloc IP 192.XX.XX.51/24 took 4.490542543s
  Normal  Pulling         36m   kubelet            Pulling image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4"
  Normal  Pulled          36m   kubelet            Successfully pulled image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" in 2.204s (2.204s including waiting). Image size: 7755078 bytes.
  Normal  Created         36m   kubelet            Created container pod-demo
  Normal  Started         36m   kubelet            Started container pod-demo

预期输出标明,Event列表中不存在Pod重启的有关信息,Pod运行平方。

修改CPU绑核领域

要是您的愚弄圭臬对CPU性能条件较高,盼愿已毕更好的资源窒碍,您不错修改CPU Core的绑定领域,指定Pod可使用的CPU编号。

本示例将创建一个未绑定CPU Core的Pod,考据在Pod不重启的情况下通过Cgroups文献不错奏凯修改Pod的CPU绑核领域。

使用以下YAML内容,创建pod-cpuset-demo.yaml。

apiVersion: v1
kind: Pod
metadata:
  name: pod-cpuset-demo
spec:
  containers:
  - name: pod-cpuset-demo
    image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
    resources:
      requests:
        memory: "50Mi"
      limits:
        memory: "1000Mi"
        cpu: 0.5
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "556M", "-c", "2", "--vm-hang", "1"]

实行以下敕令,将pod-cpuset-demo.yaml部署到集群中。

kubectl apply -f pod-cpuset-demo.yaml

实行以下敕令,稽查现时容器的CPU中枢绑定情况。

# 骨子旅途可阐发Pod的UID以及Container的ID拼接获得。
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus

预期输出:

0-31

预期输出标明,未绑定CPU前,可使用的CPU编号领域为0~31,示意CPU现在莫得照管。

使用以下YAML内容,指定CPU的绑核信息,创建cgroups-sample-cpusetpod.yaml文献。

apiVersion: resources.alibabacloud.com/v1alpha1
kind: Cgroups
metadata:
  name: cgroups-sample-cpusetpod
spec:
  pod:
    name: pod-cpuset-demo
    namespace: default
    containers:
    - name: pod-cpuset-demo
      cpuset-cpus: 2-3  # 指定将Pod绑定到CPU2和CPU3上。

实行以下敕令,将cgroups-sample-cpusetpod.yaml部署到集群中。

kubectl apply -f cgroups-sample-cpusetpod.yaml

实行以下敕令,稽查现时容器修改后的CPU中枢绑定情况。

# 骨子旅途可阐发Pod的UID以及Container的ID拼接获得。
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus

预期输出:

2-3

预期输出标明,容器已奏凯绑定到CPU2和CPU3上,与活动4的spec.pod.containers.cpuset-cpus形容一致,即本次修改奏凯。

实行以下敕令,狠狠加多撸稽查Pod运行情况。

kubectl describe pod pod-cpuset-demo

预期输出:

Events:
  Type    Reason          Age   From               Message
  ----    ------          ----  ----               -------
  Normal  Scheduled       7m7s  default-scheduler  Successfully assigned default/pod-cpuset-demo to cn-hangzhou.192.XX.XX.50
  Normal  AllocIPSucceed  7m5s  terway-daemon      Alloc IP 192.XX.XX.56/24 took 2.060752512s
  Normal  Pulled          7m5s  kubelet            Container image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" already present on machine
  Normal  Created         7m5s  kubelet            Created container pod-cpuset-demo
  Normal  Started         7m5s  kubelet            Started container pod-cpuset-demo
  Normal  CPUSetBind      84s   koordlet           set cpuset 2-3 to container pod-cpuset-demo success

预期输出标明,Event列表中不存在Pod重启的有关信息,Pod运行平方。

修改磁盘IOPS参数

要是您需要适度磁盘IOPS,请使用操作系统为Alibaba Cloud Linux的Worker节点。

本示例将创建一个IO密集型的测试愚弄,考据在Pod不重启的情况下通过Cgroups文献不错对Pod的蒙胧量进行限制,修改容器的磁盘IO限制。

使用以下YAML,创建一个IO密集型的测试愚弄。

将宿主机目次/mnt挂载至Pod里面使用,对应磁盘设备称呼为/dev/vda1。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fio-demo
  labels:
    app: fio-demo
spec:
  selector:
    matchLabels:
      app: fio-demo
  template:
    metadata:
      labels:
        app: fio-demo
    spec:
      containers:
      - name: fio-demo
        image: registry.cn-zhangjiakou.aliyuncs.com/acs/fio-for-slo-test:v0.1
        command: ["sh", "-c"]
        # 使用Fio器具对磁盘IOPS进行写测试。
        args: ["fio -filename=/data/test -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=12000 -group_reporting -name=mytest"]
        volumeMounts:
          - name: pvc
            mountPath: /data    # 挂载在/data的旅途下。
      volumes:
        - name: pvc
          hostPath:
            path: /mnt

实行以下敕令,将fio-demo部署到集群中。

kubectl apply -f fio-demo.yaml

部署适度磁盘IOPS的Cgroups文献,对Pod的蒙胧量进行限制。

使用以下YAML,指定设备/dev/vda1的BPS(Bit Per Second)限制信息,创建cgroups-sample-fio.yaml文献。

apiVersion: resources.alibabacloud.com/v1alpha1
kind: Cgroups
metadata:
  name: cgroups-sample-fio
spec:
  deployment:
    name: fio-demo
    namespace: default
    containers:
    - name: fio-demo
      blkio:
        # BPS限制,举例1048576、2097152、3145728。
        device_write_bps: [{device: "/dev/vda1", value: "1048576"}]

实行以下敕令,稽查现时容器修改后的磁盘IO限制情况。

# 骨子旅途可阐发Pod的UID以及Container的ID拼接获得。
cat /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod0840adda_bc26_4870_adba_f193cd00****.slice/cri-containerd-9ea6cc97a6de902d941199db2fcda872ddd543485f5f987498e40cd706dc****.scope/blkio.throttle.write_bps_device

预期输出:

253:0 1048576

预期输出标明,现时磁盘的限速成就为1048576。

稽查对应节点的磁盘监控。

84

85

如上图所示,容器的蒙胧BPS(File System Write)和活动3的device_write_bps限制一致,且修改历程中Pod莫得被重启。

在Deployment维度动态修改Pod资源参数

前文先容的Pod维度的资源参数动态修改一样复旧在Deployment维度见效。Pod维度的修改通过Cgroups文献的spec.pod字段内容见效;Deployment维度的修改通过spec.deployment字段内容见效。下文以修改CPU绑核领域为例,先容如安在Deployment完成修改。其他场景操作雷同。

使用以下YAML内容,创建go-demo.yaml文献。

Deployment中包含两个实例的压测圭臬,每个实例使用的资源为0.5个CPU。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-demo
  labels:
    app: go-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: go-demo
  template:
    metadata:
      labels:
        app: go-demo
    spec:
      containers:
      - name: go-demo
        image: polinux/stress
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "556M", "-c", "1", "--vm-hang", "1"]
        imagePullPolicy: Always
        resources:
          requests:
            cpu: 0.5
          limits:
            cpu: 0.5

实行以下敕令,将go-demo部署到集群中。

kubectl apply -f go-demo.yaml

使用以下YAML内容,指定CPU的绑定信息,创建cgroups-cpuset-sample.yaml文献。

apiVersion: resources.alibabacloud.com/v1alpha1
kind: Cgroups
metadata:
  name: cgroups-cpuset-sample
spec:
  deployment: # 此处为Deployment。
    name: go-demo
    namespace: default
    containers:
    - name: go-demo
      cpuset-cpus: 2,3 # 将Pod绑定到CPU2和CPU3上。

实行以下敕令,将cgroups-cpuset-sample部署到集群中。

kubectl apply -f cgroups-cpuset-sample.yaml

实行以下敕令,稽查现时容器修改后的CPU中枢绑定情况。

#具体旅途可阐发Pod的UID以及Container的ID拼接获得。
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod06de7408_346a_4d00_ba25_02833b6c****.slice/cri-containerd-733a0dc93480eb47ac6c5abfade5c22ed41639958e3d304ca1f85959edc3****.scope/cpuset.cpus

预期输出:

2-3

预期输出标明,容器绑定在CPU2和CPU3上,与Cgroups文献中的spec.deployment.containers.cpuset-cpus形容一致。

有关文档

CPU Burst功能不错让容器在清闲时积存一些CPU时辰片,用于得志突发时的资源需求,以进步容器性能、镌汰延伸斟酌打算,进而进步愚弄的劳动质地,请参见CPU Burst性能优化计谋。

针对性能明锐型愚弄,您不错将Pod固定在节点上的CPU中枢运行,缓解因CPU高下文切换、跨NUMA访存导致的愚弄性能下落问题,请参见启用CPU拓扑感知扶直。

您不错将集群中已分拨但未使用的资源量化并提供给低优先级任务使用,以已毕对集群资源的超卖。需要并吞以下单机QoS计谋使用,以幸免愚弄间的性颖异扰,请参见启用动态资源超卖。

通过对资源使用量历史数据的分析巨乳 露出,资源画像功能不错为容器保举资源规格,简化Request和Limit的复杂度,请参见资源画像。