需求
在Grafana监控面板里,可看到部分服务的pod对CPU的使用高达3:
而该pod的部署脚本为:
spec:
template:
spec:
containers:
- name: data-fusion-server
resources:
limits:
cpu: '2'
memory: 4Gi
requests:
cpu: 10m
memory: 500Mi
livenessProbe:
httpGet:
path: /health
port: tcp
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 1
periodSeconds: 5
successThreshold: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: tcp
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 1
periodSeconds: 5
successThreshold: 1
failureThreshold: 3
startupProbe:
httpGet:
path: /health
port: tcp
scheme: HTTP
initialDelaySeconds: 80
timeoutSeconds: 1
periodSeconds: 5
successThreshold: 1
failureThreshold: 3
也就是说,k8s限制pod可使用的CPU资源为2个。
pod使用的CPU资源对于k8s限制的CPU资源。
可简单分两种情况:
- pod就是需要占用3个CPU资源,比如上面这个截图里,CPU使用率一直都非常稳定(截图有缩略,只截了2小时)。此时开发应该告诉运维,修改
resources.limits.cpu
,提高此配额。当然,并不是说,开发不需要去深入思考,为啥pod占用如此高的CPU,但是不排除部分pod就是要比其他pod使用更多的CPU。 - pod绝大多数时间内,CPU使用率都比较低(假设是0.9个CPU);因为某些暂时不清楚的异常情况,一段时间内(比如10分钟)突然飙升到使用3个CPU;经过10分钟后,CPU使用率还是迟迟不降下来。又或者10分钟后,CPU使用下降,此时需要判断是否有定时调度任务触发执行。
对于第二种情况,如果迟迟不下降,此时服务已经不正常,则大概率无法正常完成服务请求,如果没有正确的负载均衡策略,则打到此pod的用户请求将得不到正确的处理。
需求来了:检测到pod使用的CPU资源,如果异常,则触发自动重启(而不是开发或运维,偶然间发现pod异常,然后手动重启)。
当然,另一方面,如果pod使用的CPU异常飙高,开发人员需要去检查应用或代码哪里出现问题。
调研
主要就是请教ChatGPT,给出的答复如下:
通过资源限制间接实现自动重启
设置CPU使用的限制值(limits),