我们的团队运行着一组生产集群,其中包含许多过度配置大量资源的
Deployment
。我们希望使用 VPA 自动降低这些部署中容器的资源请求,但我们希望以破坏性最小的方式做到这一点,并且每周仅在流量较大的特定日期(例如星期日)应用一次更新很低。
我注意到 VPA-updater 组件有一个
updater-interval
flag,但这不允许一周中的特定一天,所以我很好奇是否有任何替代方案。
如何将 VPA 配置为每周仅在特定日期运行一次更新?
你是对的。 连续运行 VPA 可能会导致中断,尤其是在 HPA 已经到位的情况下。如果您发现每周更新具有破坏性,请将其更改为每月或调整部署的PodDisruptionBudget,以最大程度地减少 VPA 触发的重启的影响
DazWilkin 的想法很好。
az aks update --name ingress-demo-cluster --resource-group arkorg --enable-vpa
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: "500m"
memory: "512Mi"
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: nginx-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
updatePolicy:
updateMode: "Off"
创建一个 Cron 作业,在周日将 VPA 修补为
Auto
模式,或者如果每周感觉太具有破坏性,则每月进行一次,并在一小时后将其恢复为 Off
模式
apiVersion: batch/v1
kind: CronJob
metadata:
name: vpa-weekly-updater
spec:
schedule: "0 0 * * 0" # Every Sunday at midnight
jobTemplate:
spec:
template:
spec:
containers:
- name: vpa-patcher
image: bitnami/kubectl:latest
command:
- /bin/sh
- -c
- |
kubectl patch vpa nginx-vpa --type=json -p='[{"op": "replace", "path": "/spec/updatePolicy/updateMode", "value": "Auto"}]'
echo "Waiting for VPA updates to complete..."
sleep 3600 # Wait for 1 hour
kubectl patch vpa nginx-vpa --type=json -p='[{"op": "replace", "path": "/spec/updatePolicy/updateMode", "value": "Off"}]'
restartPolicy: OnFailure
完成。
kubectl get pods -l app=nginx
kubectl get vpa
kubectl create job --from=cronjob/vpa-weekly-updater vpa-test-job