您在 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 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 不再支援 Basic Load Balancer。 如果你的叢集使用 Basic Load Balancer,設定靜態公共 IP 位址前,請先升級到 Standard Load Balancer。
用指令
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.yamlYAML 檔案的檔案,並將內容複製到以下 YAML 檔案中。 請提供您在「建立靜態 IP 位址」區塊中建立的公共 IP 資源名稱myAKSPublicIP()以及節點資源群組名稱。AKS 控制平面身份預設擁有節點資源群組的貢獻者權限,因此你在本文中建立的公開 IP 不需要其他角色指派。 如果您在不同的資源群組中使用輸入或輸出的公用 IP,請在該資源群組上將所需權限授與控制平面身分識別。 欲了解更多資訊,請參閱 AKS 中的受管理身份。
重要
Kubernetes 服務清單中的這個
loadBalancerIP屬性在 上游 Kubernetes 之後會被棄用。 現有服務無需修改即可繼續正常運作,但請改用服務註解。Annotation 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>.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 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標籤。 服務清單會選擇帶有此標籤的 pods,但不會建立部署。請使用指令
kubectl apply建立服務。kubectl apply -f load-balancer-service.yaml確認服務至少選擇了一個運作中且已準備好的艙體。
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 位址,嘗試了 建立 Kubernetes 服務的步驟,並且有運行中的 AKS 叢集。 要取得節點資源群組名稱,請使用 az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv。
如果註解中 service.beta.kubernetes.io/azure-pip-name 指定的公共 IP 資源不存在於由 所 service.beta.kubernetes.io/azure-load-balancer-resource-group指定的資源群組中,或 AKS 控制平面身份無法存取該資源群組,負載平衡器服務建立將失敗。 為了排除故障,請使用 kubectl describe 指令來檢視服務註解與建立事件。 提供 YAML 資訊清單中所指定的服務名稱,如下列範例所示:
kubectl describe service azure-load-balancer
輸出會顯示 Kubernetes 服務資源的相關資訊。 以下範例輸出顯示 a Warning 在 Events: “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 入口與應用程式路由外掛」。