Estou tentando escrever uma configuração de escalonamento automático para o ingress-nginx, implantada por meio do gráfico do helm.
meus objetivos são:
- 3 réplicas mínimas (porque tenho no mínimo 3 nós)
- garanta apenas um nginx por nó, mas:
- ser elástico, se a escala automática disser que precisamos de 4 nginx, permita que um nó no cluster tenha 2
- se um quarto nó for adicionado, garanta que um novo nginx seja gerado
https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml#L326 https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml#L343 https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml#L256
Tentei brincar com as configurações abaixo e uma combinação delas, mas sempre há algo errado, por exemplo, agora tenho um quarto nginx que deseja gerar por algum motivo e não pode por causa da regra de antiafinidade.
Alguém pode compartilhar algumas idéias de como conseguir isso?
- sempre um nginx por nó, se um novo nó for criado, um novo nginx será criado
- preservar o escalonamento automático, se o HPA quiser gerar um quarto nginx em um cluster de 3 nós, ele deverá estar livre para fazê-lo
replicaCount: 3
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- ingress-nginx
- key: app.kubernetes.io/instance
operator: In
values:
- ingress-nginx
- key: app.kubernetes.io/component
operator: In
values:
- controller
topologyKey: "kubernetes.io/hostname"
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app.kubernetes.io/instance: ingress-nginx
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 6
targetCPUUtilizationPercentage: 75
targetMemoryUtilizationPercentage: 100
Responder1
Se você precisar de apenas uma instância nginx por nó, não seria mais fácil implantá-la comoDaemonSet?
Como você pode ler nos documentos oficiais:
ADaemonSetgarante que todos (ou alguns) nós executem uma cópia de um pod. À medida que os nós são adicionados ao cluster, os pods são adicionados a eles. À medida que os nós são removidos do cluster, esses pods são coletados como lixo. Excluir um DaemonSet limpará os pods criados por ele.
E esta parece ser a solução certa no seu caso de uso.
Como você sugeriu corretamente em seu comentário,gráfico oficial do leme nginx-ingresspode ser implantado como um Deployment
ou como um arquivo DaemonSet
. Pode ser feitoajustando seu values.yaml
arquivo.