k8s之节点压力驱逐

k8s之节点压力驱逐

节点压力驱逐再部署集群时是默认开启的,但是默认的阈值较低,有时可能还没等kubelet驱逐高资源占用pod,节点反到扛不住先一步炸了,这也可以作为优化k8s集群提高服务可用性的一部分。

官方文档  节点压力驱逐主要分为:

  • 软驱逐(eviction-soft):有一定的宽限期,再宽限期内高资源占用pod占用率下降则不会被驱逐
  • 硬驱逐(eviction-hard):没有宽限期,当剩余资源达到资源最小限制时会立即将高资源占用pod驱逐
演示环境主要以内存资源为例,并且已移除所有污点
节点 CPU 内存
master 2C 8G
node1 2C 8G

一、硬驱逐测试

1、kubelet配置(所有节点都要修改)

⎈[root@node1 ~]# ps axu | grep kubelet
root     35939  1.8  1.3 1927080 100492 ?      Ssl  17:18   0:19 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2
root     49713  0.0  0.0   6020  1968 pts/0    S+   17:36   0:00 grep --color=auto kubelet
⎈[root@node1 ~]# cat /var/lib/kubelet/config.yaml | grep -A2 evictionHard:
evictionHard:
  memory.available: "5Gi"
evictionPressureTransitionPeriod: 15s
⎈[root@node1 ~]# 
⎈[root@node1 ~]# systemctl restart kubelet.service

1

2、配置文件准备

⎈[root@master ingress]# cat 00-deploy-apps.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-apps-v1
spec:
  replicas: 10
  selector:
    matchLabels:
      apps: v1
  template:
    metadata:
      labels:
        apps: v1
    spec:
      containers:
      - name: c1
        image: iabsdocker/k8s-demo:v1
        ports:
        - containerPort: 80

⎈[root@master ingress]# cat stress-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: stress-pod-arm
spec:
  containers:
  - name: stress
    image: alpine:latest
    command: ["sh", "-c", "apk add --no-cache stress-ng && stress-ng --vm 3 --vm-bytes 4096M --timeout 6000s"]
  restartPolicy: Always

⎈[root@master ingress]#

3、部署nginx模拟业务pod,stress模拟高内存占用pod

可以看到再 stress 部署调度到node1节点后,node1节点的nginx开始瞬间被kubelet直接驱逐,几乎没有给到nginx任何反应时间

1

从kubelet日志中看到MemoryPressureMemoryPressure是硬件资源压力的直接信号

1

二、软驱逐测试

1、kubelet配置(所有节点都要修改)

为不影响测试将硬驱逐限制减低

软驱逐(Soft Eviction)

  • 缓冲驱逐机制:当资源使用超过 evictionSoft 阈值时,不会立即驱逐,而是在宽限期(GracePeriod)内观察

  • 可恢复:如果在宽限期内资源使用恢复到安全值,不会驱逐。

  • 更优雅:给 Pod 和调度器时间做准备,比如数据写入、热迁移。

⎈[root@node1 ~]# ps axu | grep kubelet
root     57889  3.2  1.1 1696680 89084 ?       Ssl  17:51   0:00 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2
root     58347  0.0  0.0   6020  1992 pts/0    R+   17:51   0:00 grep --color=auto kubelet
⎈[root@node1 ~]# cat /var/lib/kubelet/config.yaml | grep -A6 evictionSoft:
evictionSoft:
  memory.available: "6Gi"
evictionSoftGracePeriod:
  memory.available: "1m"
evictionHard:
  memory.available: "1Gi"
evictionPressureTransitionPeriod: 15s
⎈[root@node1 ~]#

image

2、配置文件准备

⎈[root@master ingress]# cat 00-deploy-apps.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-apps-v1
spec:
  replicas: 10
  selector:
    matchLabels:
      apps: v1
  template:
    metadata:
      labels:
        apps: v1
    spec:
      containers:
      - name: c1
        image: iabsdocker/k8s-demo:v1
        ports:
        - containerPort: 80
⎈[root@master ingress]# cat stress-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: stress-pod-arm
spec:
  containers:
  - name: stress
    image: alpine:latest
    command: ["sh", "-c", "apk add --no-cache stress-ng && stress-ng --vm 3 --vm-bytes 3072M --timeout 6000s"]
  restartPolicy: Always

⎈[root@master ingress]#

3、部署nginx模拟业务pod,stress模拟高内存占用pod

可以看到再 stress 部署调度到node1节点后,因为配置了memory.available: "1m"宽限了一分钟,并且并没有达到硬驱逐限制的1G,所以一分钟后 stress pod才被驱逐。

1

1

从kubelet日志中看到

  • Kubelet 检测到节点内存压力,低于 evictionSoft 阈值。

  • 软驱逐宽限期到后,如果内存仍不足,eviction manager 会挑选 Pod 进行驱逐。

W0815 18:18:21.362874    9695 eviction_manager.go:344] eviction manager: attempting to reclaim memory
I0815 18:18:21.363416    9695 eviction_manager.go:355] eviction manager: must evict pod(s) to reclaim memory
I0815 18:18:21.363797    9695 eviction_manager.go:373] eviction manager: pods ranked for eviction: stress-pod-arm_default ...
I0815 18:18:21.632528    9695 eviction_manager.go:589] eviction manager: pod stress-pod-arm_default(...) is evicted successfully

1

最后

生产环境建议配置合适的参数,当然不止内存可以限制,其他指标也可以滴,但要更具实际情况限制。
© 版权声明
THE END
喜欢就支持一下吧
点赞16赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容