Terraform: получение IP-адреса балансировщика нагрузки входного контроллера nginx

#kubernetes #terraform #azure-aks

Вопрос:

Я пытаюсь получить ip-адрес балансировщика нагрузки контроллера входа nginx в Azure AKS. Я решил, что буду использовать провайдера kubernetes через:

 data "kubernetes_service" "nginx_service" {  metadata {  name = "${local.ingress_name}-ingress-nginx-controller"  namespace = local.ingress_ns  }   depends_on = [helm_release.ingress] }  

Однако я не вижу IP-адреса, это то, что я получаю обратно:

 nginx_service = [    {    cluster_ip = "10.0.165.249"    external_ips = []    external_name = ""    external_traffic_policy = "Local"    health_check_node_port = 31089    load_balancer_ip = ""    load_balancer_source_ranges = []    port = [    {    name = "http"    node_port = 30784    port = 80    protocol = "TCP"    target_port = "http"  },    {    name = "https"    node_port = 32337    port = 443    protocol = "TCP"    target_port = "https"  },  ]    publish_not_ready_addresses = false    selector = {    "app.kubernetes.io/component" = "controller"    "app.kubernetes.io/instance" = "nginx-ingress-internal"    "app.kubernetes.io/name" = "ingress-nginx"  }    session_affinity = "None"    type = "LoadBalancer"  },  ]  

Однако, когда я отключаю службу через kubectl , я могу получить IP-адрес через:

 kubectl get svc nginx-ingress-internal-ingress-nginx-controller -n nginx-ingress -o json | jq -r '.status.loadBalancer.ingress[].ip' 10.141.100.158  

Является ли это ограничением поставщика kubernetes для AKS? Если да, то какой обходной путь использовали другие люди? Мои конечные цели-использовать IP-адрес для настройки серверной части шлюза приложений.

Я думаю , что могу использовать local-exec , но это кажется банальным. Однако на данный момент это может быть моим единственным вариантом.

Спасибо,

Джерри

Ответ №1:

хотя я настоятельно не советую создавать ресурсы внутри Kubernetes с помощью Terraform, вы можете это сделать:

Создайте общедоступный IP-адрес с помощью Terraform- gt; Создайте вход-nginx внутри Kubernetes с помощью Terraform и передайте gt; annotations и loadBalancerIP данные из ваших ресурсов Terraform. Окончательный манифест должен выглядеть следующим образом:

 apiVersion: v1 kind: Service metadata:  annotations:  service.beta.kubernetes.io/azure-load-balancer-resource-group: myResourceGroup  name: ingress-nginx-controller spec:  loadBalancerIP: lt;YOUR_STATIC_IPgt;  type: LoadBalancer  

Терраформа может выглядеть так:

 resource "kubernetes_service" "ingress_nginx" {  metadata {  name = "tingress-nginx-controller"    annotations {  "service.beta.kubernetes.io/azure-load-balancer-resource-group" = "${azurerm_resource_group.YOUR_RG.name}"  }   spec {  selector = {  app = lt;PLACEHOLDERgt;  }  port {  port = lt;PLACEHOLDERgt;  target_port = lt;PLACEHOLDERgt;  }   type = "LoadBalancer"  load_balancer_ip = "${azurerm_public_ip.YOUR_IP.ip_address}"  } }  

Ответ №2:

К сожалению, это для внутреннего входа, а не для публичного доступа, и IP-адрес выделяется динамически. В настоящее время мы не хотим использовать статические IP-адреса

Вот что я придумал:

 module "load_balancer_ip" {  count = local.create_ingress ? 1 : 0   source = "github.com/matti/terraform-shell-resource?ref=v1.5.0"  command = "./scripts/get_load_balancer_ip.sh"   environment = {  KUBECONFIG = base64encode(module.aks.kube_admin_config_raw)  }   depends_on = [local_file.load_balancer_ip_script] }  resource "local_file" "load_balancer_ip_script" {  count = local.create_ingress ? 1 : 0   filename = "./scripts/get_load_balancer_ip.sh"  content = lt;lt;-EOT  #!/bin/bash  echo $KUBECONFIG | base64 --decode gt; kubeconfig  kubectl get svc -n ${local.ingress_ns} ${local.ingress_name}-ingress-nginx-controller --kubeconfig kubeconfig -o=jsonpath='{.status.loadBalancer.ingress[0].ip}'  rm -f kubeconfig 2gt;amp;1 gt;/dev/null  EOT }  output nginx_ip {  description = "IP address of the internal nginx controller"  value = local.create_ingress ? module.load_balancer_ip[0].content : null }  

Комментарии:

1. с помощью этой конфигурации у вас возникнет проблема, когда ваша конфигурация kubeconfig изменится….bcs terrafrom обновит конфигурацию kubeconfig, а затем ваш ресурс local_file не может быть применен….я бы рекомендовал использовать статические IP-адреса или разделить эту конфигурацию на собственный файл состояния terraform