在 Azure Kubernetes 機群管理員成員叢集 (預覽版) 之間設定多叢集第 4 層負載平衡
針對跨多個叢集部署的應用程式,系統管理員通常需要跨叢集將連入流量路由傳送至這些應用程式。
您可以遵循本文件,為這類多叢集應用程式設定第 4 層負載平衡。
重要
Azure Kubernetes 機群管理員預覽功能由客戶自行決定取用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會竭盡全力支援一部分的 Azure Kubernetes 機群管理員預覽功能。 因此,這些功能不適合實際執行用途。
必要條件
如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶。
請閱讀這項功能的概念性概觀,其中提供本文件所參考之
ServiceExport
和MultiClusterService
物件的說明。您必須具有中樞叢集和成員叢集的機群資源。 如果您沒有此資源,請遵循快速入門:建立機群資源並加入成員叢集。
部署工作負載的目標 Azure Kubernetes Service (AKS) 叢集,必須存在於相同的虛擬網路或對等互連虛擬網路上。
- 這些目標叢集必須新增為機群資源的成員叢集。
- 這些目標叢集應使用 Azure CNI (容器網路介面) 網路。
您必須遵循 Access Fleet 中樞叢集 Kubernetes API 中的步驟 ,取得中樞叢集 Kubernetes API 的存取權。
設定下列環境變數,並取得機群和所有成員叢集的 kubeconfig:
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBER_CLUSTER_1=aks-member-1 export MEMBER_CLUSTER_2=aks-member-2 az fleet get-credentials --resource-group ${GROUP} --name ${FLEET} --file fleet az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_1} --file aks-member-1 az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_2} --file aks-member-2
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
跨機群資源的成員叢集部署工作負載
注意
本操作指南中的步驟參考範例應用程式,僅供示範用。 您可以將此工作負載取代為任何現有的 Deployment 和 Service 物件。
這些步驟會使用 Kubernetes 組態傳播,將來自機群叢集的樣本工作負載部署至成員叢集。 或者,您可以選擇一次一個,個別將這些 Kubernetes 組態部署至每個成員叢集。
在機群叢集上建立命名空間:
KUBECONFIG=fleet kubectl create namespace kuard-demo
輸出大致如下列範例所示:
namespace/kuard-demo created
套用 Deployment、Service、ServiceExport 物件:
KUBECONFIG=fleet kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-export-service.yaml
上述檔案中的
ServiceExport
規格,可讓您將服務從成員叢集匯出至機群資源。 成功匯出之後,服務及其所有端點都會同步處理到機群叢集,然後可用來設定這些端點之間的多叢集負載平衡。 輸出會看似像以下範例:deployment.apps/kuard created service/kuard created serviceexport.networking.fleet.azure.com/kuard created
在名為
crp-2.yaml
的檔案中建立下列ClusterResourcePlacement
。 請注意,我們正在選取eastus
區域中的叢集:apiVersion: placement.kubernetes-fleet.io/v1 kind: ClusterResourcePlacement metadata: name: kuard-demo spec: resourceSelectors: - group: "" version: v1 kind: Namespace name: kuard-demo policy: affinity: clusterAffinity: requiredDuringSchedulingIgnoredDuringExecution: clusterSelectorTerms: - labelSelector: matchLabels: fleet.azure.com/location: eastus
套用
ClusterResourcePlacement
:KUBECONFIG=fleet kubectl apply -f crp-2.yaml
如果成功,輸出會類似下列範例:
clusterresourceplacement.placement.kubernetes-fleet.io/kuard-demo created
檢查
ClusterResourcePlacement
的狀態:KUBECONFIG=fleet kubectl get clusterresourceplacements
如果成功,輸出會類似下列範例:
NAME GEN SCHEDULED SCHEDULEDGEN APPLIED APPLIEDGEN AGE kuard-demo 1 True 1 True 1 20s
建立 MultiClusterService 以在多個成員叢集中的服務端點之間進行負載平衡
檢查是否已針對
eastus
區域中的成員叢集成功匯出服務:KUBECONFIG=aks-member-1 kubectl get serviceexport kuard --namespace kuard-demo
輸出大致如下列範例所示:
NAME IS-VALID IS-CONFLICTED AGE kuard True False 25s
KUBECONFIG=aks-member-2 kubectl get serviceexport kuard --namespace kuard-demo
輸出大致如下列範例所示:
NAME IS-VALID IS-CONFLICTED AGE kuard True False 55s
您應該會看到服務對匯出有效 (
IS-VALID
欄位為true
),且不會與其他匯出衝突 (IS-CONFLICT
為false
)。注意
傳播 ServiceExport 可能需要一或兩分鐘。
在一個成員上建立
MultiClusterService
,以在這些叢集中的服務端點之間進行負載平衡:KUBECONFIG=aks-member-1 kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-mcs.yaml
注意
若要透過內部 IP 而非公用 IP 公開服務,請將註釋新增至 MultiClusterService:
apiVersion: networking.fleet.azure.com/v1alpha1 kind: MultiClusterService metadata: name: kuard namespace: kuard-demo annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true" ...
輸出大致如下列範例所示:
multiclusterservice.networking.fleet.azure.com/kuard created
執行下列命令,以確認 MultiClusterService 是否有效:
KUBECONFIG=aks-member-1 kubectl get multiclusterservice kuard --namespace kuard-demo
輸出應類似下列範例:
NAME SERVICE-IMPORT EXTERNAL-IP IS-VALID AGE kuard kuard <a.b.c.d> True 40s
輸出中,
IS-VALID
欄位應為true
。 查看輸出中的外部負載平衡器 IP 位址 (EXTERNAL-IP
)。 匯入完成處理且 IP 位址可用之前,可能需要一段時間。使用外部負載平衡器 IP 位址多次執行下列命令:
curl <a.b.c.d>:8080 | grep addrs
請注意,處理要求的 Pod IP 正在變更,且這些 Pod 來自成員叢集
aks-member-1
,以及eastus
區域的aks-member-2
。 您可以從區域eastus
,在叢集上執行下列命令來驗證 Pod IP:KUBECONFIG=aks-member-1 kubectl get pods -n kuard-demo -o wide
KUBECONFIG=aks-member-2 kubectl get pods -n kuard-demo -o wide