创建 Kubenetes 服务时如何设置 AWS NLB 的私有 ip 地址?

时间:2021-06-18 07:20:10

标签: amazon-web-services kubernetes nginx-ingress aws-nlb

我想创建一个带有AWS内部NLB的nginx入口控制器,要求是固定NLB端点的IP地址,例如,目前Nginx入口服务的NLB dns是abc.elb.eu-central-1 .amazonaws.com 解析为 ip 地址 192.168.1.10,如果我删除并重新创建 nginx 入口控制器,我希望 NLB DNS 必须与以前相同。 看看 kubernetes 服务注释,我没有看到任何重用现有 NLB 的方法,但是,我发现了注释 service.beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses 3}},据我所知,它允许我为NLB设置ip地址,但它不符合我的预期,每次我重新创建nginx控制器时,ip地址都是不同的,下面是K8s服务yaml文件。< /p>

# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    service.beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses: "10.136.103.251"
    service.beta.kubernetes.io/aws-load-balancer-subnets: "subnet-00df069133b22"
  labels:
    helm.sh/chart: ingress-nginx-3.23.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.44.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local

我知道这个要求很奇怪,可以这样做吗?

1 个答案:

答案 0 :(得分:0)

如果您的 Kubernetes 集群在具有多个子网的 VPC 上运行(可能是这种情况),您必须为每个子网提供一个私有 IP 地址。

我用舵图安装了 AWS Load balancer controller,然后我用舵图安装了 nginx 入口控制器:

helm install nginx-ingress ingress-nginx/ingress-nginx --namespace nginx-ingress -f internal-ingress-values.yaml

这里是internal-ingress-values.yaml的内容

controller:
  ingressClass: nginx
  service:
    enableHttp: false
    enableHttps: true
    annotations:
      service.beta.kubernetes.io/aws-load-balancer-type: external
      service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
      service.beta.kubernetes.io/aws-load-balancer-scheme: internal
      service.beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses: 10.136.103.251, 10.136.104.251
      service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-00a1a7f9949aa0ba1, subnet-12ea9f1df24aa332c
  ingressClassResource:
    enabled: true
    default: true

根据 documentation service.beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses 注释长度/顺序必须匹配子网 em>

因此,您必须以相同的顺序提供 IP 地址和子网(不要错配)。 如果你以我上面的例子为例,你必须确保:

  • 10.136.103.251 包含在子网 00a1a7f9949aa0ba1 中
  • 10.136.104.251 包含在子网 12ea9f1df24aa332c 中

最好根据 documentation 标记您的子网:

密钥:kubernetes.io/cluster/my-cluster-name 价值:共享

密钥:kubernetes.io/role/internal-elb 值:1

我在 1.20 上测试了这个 K8S,它适用于我的项目。 如果您使用的是 K8S <= 1.17,请不要提供“ingressClassResource”。