AKS 使用 terraform 连接到私有 vnet 中的 Azure 子网

AKS connected to an Azure subnet in a private vnet with terraform

我想使用 terraform 将 AKS 集群连接到内部 VNET/subnet。理想情况下,我希望将单个 IP 分配给该服务,并为该服务中的所有 pods 维护一个私有服务 IP。类似于:

其中基本上将单个 IP 分配给服务 cidr。这样我们就可以保持 pods 与外界的隔离。然后我会设置一个允许外部访问的入口控制器,如果 pods 需要访问内部 vnet 上的资源,它们应该能够通过服务路由 --> 子网等

我看不到它能正常工作。在 terraform 中配置它的最佳方法是什么?

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster#network_profile

需要说明的是,我不希望每个 Pod 都收到分配的子网地址。

您可以使用 kubenet 作为 CNI。 Kubenet 使用所谓的覆盖网络并因此进行 NAT,这意味着 AKS 集群节点在您的子网中获取 IP,并且 Pods 从逻辑上不同的地址 space.

接收 IP 地址

老实说,我会像您指定的那样向用户推荐更大的网络(至少 /16):

注意:如果 Vnet 和子网已经存在,您需要使用 Terraform 导入它们以在那里创建您的 AKS。

  network_profile {
    network_plugin     = kubenet
    pod_cidr           = 10.10.10.0/24
    service_cidr       = 172.16.1.0/24
    docker_bridge_cidr = 172.18.0.1/16
    dns_service_ip     = 172.16.1.10
    outbound_type      = userDefinedRouting
  }

  default_node_pool {
    vnet_subnet_id     = azurerm_subnet.YOUR_SUBNET.id
    ...
  }

出口:

Kubernetes 不会像您 described/want 那样将出口流量从服务路由到子网。默认情况下,AKS 将使用 LoadBalancerPublicIP。或者,您可以指定 userDefinedRouting 作为 AKS 的出站类型并创建自己的路由。

入口:

入口将通过 Azure LoadBalancer 路由到 AKS。 Ingress 控制器将获得一个 Public IP,您也可以使用 terraform 预先创建该 IP(仅 PublicIP,而不是 LoadBalancer)并分配给 Ingress Controller 的服务。

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-resource-group: myResourceGroup # only needed if the LB is in another RG
  name: ingress-nginx-controller
spec:
  loadBalancerIP: <YOUR_STATIC_IP>
  type: LoadBalancer

您还可以创建一个 internal LoadBalancer 并从您的子网分配一个私有 IP:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
  name: ingress-nginx-controller-internal
spec:
  loadBalancerIP: <YOUR_STATIC_PRIVATE_IP>
  type: LoadBalancer