Как установить частный IP-адрес AWS NLB при создании сервиса Kubenetes?

Я хотел бы создать контроллер входящего трафика nginx с внутренним NLB AWS, требование - исправить IP-адрес конечной точки NLB, например, в настоящее время DNS-сервер NLB для входящего сервиса Nginx - abc.elb.eu-central-1.amazonaws. com, который разрешен в IP-адрес 192.168.1.10, если я удалю и повторно создаю контроллер входа nginx, я хочу, чтобы DNS NLB был таким же, как и раньше. Заглянув в аннотацию сервиса kubernetes, я не увидел возможности повторно использовать существующий NLB, однако я обнаружил сервис аннотации .beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses в ссылке , Насколько я понимаю, это позволяет мне установить IP-адрес для NLB, но он не работает, как я ожидал, каждый раз, когда я повторно создавал контроллер nginx, IP-адрес отличается. Ниже приведен файл yaml службы K8s.

      # 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

Я знаю, что это требование неверно, возможно ли это?

2 ответа

Во-первых, я не уверен, что это значение аннотации является действительным, поскольку оно не фигурирует .

      service.beta.kubernetes.io/aws-load-balancer-type: "nlb"

Если ваш кластер Kubernetes работает в VPC с более чем одной подсетью (что, вероятно, так), вы должны предоставить частный IP-адрес для каждой подсети.

Я установил схему штурвала с помощью этой команды:

      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

Примечание: согласно в официальной документациидокументации к сервису .beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses аннотации

Длина / порядок должны соответствовать подсетям

Вы должны указать IP-адреса и подсеть в одном и том же порядке (не допускайте несовпадений). Если взять мой пример, вы должны убедиться, что:

  • 10.136.103.251 входит в подсеть-00a1a7f9949aa0ba1
  • 10.136.104.251 входит в подсеть-12ea9f1df24aa332c

Я тестировал этот K8S на 1.20, и он работает для моего проекта. Не предоставляйте ingressClassResource, если вы используете K8S <= 1.17.

Единственными LB, которые будут управляться (по крайней мере, в текущей версии 2.3 AWS LB Controller), будут типы «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 Load Balancer мог взять на себя управление. Для всех других значений аннотации устаревший облачный провайдер будет обрабатывать сервис. Обратите внимание, что эта аннотация должна быть указана при создании службы и не редактироваться позже.

Другие вопросы по тегам