Tengo un HorizontalPodAutoscalar para escalar mis pods según la CPU. El minReplicas aquí se establece en 5 :
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: myapp-web spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp-web minReplicas: 5 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50Luego agregué trabajos de Cron para escalar hacia arriba o hacia abajo mi escalador automático de pod horizontal según la hora del día:
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: production name: cron-runner rules: - apiGroups: ["autoscaling"] resources: ["horizontalpodautoscalers"] verbs: ["patch", "get"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: cron-runner namespace: production subjects: - kind: ServiceAccount name: sa-cron-runner namespace: production roleRef: kind: Role name: cron-runner apiGroup: rbac.authorization.k8s.io --- apiVersion: v1 kind: ServiceAccount metadata: name: sa-cron-runner namespace: production --- apiVersion: batch/v1beta1 kind: CronJob metadata: name: django-scale-up-job namespace: production spec: schedule: "56 11 * * 1-6" successfulJobsHistoryLimit: 0 # Remove after successful completion failedJobsHistoryLimit: 1 # Retain failed so that we see it concurrencyPolicy: Forbid jobTemplate: spec: template: spec: serviceAccountName: sa-cron-runner containers: - name: django-scale-up-job image: bitnami/kubectl:latest command: - /bin/sh - -c - kubectl patch hpa myapp-web --patch '{"spec":{"minReplicas":8}}' restartPolicy: OnFailure ---- apiVersion: batch/v1beta1 kind: CronJob metadata: name: django-scale-down-job namespace: production spec: schedule: "30 20 * * 1-6" concurrencyPolicy: Forbid successfulJobsHistoryLimit: 0 # Remove after successful completion failedJobsHistoryLimit: 1 # Retain failed so that we see it jobTemplate: spec: template: spec: serviceAccountName: sa-cron-runner containers: - name: django-scale-down-job image: bitnami/kubectl:latest command: - /bin/sh - -c - kubectl patch hpa myapp-web --patch '{"spec":{"minReplicas":5}}' restartPolicy: OnFailure Esto funciona muy bien, excepto que ahora, cuando lo implemento, sobrescribe este valor de minReplicas con minReplicas en la especificación HorizontalPodAutoscaler (en mi caso, está configurado en 5)
Estoy implementando mi HPA usando kubectl apply -f ~/autoscale.yaml
¿Hay alguna manera de manejar esta situación? ¿Necesito crear algún tipo de lógica compartida para que mis scripts de implementación puedan determinar cuál debería ser el valor de minReplicas? ¿O hay una forma más sencilla de manejar esto?
Creo que también podrías considerar las siguientes dos opciones:
La idea principal detrás de esta solución es consultar el estado de un recurso de clúster específico (aquí HPA ) antes de intentar crearlo/recrearlo con los comandos de install / upgrade de helm .
Me refiero a verificar el valor actual minReplicas cada vez antes de actualizar su pila de aplicaciones.
HPA por separado para los archivos de manifiesto de la aplicación Aquí puede transferir esta tarea a un operador HPA dedicado, que puede coexistir con sus CronJobs que ajustan minReplicas según un cronograma específico: