你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
对于跨多个群集部署的应用程序,管理员通常希望跨群集将传入流量路由到它们。
可以按照本文档操作,为此类多群集应用程序设置第 4 层负载均衡。
重要
Azure Kubernetes 舰队管理器预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。
先决条件
如果没有 Azure 帐户,请在开始前创建一个免费帐户。
阅读此功能的概念概述,其中对本文档中引用的
ServiceExport
和MultiClusterService
对象进行了说明。必须具有包含一个中心群集和多个成员群集的舰队资源。 如果没有此资源,请按照快速入门:创建舰队资源并加入成员群集进行操作。
部署了工作负载的目标 Azure Kubernetes 服务 (AKS) 群集需位于同一虚拟网络或对等虚拟网络。
- 这些目标群集必须作为成员群集添加到舰队资源。
- 这些目标群集应正在使用Azure CNI(容器网络接口)网络。
必须按照访问舰队中心群集 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 入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用和管理 Azure CLI 中的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
跨舰队资源的成员群集部署工作负载
注意
本操作指南中的步骤适用于仅供演示的示例应用程序。 可以将此工作负载替换为自己现有的任何部署对象和服务对象。
这些步骤使用 Kubernetes 配置传播将示例工作负载从舰队群集部署到成员群集。 另外,可以选择将这些 Kubernetes 配置分别部署到每个成员群集(一次部署到一个群集)。
在舰队群集上创建命名空间:
KUBECONFIG=fleet kubectl create namespace kuard-demo
输出与以下示例类似:
namespace/kuard-demo created
应用部署对象、服务对象、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
在名为
ClusterResourcePlacement
的文件中创建以下crp-2.yaml
。 请注意,我们要选择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
区域的成员群集aks-member-2
和eastus
。 可以通过在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