#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