IabSDocker3天前更新关注私信 节点压力驱逐再部署集群时是默认开启的,但是默认的阈值较低,有时可能还没等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 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任何反应时间 从kubelet日志中看到MemoryPressure,MemoryPressure是硬件资源压力的直接信号 二、软驱逐测试 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 ~]# 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才被驱逐。 从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 最后 生产环境建议配置合适的参数,当然不止内存可以限制,其他指标也可以滴,但要更具实际情况限制。 © 版权声明文章版权归作者所有,未经允许请勿转载。THE ENDKubernetes# kubernetes# k8s 喜欢就支持一下吧点赞16赞赏 分享QQ空间微博QQ好友海报分享复制链接收藏