博客 / 詳情

返回

K8s 1.33 原地擴縮容特性

K8s 1.33 原地擴縮容特性

背景

在創建好的pod容器中,進行了資源限制,在之前的版本中,修改資源配置是需要重啓pod才可生效,在1.33版本的kubernetes可以直接調整正在運行的 Pod 的 CPU 和內存配置,而無需重啓pod容器。

需要注意的是,此功能目前為bate版本,並且在集羣中默認開啓。我們可以直接使用該新特性。

操作演示

創建一個資源監控 Pod

[root@k8s-master01 ~]# vim resize.yaml 
[root@k8s-master01 ~]# cat resize.yaml
apiVersion: v1
kind: Pod
metadata:
  name: resize-demo
spec:
  containers:
  - name: resource-watcher
    image: ubuntu:22.04
    command:
    - "/bin/bash"
    - "-c"
    - |
      apt-get update && apt-get install -y procps bc
      echo "=== Pod Started: $(date) ==="

      # Functions to read container resource limits
      get_cpu_limit() {
        if [ -f /sys/fs/cgroup/cpu.max ]; then
          # cgroup v2
          local cpu_data=$(cat /sys/fs/cgroup/cpu.max)
          local quota=$(echo $cpu_data | awk '{print $1}')
          local period=$(echo $cpu_data | awk '{print $2}')

          if [ "$quota" = "max" ]; then
            echo "unlimited"
          else
            echo "$(echo "scale=3; $quota / $period" | bc) cores"
          fi
        else
          # cgroup v1
          local quota=$(cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us)
          local period=$(cat /sys/fs/cgroup/cpu/cpu.cfs_period_us)

          if [ "$quota" = "-1" ]; then
            echo "unlimited"
          else
            echo "$(echo "scale=3; $quota / $period" | bc) cores"
          fi
        fi
      }

      get_memory_limit() {
        if [ -f /sys/fs/cgroup/memory.max ]; then
          # cgroup v2
          local mem=$(cat /sys/fs/cgroup/memory.max)
          if [ "$mem" = "max" ]; then
            echo "unlimited"
          else
            echo "$((mem / 1048576)) MiB"
          fi
        else
          # cgroup v1
          local mem=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)
          echo "$((mem / 1048576)) MiB"
        fi
      }

      # Print resource info every 5 seconds
      while true; do
        echo "---------- Resource Check: $(date) ----------"
        echo "CPU limit: $(get_cpu_limit)"
        echo "Memory limit: $(get_memory_limit)"
        echo "Available memory: $(free -h | grep Mem | awk '{print $7}')"
        sleep 5
      done
    resizePolicy:
    - resourceName: cpu
      restartPolicy: NotRequired
    - resourceName: memory
      restartPolicy: NotRequired
    resources:
      requests:
        memory: "128Mi"
        cpu: "100m"
      limits:
        memory: "128Mi"
        cpu: "100m"
[root@k8s-master01 ~]# 


[root@k8s-master01 ~]# kubectl apply -f resize.yaml 
pod/resize-demo created
[root@k8s-master01 ~]# 

查看 Pod 的初始狀態

[root@k8s-master01 ~]# kubectl describe pod resize-demo | grep -A5 Limits:
    Limits:
      cpu:     100m
      memory:  128Mi
    Requests:
      cpu:        100m
      memory:     128Mi

無縫調整 CPU

# 執行調整動作
kubectl patch pod resize-demo --subresource resize --patch \
  '{"spec":{"containers":[{"name":"resource-watcher", "resources":{"requests":{"cpu":"200m"}, "limits":{"cpu":"200m"}}}]}}'

# 檢查調整狀態
[root@k8s-master01 ~]# kubectl get pod resize-demo -o yaml  | grep resources -A8

spec:
  containers:
--
    resources:
      limits:
        cpu: 200m
        memory: 128Mi
      requests:
        cpu: 200m
        memory: 128Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
--
    resources:
      limits:
        cpu: 100m
        memory: 128Mi
      requests:
        cpu: 100m
        memory: 128Mi
    restartCount: 0
    started: true

[root@k8s-master01 ~]#

查看現在的資源使用情況

[root@k8s-master01 ~]# kubectl describe pod resize-demo | grep -A8 Limits:
    Limits:
      cpu:     200m
      memory:  128Mi
    Requests:
      cpu:        200m
      memory:     128Mi
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-h7cpt (ro)

查看容器日誌

查看日誌資源是否發生了變化,在操作之前一直在追蹤日誌


[root@k8s-master01 ~]# kubectl logs -f resize-demo

---------- Resource Check: Fri Jun  6 11:59:51 UTC 2025 ----------
CPU limit: .100 cores
Memory limit: 128 MiB
Available memory: 1.9Gi

---------- Resource Check: Fri Jun  6 11:59:56 UTC 2025 ----------
CPU limit: .200 cores
Memory limit: 128 MiB
Available memory: 1.9Gi
---------- Resource Check: Fri Jun  6 12:00:01 UTC 2025 ----------
CPU limit: .200 cores
Memory limit: 128 MiB
Available memory: 1.9Gi

調整內存

# 執行調整動作
kubectl patch pod resize-demo --subresource resize --patch \
  '{"spec":{"containers":[{"name":"resource-watcher", "resources":{"requests":{"memory":"256Mi"}, "limits":{"memory":"256Mi"}}}]}}'

# 檢查調整狀態
[root@k8s-master01 ~]# kubectl describe pod resize-demo | grep -A8 Limits:
    Limits:
      cpu:     200m
      memory:  256Mi
    Requests:
      cpu:        200m
      memory:     256Mi
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-h7cpt (ro)
[root@k8s-master01 ~]# 

查看容器日誌

---------- Resource Check: Fri Jun  6 12:07:20 UTC 2025 ----------
CPU limit: .200 cores
Memory limit: 128 MiB
Available memory: 1.9Gi


---------- Resource Check: Fri Jun  6 12:07:25 UTC 2025 ----------
CPU limit: .200 cores
Memory limit: 256 MiB
Available memory: 1.9Gi
---------- Resource Check: Fri Jun  6 12:07:30 UTC 2025 ----------
CPU limit: .200 cores
Memory limit: 256 MiB
Available memory: 1.9Gi

關於

https://www.oiox.cn/

https://www.oiox.cn/index.php/start-page.html

CSDN、GitHub、知乎、開源中國、思否、掘金、簡書、華為雲、阿里雲、騰訊雲、嗶哩嗶哩、今日頭條、新浪微博、個人博客

全網可搜《小陳運維》

文章主要發佈於微信公眾號:《Linux運維交流社區》

user avatar zhouyanlin 頭像 2018 頭像 u_17542218 頭像 panwenhai 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.