Web Analytics
Back
Featured image of post 如何在 Azure Kubernetes Service 使用靜態公開 IP 的 Load Balancer

如何在 Azure Kubernetes Service 使用靜態公開 IP 的 Load Balancer

詳細說明 troubleshooting 步驟

前言

Azure, GCP, 或 AWS 使用 Kubernetes Services 時皆有提供相對應的 Load Balancer 服務,以提供 Pod 對外/內部存取需求。但預設使用的 Load Balancer 只有在 Kubernetes 服務存在時有效,若您刪除/重新部署服務時,相關的 Load Balancer 也會一併刪除。當團隊需要使用固定 IP 位置時,您可以建立靜態 IP 位址,並將它指派給 Kubernetes 使用。

 
 
 

操作流程

若您想要建立一個固定公開 IP 位址給 AKS 服務使用,則需要先自行建立 Public IP Service 且設定為 Static。我們會建議將此 Public IP 服務建立在 Azure Kubernetes Service 內部資源群組內 (在您建立 AKS 時,同時會產生一個 MC_xxxx_xxxx_region 資源群組,Kubernetes 所需要的資源皆會在裡面),這樣可以節省授予 AKS 存取其他資源權限步驟。

若您想要建立 Public IP在其他資源群組,您可以參考文章下方 Troubleshooting 章節,有提供指令授予 Network Contributor 角色

 

首先先開啟 Cloud Shell:在 Azure Portal,點選右上方 Cloud Shell,並選取 Bash 方式執行。

 

我們透過下列指令,建立 Static Public IP:

az network public-ip create \
    --resource-group <aks 背後服務所在資源群組> \
    --name <Public IP 服務名稱> \
    --sku Standard \
    --allocation-method static

 

建立完成後,會得到相關資訊,內部即有 IP 位址 (紀錄備用)

{
  "publicIp": {
    ...
    "ipAddress": "40.121.183.52",
    ...
  }
}

 

接下來,我們要將 IP 位置指派給 AKS 使用。建立 service yaml 如下,將剛剛建立的公開 IP 位置與所在的資源群組名稱填入

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-resource-group: <資源群組名稱>
  name: webapp
  labels:
    app: web-site
    service: webapp
spec:
  loadBalancerIP: <靜態位置>
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    service: webapp

 

最後,Apply Service 元件完成

kubectl apply -f load-balancer-service.yaml

 

您可以使用下列指令確認服務是否運行 (建立 Load Balancer 與指派 IP 需要 30 秒,若建立時間太久請參考下方 Troubleshooting 章節)

kubectl get all

 
 

Troubleshooting

若你發現你的 Load Balancer 一直在 Pending 狀態,你可能遇到下列三種問題:

  1. LoadBalancer SKUs does not match standard/basic issue (Public IP 與 Load balancer 等級必須相同,如果 Public 使用 Standard,Load balancer 也需要是 Standard)
  2. Regions does not match (Public IP 與 Load balancer 所在區域必須相同)
  3. service principal does not have rights to create LoadBalancer. (需給予 Kubernetes Cluster 其他資源群組權限)

 

你可以使用下列指令確定問題為何

kubectl get events --all-namespaces

 

若你發生上列第三點權限問題 (即靜態 IP 位置不是建立 Kubernetes 預設的資源群組內),你可以透過下列指令指派 Kubernetes Cluster 權限給該資源群組

az role assignment create --assignee <Client ID> --role "Network Contributor" --scope /subscriptions/<訂用帳戶識別碼>/resourceGroups/<資源群組名稱>

 

若您弄不清楚給予誰權限,你可以透過 kubectl get events 指令,錯誤訊息內會有詳細說明

 
 

參考資料

搭配使用靜態公用 IP 位址和 DNS 標籤與 Azure Kubernetes Service (AKS) 負載平衡器

Built with Hugo   Theme Stack designed by Jimmy