确保每个 kubernetes 节点至少有一个 ingress-nginx

确保每个 kubernetes 节点至少有一个 ingress-nginx

我正在尝试为 ingress-nginx 编写一个自动缩放配置,通过 helm chart 部署。

我的目标是:

  • 至少 3 个副本(因为我至少有 3 个节点)
  • 确保每个节点只有一个 nginx,但是:
  • 具有弹性,如果自动缩放表明我们需要 4 个 nginx,则允许集群中的一个节点有 2 个
  • 如果添加了第四个节点,请确保生成一个新的 nginx

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

我尝试使用下面的设置和它们的组合,但总是出现一些问题,例如现在我有第四个 nginx,它因为某种原因想要生成,但由于反亲和性规则而无法生成。

有人可以分享一些如何实现这一目标的想法吗?

  • 每个节点始终有一个 nginx,如果创建了新节点,则会创建一个新的 nginx
  • 保留自动扩展,如果 hpa 想要在 3 节点集群上生成第四个 nginx,它应该可以自由地这样做
      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

答案1

如果每个节点只需要一个 nginx 实例,那么将其部署为DaemonSet

正如您在官方文档中看到的:

ADaemonSet确保所有(或部分)节点都运行 Pod 的副本。随着节点添加到集群,Pod 也会添加到其中。随着节点从集群中移除,这些 Pod 会被垃圾回收。删除 DaemonSet 将清理其创建的 Pod。

这似乎正是您用例中的正确解决方案。

正如你在评论中正确指出的那样,nginx-ingress 官方helm chart可以部署为DeploymentDaemonSet。可以做到通过调整其values.yaml文件

相关内容