在 Azure Kubernetes 服务 (AKS) 群集中创建负载均衡器资源时,分配给该资源的公共 IP 地址仅在该资源的生命周期内有效。 如果删除 Kubernetes 服务,则会同时删除关联的负载均衡器和 IP 地址。 如果要分配特定 IP 地址或保留已重新部署的 Kubernetes 服务的 IP 地址,请创建并使用静态公共 IP 地址。
本文介绍如何创建静态公共 IP 地址并将其分配给 Kubernetes 服务。
开始之前
- 需要安装和配置 Azure CLI 版本 2.0.59 或更高版本。 运行
az --version即可查找版本。 若要安装或升级,请参阅安装 Azure CLI。 - 本文介绍如何将标准 SKU IP 与 标准 SKU 负载均衡器结合使用。 有关详细信息,请参阅 Azure 中的 IP 地址类型和分配方法。
创建 AKS 群集
使用
az group create命令创建 Azure 资源组。az group create --name myNetworkResourceGroup --location chinanorth3使用
az aks create命令创建 AKS 群集。az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
创建静态 IP 地址
使用命令“
az aks show”获取节点资源组的名称,并查询属性“nodeResourceGroup”。az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv使用
az network public-ip create命令在节点资源组中创建静态公共 IP 地址。az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static重要
AKS 不再支持基本负载均衡器。 如果群集使用基本负载均衡器,请在配置静态公共 IP 地址之前升级到标准负载均衡器。
使用
az network public-ip show命令获取静态公共 IP 地址。 指定节点资源组的名称和你创建的公网 IP 地址,并查询ipAddress。az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
使用静态 IP 地址创建 Kubernetes 服务
创建一个名为
load-balancer-service.yaml的文件,并将以下 YAML 文件的内容复制到该文件中。 提供在“创建静态 IP 地址”部分和节点资源组名称中创建的公共 IP 资源名称(myAKSPublicIP)。默认情况下,AKS 控制平面标识对节点资源组具有“参与者”权限,因此在本文中创建的公共 IP 不需要其他角色分配。 如果在其他资源组中使用入站或出站公共 IP,请向控制平面标识授予对该资源组所需的权限。 有关详细信息,请参阅 AKS 中的托管标识。
重要
loadBalancerIPKubernetes 服务清单中的属性在上游 Kubernetes 之后已弃用。 现有服务在不修改的情况下继续工作,但改用服务批注。注释 Purpose service.beta.kubernetes.io/azure-pip-name指定公共 IP 资源名称。 service.beta.kubernetes.io/azure-load-balancer-ipv4指定 IPv4 地址。 service.beta.kubernetes.io/azure-load-balancer-ipv6指定 IPv6 地址。 apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer注意
添加
service.beta.kubernetes.io/azure-pip-name注解可确保以最高效的方式创建 LoadBalancer,并强烈建议这样做以避免潜在的限流。使用
service.beta.kubernetes.io/azure-dns-label-name服务注释,为该服务设置面向公众的 DNS 标签。 这将使用 Azure 的公共 DNS 服务器和顶级域为你的服务发布完全限定的域名 (FQDN)。 注释值在 Azure 位置中必须是唯一的,因此我们建议您使用具有足够限定信息的标签。 Azure 会自动将所选位置的默认后缀追加到你提供的名称(例如<location>.chinacloudapp.cn),从而创建 FQDN。注意
若要在自己的域中发布服务,请参阅 Azure DNS 和 external-dns 项目。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label> name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer在创建服务之前,请确保集群中有一个工作负载,其 Pod 使用了
app: azure-load-balancer标签。 服务清单会选择带有此标签的 Pod,但不会创建 Deployment。使用
kubectl apply命令创建服务。kubectl apply -f load-balancer-service.yaml验证该服务是否选择了至少一个处于运行状态且已就绪的 Pod。
kubectl get pods -l app=azure-load-balancer若要查看负载均衡器的 DNS 标签,请使用命令“
kubectl describe”。kubectl describe service azure-load-balancerDNS 标签将列在
Annotations下,如下面的精简示例输出所示:Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
疑难解答
本部分假定你已完成 创建静态 IP 地址,尝试使用 静态 IP 地址创建 Kubernetes 服务中的步骤,并具有正在运行的 AKS 群集。 若要检索节点资源组名称,请使用 az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv。
如果 service.beta.kubernetes.io/azure-load-balancer-resource-group 注释中命名的公共 IP 资源不存在于 service.beta.kubernetes.io/azure-pip-name 指定的资源组中,或者 AKS 控制平面身份无法访问该资源组,则创建负载均衡器服务将失败。 若要进行故障排除,请使用 kubectl describe 命令查看服务注释和创建事件。 提供 YAML 清单中指定的服务的名称,如以下示例中所示:
kubectl describe service azure-load-balancer
输出将显示有关 Kubernetes 服务资源的信息。 以下示例输出显示了 Events 中的一个 Warning:“user supplied IP address was not found。”在这种情况下,请确保 azure-pip-name 批注与静态公共 IP 资源的名称匹配,并且 azure-load-balancer-resource-group 批注与包含该资源的资源组匹配。
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
Selector: app=azure-load-balancer
Type: LoadBalancer
IP: 10.0.18.125
IP: 40.121.183.52
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32582/TCP
Endpoints: <pod-ip>:80
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreatingLoadBalancer 7s (x2 over 22s) service-controller Creating load balancer
Warning CreatingLoadBalancerFailed 6s (x2 over 12s) service-controller Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found
后续步骤
若要更好地控制发向应用程序的网络流量,请使用 AKS 的应用程序路由加载项。 有关应用程序路由加载项的详细信息,请参阅 使用应用程序路由加载项托管 NGINX Ingress。