跨 Azure Kubernetes 舰队管理器成员群集设置多群集第 4 层负载均衡(预览版)
对于跨多个群集部署的应用程序,管理员通常希望跨群集将传入流量路由到它们。
可以按照本文档操作,为此类多群集应用程序设置第 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 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
可以使用本地 Azure CLI。
如果需要,请安装 Azure CLI 来运行 CLI 参考命令。
本地 Azure 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。
跨舰队资源的成员群集部署工作负载
注意
本操作指南中的步骤适用于仅供演示的示例应用程序。 可以将此工作负载替换为自己现有的任何部署对象和服务对象。
这些步骤使用 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
在名为
crp-2.yaml
的文件中创建以下ClusterResourcePlacement
。 请注意,我们要选择chinanorth3
区域中的群集:apiVersion: placement.kubernetes-fleet.io/v1beta1 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.cn/location: chinanorth
应用
ClusterResourcePlacement
:KUBECONFIG=fleet kubectl apply -f crp-2.yaml
如果成功,会显示类似于以下示例的输出:
clusterresourceplacement.fleet.azure.com/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 来自
chinanorth3
区域的成员群集aks-member-1
和aks-member-2
。 可以通过在chinanorth
区域的群集上运行以下命令来验证 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