如何使用 ingress-nginx 图表仅创建内部负载均衡器?

yog*_*gen 9 kubernetes-helm amazon-eks nginx-ingress

在我的 AWS EKS 中,我使用以下命令安装了 nginx-ingress:

helm upgrade --install -f controller.yaml \
    --namespace nginx-ingress \
    --create-namespace \
    --version 3.26.0 \
    nginx-ingress ingress-nginx/ingress-nginx 
Run Code Online (Sandbox Code Playgroud)

文件controller.yaml看起来像这样:

controller:
  ingressClass: nginx-internal
  service:
    internal:
      enabled: true
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0

Run Code Online (Sandbox Code Playgroud)

我有几个应用程序,每个应用程序都有不同的虚拟主机的单独入口,我希望所有入口对象都指向内部负载均衡器,即使我设置了ingressClass应用程序的入口,它们似乎也指向公共负载均衡器:

kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx-internal
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法只创建单个内部负载均衡器,其入口指向该负载均衡器?

谢谢

dev*_*bot 5

我设法通过使用以下内容来使其工作controller.yaml

controller:
  ingressClassByName: true
  
  ingressClassResource:
    name: nginx-internal
    enabled: true
    default: false
    controllerValue: "k8s.io/ingress-nginx-internal"

  service:
    # Disable the external LB
    external:
      enabled: false

    # Enable the internal LB. The annotations are important here, without
    # these you will get a "classic" loadbalancer
    internal:
      enabled: true
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
        service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
        service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
Run Code Online (Sandbox Code Playgroud)

然后你可以使用ingressClassName如下

kind: Ingress
spec:
  ingressClassName: nginx-internal
Run Code Online (Sandbox Code Playgroud)

这不是必需的,但我将其部署到反映内部唯一入口的命名空间

helm upgrade --install \
  --create-namespace ingress-nginx-internal ingress-nginx/ingress-nginx \
  --namespace ingress-nginx-internal \
  -f controller.yaml
Run Code Online (Sandbox Code Playgroud)


小智 3

注意到controller.yaml您启用了internal设置。根据文档,此设置创建两个负载均衡器,一个外部负载均衡器和一个内部负载均衡器,以防您希望将某些应用程序公开到互联网,而其他应用程序仅在同一 k8s 集群中的 vpc 内部公开。

controller.yaml如果您只需要一个内部负载均衡器,请尝试按如下方式进行设置:

controller:
  service:
    annotations:
      service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
      service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
      service.beta.kubernetes.io/aws-load-balancer-type: nlb
      service.beta.kubernetes.io/aws-load-balancer-internal: "true" 
      service.beta.kubernetes.io/aws-load-balancer-subnets: "subnet-xxxxx,subnet-yyyyy,subnet-zzzzz"
Run Code Online (Sandbox Code Playgroud)

它将只提供一个 NBL 在内部路由流量。

使用service.beta.kubernetes.io/aws-load-balancer-subnets注释,您可以选择负载均衡器将流量路由到的可用区/子网。

如果删除service.beta.kubernetes.io/aws-load-balancer-type注释,将配置 Classic Load Balancer 而不是网络。

  • 每当我将“service.beta.kubernetes.io/aws-load-balancer-scheme”设置为“内部”时,按照您的指示(以及互联网上的几乎所有其他指示),它都会提供“面向互联网”的 NLB。有任何想法吗? (5认同)