2

我想用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 ,据我了解,它允许我为 NLB 设置 ip 地址,但它没有按我的预期工作,每次我重新创建 nginx 控制器时,ip 地址都是不同的,下面是 K8s 服务 yaml 文件。

# 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

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

4

2 回答 2

2

唯一要管理的 LB(至少在 AWS LB 控制器的当前版本 2.3 中)是“nlb-ip”和“external”类型。这在以下位置指定: https ://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.3/guide/service/annotations/#legacy-cloud-provider

注释 service.beta.kubernetes.io/aws-load-balancer-type 用于确定哪个控制器协调服务。如果注释值为 nlb-ip 或 external,则传统云提供商会忽略服务资源(前提是它具有正确的补丁),以便 AWS 负载均衡器控制器可以接管。对于注释的所有其他值,传统云提供商将处理该服务。请注意,此注释应在服务创建期间指定,以后不要编辑。

于 2021-10-26T20:07:20.220 回答
2

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

我用 helm 图表安装了AWS 负载均衡器控制器,然后我用这个 helm 图表安装了 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

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

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

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

根据文档标记子网是个好主意:

键:kubernetes.io/cluster/my-cluster-name 值:共享

键:kubernetes.io/role/internal-elb 值:1

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

于 2021-07-28T01:49:36.923 回答