搭配使用靜態公用 IP 位址和 DNS 標籤與 Azure Kubernetes Service (AKS) 負載平衡器
當您在Azure Kubernetes Service (AKS) 叢集中建立負載平衡器資源時,指派給它的公用 IP 位址只有在該資源的生命週期才有效。 如果您刪除 Kubernetes 服務,相關聯的負載平衡器和 IP 位址也會一併刪除。 如果您想要針對已重新部署的 Kubernetes 服務指派特定的 IP 位址或保留 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 eastus
使用
az aks create
命令建立 AKS 叢集。az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
建立靜態 IP 位址
使用
az network public ip create
命令建立靜態公用 IP 位址。az network public-ip create \ --resource-group myNetworkResourceGroup \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
注意
如果您在 AKS 叢集中使用 基本 SKU 負載平衡器,請在定義公用 IP 時,將 Basic 用於
--sku
參數。 只有基本 SKU IP 可用於基本 SKU 負載平衡器,且只有標準 SKU IP 可用於標準 SKU 負載平衡器。使用
az aks show
命令取得節點資源群組的名稱,並查詢nodeResourceGroup
屬性。az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
使用
az network public-ip list
命令取得靜態公用 IP 位址。 指定您建立的節點資源群組和公用 IP 位址的名稱,並查詢ipAddress
。az network public-ip show --resource-group <node resource group> --name myAKSPublicIP --query ipAddress --output tsv
使用靜態 IP 位址建立服務
請確定 AKS 叢集所使用的叢集身分識別具有使用 命令委派給節點資源群組
az role assignment create
的許可權。CLIENT_ID=$(az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query identity.principalId -o tsv) RG_SCOPE=$(az group show --name <node resource group> --query id -o tsv) az role assignment create \ --assignee ${CLIENT_ID} \ --role "Network Contributor" \ --scope ${RG_SCOPE}
重要
如果您自訂輸出 IP,請確定您的叢集身分識別具有輸出公用 IP 和輸入公用 IP 的許可權。
建立名為
load-balancer-service.yaml
的檔案,並在下列 YAML 檔案的內容中複製,並提供您在上一個步驟中建立的您自己的公用 IP 位址和節點資源組名。重要
將
loadBalancerIP
屬性新增至負載平衡器 YAML 資訊清單在 上游 Kubernetes之後已被取代。 雖然目前的使用量維持不變,而且現有的服務預期會在不修改的情況下運作,但 強烈建議改為設定服務批註 。 若要設定服務批註,您可以針對 IPv4 位址和service.beta.kubernetes.io/azure-load-balancer-ipv6
IPv6 位址使用service.beta.kubernetes.io/azure-load-balancer-ipv4
,如範例 YAML 所示。apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group> service.beta.kubernetes.io/azure-load-balancer-ipv4: <public IP address> service.beta.kubernetes.io/azure-pip-name: <public IP Name> 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>.cloudapp.azure.com
位置的預設尾碼附加至您提供的名稱,以建立 FQDN。注意
如果您想要在自己的網域上發佈服務,請參閱 Azure DNS 和 external-dns 專案。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group> service.beta.kubernetes.io/azure-load-balancer-ipv4: <public IP address> service.beta.kubernetes.io/azure-pip-name: <public IP Name> 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
使用 命令建立
kubectl apply
服務和部署。kubectl apply -f load-balancer-service.yaml
若要查看負載平衡器的 DNS 標籤,請使用
kubectl describe service
命令。kubectl describe service azure-load-balancer
DNS 標籤會列在 底下
Annotations
,如下列壓縮範例輸出所示:Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
疑難排解
如果 Kubernetes 服務資訊清單的 屬性中 loadBalancerIP
定義的靜態 IP 位址不存在或尚未在節點資源群組中建立,而且沒有設定其他委派,則負載平衡器服務建立會失敗。 若要進行疑難排解,請使用 kubectl describe
命令檢閱服務建立事件。 提供 YAML 資訊清單中指定的服務名稱,如下列範例所示:
kubectl describe service azure-load-balancer
輸出會顯示 Kubernetes 服務資源的相關資訊。 下列範例輸出顯示 Warning
Events
: 「 user supplied IP address was not found
.在此案例中,請確定您已在節點資源群組中建立靜態公用 IP 位址,而且 Kubernetes 服務資訊清單中指定的 IP 位址正確無誤。
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: <none>
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: <none>
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
下一步
若要進一步控制應用程式的網路流量,您可能會想要 建立輸入控制器。 您也可以使用靜態公用 IP 位址建立輸入控制器。