背景:
- 有两个服务,server 负责主要后端请求,bill 负责计量计费请求。
- 服务都是使用 helm 部署。
- 测试提了一个缺陷,说全部服务没有配置hpa。
解决一
按照之前的代码结构添加了hpa后,发现:
➜ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
server Deployment/server <unknown>/50%, <unknown>/50% 2 5 2 2m4s
网上查了hpa的文档后,发现是Deployment里面没有配置resource request/limit。
按照要求添加了resource request/limit后,确实可以了。
➜ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
server Deployment/server 6%/50%, 1%/50% 2 5 2 23m
解决二
但 server 服务是可以了,bill 服务还是不行。网上各种找答案,对比配置,最终在官方文档里找到答案:
在每个时间段内,控制器管理器都会根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。 控制器管理器找到由 scaleTargetRef 定义的目标资源,然后根据目标资源的 .spec.selector 标签选择 Pod, 并从资源指标 API(针对每个 Pod 的资源指标)或自定义指标获取指标 API(适用于所有其他指标)。
于是根据bill的 deployment 里 .spec.selector 查询出来发现还多了一个pre-job pod,这个pre-job是升级的时候用来更新数据库/crd等资源的pod。
➜ kubectl get po -l app.kubernetes.io/instance=bill,app.kubernetes.io/name=bill
NAME READY STATUS RESTARTS AGE
bill-7ff45cc64b-d8fm5 1/1 Running 0 138m
bill-7ff45cc64b-swsfb 1/1 Running 0 138m
bill-pre-job-q8m28 0/1 Completed 0 138m
然后给对应的这个pre-job 模板里也加上resource request/limit后,确实可以了。
解决三
测试又提了bug,说这样配置后会导致只能扩展增加副本数,不能减少。
现象很奇怪,怀疑是使用label能查到pre-job的pod导致的,删除pre-job的pod和去掉pre-job的相关label,再测,发现可以正常缩容了。