共用方式為


設定跨 Azure Kubernetes Fleet Manager 成員叢集的 DNS 負載平衡 (預覽)

Azure Kubernetes Fleet Manager DNS 負載平衡有助於增加可用性,並將負載分散到部署於多個成員叢集的工作負載。 由於這項功能是透過 DNS 傳遞的,因此可用來視需要提供第 4 層和 7 層負載平衡。

請遵循本檔中的步驟,為車隊中裝載的多叢集應用程式設定 DNS 型負載平衡。

這很重要

Azure Kubernetes 機群管理員預覽功能由客戶自行決定取用。 預覽是「依現況」及「可用時」提供的,並不包括在服務等級協定和有限保固之內。 客戶支援部門會竭盡全力支援一部分的 Azure Kubernetes 機群管理員預覽功能。 因此,這些功能不適合實際執行用途。

我們的數據平面網路預覽會透過我們的 networking.fleet.azure.com/v1beta1 API 發行。 如果您沒有看到預覽物件,請檢查您是否在與 Fleet Manager 中樞叢集互動時要求 networking.fleet.azure.com/v1beta1 API。

先決條件

如果您沒有 Azure 帳戶,請在開始之前建立 免費帳戶

  • 請閱讀這項功能的概念性概觀,其中提供本文件所參考之 TrafficManagerProfileTrafficManagerBackend 物件的說明。

  • 具有中樞叢集和受控識別的 Kubernetes 機群管理員。 如果您沒有 Azure Kubernetes Fleet Manager,請參閱使用 Azure CLI 建立 Azure Kubernetes Fleet Manager 並加入成員叢集

  • 兩個成員叢集aks-member-1aks-member-2,您使用 Fleet Manager 的叢集資源放置(CRP),在這兩個叢集上部署相同的工作負載。

  • 完成設定的使用者有權執行 Azure 角色指派,以及存取 Fleet Manager 中樞叢集 Kubernetes API。 如需詳細資訊,請參閱 存取 Kubernetes API 以取得詳細數據。

  • 現有的 Azure 資源群組,裝載布建的 Azure 流量管理員資源。

  • 設定下列環境變數:

    export SUBSCRIPTION_ID=<subscription>
    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBER_CLUSTER_1=aks-member-1
    export MEMBER_CLUSTER_2=aks-member-2
    export TRAFFIC_MANAGER_GROUP=rg-flt-tm-demo
    export TRAFFIC_MANAGER_RG_ID="/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${TRAFFIC_MANAGER_GROUP}
    
  • 取得認證以存取 Fleet Manager 中樞叢集 Kubernetes API:

    az fleet get-credentials \
        --resource-group ${GROUP} \
        --name ${FLEET}
    

設定 Fleet Manager 許可權

在預覽期間,您必須執行額外的步驟,讓 Fleet Manager 建立和管理 Azure 流量管理員資源,並取得成員叢集上公開服務的公用 IP 位址。

若要完成此步驟,您必須建立已啟用受控識別的 Fleet Manager。 您的用戶必須具有 Azure RBAC 角色指派許可權。

  • 取得 Fleet Manager 資源中的身分識別資訊。

    az fleet show \ 
        --resource-group ${GROUP} \
        --name ${FLEET} \
        --query identity
    

    您的輸出看起來應該類似範例輸出:

    {
      "principalId": "<FLEET-PRINCIPAL-ID>",
      "tenantId": "<ENTRA-ID-TENANT>",
      "type": "SystemAssigned",
      "userAssignedIdentities": null
    }
    
  • Azure Kubernetes Fleet Manager Hub Agent 角色指派給 Fleet Manager 中樞叢集身分識別,將範圍限製為建立流量管理員資源的現有資源群組。

    az role assignment create \
        --assignee "<FLEET-PRINCIPAL-ID>" \
        --role "de2b316d-7a2c-4143-b4cd-c148f6a355a1" \
        --scope ${TRAFFIC_MANAGER_RG_ID}
    
  • 機群管理員中樞叢集身分識別也需要在包含要公開的服務的資源群組上的 Azure Kubernetes Fleet Manager Hub Agent 角色,因為當其透過 TrafficMangerBackend 新增至 ServiceExport 時,機群管理員需要讀取這些公用 IP 位址。

    az role assignment create \
        --assignee "<FLEET-PRINCIPAL-ID>" \
        --role "de2b316d-7a2c-4143-b4cd-c148f6a355a1" \
        --scope "/subscriptions/mySubscriptions/resourceGroups/MyPIPResourceGroup"
    

跨機群資源的成員叢集部署工作負載

備註

  • 本操作指南中的步驟參考範例應用程式,僅供示範用。 您可以將此工作負載取代為任何現有的 Deployment 和 Service 物件。

  • 這些步驟會使用 Fleet Manager 的叢集資源放置 (CRP) 將範例工作負載從 Fleet Manager 中樞叢集部署到成員叢集。 或者,您可以選擇一次一個,個別將這些 Kubernetes 組態部署至每個成員叢集。

  1. 在 Fleet Manager 中樞叢集上建立命名空間。

    kubectl create namespace kuard-demo
    

    輸出看起來類似:

    namespace/kuard-demo created
    
  2. 將部署、服務及 ServiceExport 物件暫存至 Fleet Manager 中樞叢集,並將下列內容儲存到名為 kuard-export-service.yaml 的檔案:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kuard
      namespace: kuard-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: kuard
      template:
        metadata:
          labels:
            app: kuard
        spec:
          containers:
            - name: kuard
              image: gcr.io/kuar-demo/kuard-amd64:blue
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: kuard-svc
      namespace: kuard-demo
      labels:
        app: kuard
    spec:
      selector:
        app: kuard
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
    ---
    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: ServiceExport
    metadata:
      name: kuard-export
      namespace: kuard-demo
      annotations:
        networking.fleet.azure.com/weight: "50"
    

    在 Fleet Manager 中樞叢集上配置物件:

    kubectl apply -f kuard-export-service.yaml
    

    ServiceExport範例中的規格可讓您將服務從成員叢集匯出至 Fleet Manager 中樞叢集。 我們想要將兩個叢集之間的流量平均分割,因此我們將權數批注設定 ServiceExport 為 50。 成功匯出之後,服務及其所有端點都會同步至 Fleet Manager 中樞叢集,然後可用來設定這些端點的 DNS 負載平衡。 輸出的結果看起來會像以下範例:

    deployment.apps/kuard created
    service/kuard-svc created
    serviceexport.networking.fleet.azure.com/kuard-export created
    
  3. 每個服務都需要唯一的 DNS 標籤,才能透過 Azure 流量管理員公開。 使用 Fleet Manager 叢集資源放置 ResourceOverride 來修改每個成員叢集的服務定義,以根據 Azure 區域和叢集名稱建立唯一的名稱。 您需要為每個叢集選取器 (在我們的範例中,每個 Azure 區域) 建立一個覆寫。

    apiVersion: placement.kubernetes-fleet.io/v1alpha1
    kind: ResourceOverride
    metadata:
     name: ro-kuard-demo-eastus
     namespace: kuard-demo
    spec:
     placement:
       name: crp-kuard-demo
     resourceSelectors:
       -  group: ""
          kind: Service
          version: v1
          name: kuard-svc
     policy:
       overrideRules:
         - clusterSelector:
             clusterSelectorTerms:
               - labelSelector:
                   matchLabels:
                     fleet.azure.com/location: eastus
           jsonPatchOverrides:
             - op: add
               path: /metadata/annotations
               value:
                 {"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}
    

    備註

    “${MEMBER-CLUSTER-NAME}” 是資源佈置覆寫 保留變數,在執行時會被替換成成員叢集的名稱。

    kubectl apply -f ro-kuard-demo-eastus.yaml
    
  4. 在名為 的檔案中建立以下機群管理員crp-dns-demo.yaml (CRP)。 請注意,我們在 eastus 區域中選取最多兩個叢集:

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: crp-dns-demo
    spec:
      resourceSelectors:
        - group: ""
          version: v1
          kind: Namespace
          name: kuard-demo
      policy:
        placementType: PickN
        numberOfClusters: 2
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      fleet.azure.com/location: eastus
    

    套用 CRP:

    kubectl apply -f crp-dns-demo.yaml
    

    如果成功,輸出看起來會類似:

    clusterresourceplacement.placement.kubernetes-fleet.io/crp-dns-demo created
    

使用 Azure 流量管理員設定 DNS 負載平衡

  1. TrafficManagerProfile定義 以定義流量管理員要使用的參數,並將它儲存至 檔案kuard-atm-demo.yaml

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerProfile
    metadata:
      name: kuard-atm-demo
      namespace: kuard-demo
    spec:
      resourceGroup: "rg-flt-tm-demo"
      monitorConfig:
        port: 80
    

    套用設定:

    kubectl apply -f kuard-atm-demo.yaml
    
  2. 定義一個對應的 TrafficManagerBackend,用於將從成員叢集中匯出的 Service 項目分組在一起。

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerBackend
    metadata:
      name: kuard-atm-demo-backend
      namespace: kuard-demo
    spec:
      profile:
        name: "kuard-atm-demo"
      backend:
        name: "kuard-svc"
      weight: 100
    

    套用設定:

    kubectl apply -f kuard-atm-demo-backend.yaml
    
  3. 執行下列命令,確認服務可透過 Azure 流量管理員取得:

    nslookup kuard-atm-demo.trafficmanager.net
    

    輸出應看起來應類似下列範例:

    Server:         10.X.X.254
    Address:        10.X.X.254#53
    
    Non-authoritative answer:
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 123.X.X.16
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 74.X.X.78
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 173.X.X.164
    
  4. 使用網頁瀏覽器瀏覽 URL,並查看 Kuard 的回應方式。 請嘗試排清 DNS,然後重試以查看要求是否由另一個叢集的另一個服務實例提供服務。

網頁的螢幕快照,其中顯示 Kuard 示範應用程式的詳細數據。