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 帳戶,請在開始之前建立 免費帳戶 。
請閱讀這項功能的概念性概觀,其中提供本文件所參考之
TrafficManagerProfile和TrafficManagerBackend物件的說明。具有中樞叢集和受控識別的 Kubernetes 機群管理員。 如果您沒有 Azure Kubernetes Fleet Manager,請參閱使用 Azure CLI 建立 Azure Kubernetes Fleet Manager 並加入成員叢集。
兩個成員叢集
aks-member-1和aks-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 組態部署至每個成員叢集。
在 Fleet Manager 中樞叢集上建立命名空間。
kubectl create namespace kuard-demo輸出看起來類似:
namespace/kuard-demo created將部署、服務及 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.yamlServiceExport範例中的規格可讓您將服務從成員叢集匯出至 Fleet Manager 中樞叢集。 我們想要將兩個叢集之間的流量平均分割,因此我們將權數批注設定ServiceExport為 50。 成功匯出之後,服務及其所有端點都會同步至 Fleet Manager 中樞叢集,然後可用來設定這些端點的 DNS 負載平衡。 輸出的結果看起來會像以下範例:deployment.apps/kuard created service/kuard-svc created serviceexport.networking.fleet.azure.com/kuard-export created每個服務都需要唯一的 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在名為 的檔案中建立以下機群管理員
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 負載平衡
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定義一個對應的
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執行下列命令,確認服務可透過 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使用網頁瀏覽器瀏覽 URL,並查看 Kuard 的回應方式。 請嘗試排清 DNS,然後重試以查看要求是否由另一個叢集的另一個服務實例提供服務。