将静态公共 IP 地址和 DNS 标签用于 Azure Kubernetes 服务 (AKS) 负载均衡器

在 Azure Kubernetes 服务 (AKS) 群集中创建负载均衡器资源时,分配给该资源的公共 IP 地址仅在该资源的生命周期内有效。 如果删除 Kubernetes 服务,则会同时删除关联的负载均衡器和 IP 地址。 如果要分配特定 IP 地址或保留已重新部署的 Kubernetes 服务的 IP 地址,请创建并使用静态公共 IP 地址。

本文介绍如何创建静态公共 IP 地址并将其分配给 Kubernetes 服务。

开始之前

创建 AKS 群集

  1. 使用 az group create 命令创建 Azure 资源组。

    az group create --name myNetworkResourceGroup --location chinanorth3
    
  2. 使用 az aks create 命令创建 AKS 群集。

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

创建静态 IP 地址

  1. 使用命令“az aks show”获取节点资源组的名称,并查询属性“nodeResourceGroup”。

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. 使用 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 地址之前升级到标准负载均衡器

  3. 使用 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 服务

  1. 创建一个名为 load-balancer-service.yaml 的文件,并将以下 YAML 文件的内容复制到该文件中。 提供在“创建静态 IP 地址”部分和节点资源组名称中创建的公共 IP 资源名称(myAKSPublicIP)。

    默认情况下,AKS 控制平面标识对节点资源组具有“参与者”权限,因此在本文中创建的公共 IP 不需要其他角色分配。 如果在其他资源组中使用入站或出站公共 IP,请向控制平面标识授予对该资源组所需的权限。 有关详细信息,请参阅 AKS 中的托管标识

    重要

    loadBalancerIP Kubernetes 服务清单中的属性在上游 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,并强烈建议这样做以避免潜在的限流。

  2. 使用 service.beta.kubernetes.io/azure-dns-label-name 服务注释,为该服务设置面向公众的 DNS 标签。 这将使用 Azure 的公共 DNS 服务器和顶级域为你的服务发布完全限定的域名 (FQDN)。 注释值在 Azure 位置中必须是唯一的,因此我们建议您使用具有足够限定信息的标签。 Azure 会自动将所选位置的默认后缀追加到你提供的名称(例如 <location>.chinacloudapp.cn),从而创建 FQDN。

    注意

    若要在自己的域中发布服务,请参阅 Azure DNSexternal-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
    
  3. 在创建服务之前,请确保集群中有一个工作负载,其 Pod 使用了 app: azure-load-balancer 标签。 服务清单会选择带有此标签的 Pod,但不会创建 Deployment。

  4. 使用 kubectl apply 命令创建服务。

    kubectl apply -f load-balancer-service.yaml
    
  5. 验证该服务是否选择了至少一个处于运行状态且已就绪的 Pod。

    kubectl get pods -l app=azure-load-balancer
    
  6. 若要查看负载均衡器的 DNS 标签,请使用命令“kubectl describe”。

    kubectl describe service azure-load-balancer
    

    DNS 标签将列在 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