AKS 使用 terraform 连接到私有 vnet 中的 Azure 子网
AKS connected to an Azure subnet in a private vnet with terraform
我想使用 terraform 将 AKS 集群连接到内部 VNET/subnet。理想情况下,我希望将单个 IP 分配给该服务,并为该服务中的所有 pods 维护一个私有服务 IP。类似于:
- vnet/subnet IP cidr 为 172.16.0.0/16
- 服务 cidr 为 172.16.1.0/24
- pods 将于 10.10.10.0/24
其中基本上将单个 IP 分配给服务 cidr。这样我们就可以保持 pods 与外界的隔离。然后我会设置一个允许外部访问的入口控制器,如果 pods 需要访问内部 vnet 上的资源,它们应该能够通过服务路由 --> 子网等
我看不到它能正常工作。在 terraform 中配置它的最佳方法是什么?
需要说明的是,我不希望每个 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 将使用 LoadBalancer
和 PublicIP
。或者,您可以指定 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
我想使用 terraform 将 AKS 集群连接到内部 VNET/subnet。理想情况下,我希望将单个 IP 分配给该服务,并为该服务中的所有 pods 维护一个私有服务 IP。类似于:
- vnet/subnet IP cidr 为 172.16.0.0/16
- 服务 cidr 为 172.16.1.0/24
- pods 将于 10.10.10.0/24
其中基本上将单个 IP 分配给服务 cidr。这样我们就可以保持 pods 与外界的隔离。然后我会设置一个允许外部访问的入口控制器,如果 pods 需要访问内部 vnet 上的资源,它们应该能够通过服务路由 --> 子网等
我看不到它能正常工作。在 terraform 中配置它的最佳方法是什么?
需要说明的是,我不希望每个 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 将使用 LoadBalancer
和 PublicIP
。或者,您可以指定 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