你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
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 CLI 创建 Azure Kubernetes Fleet Manager 并加入成员群集。
两个成员群集
aks-member-1
和aks-member-2
,你可以使用舰队管理器的群集资源放置 (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 地址。
要完成此步骤,你必须创建启用了托管标识的车队管理器。 用户必须具有 Azure RBAC 角色分配权限。
获取舰队管理器资源的标识信息。
az fleet show \ --resource-group ${GROUP} \ --name ${FLEET} \ --query identity
输出应类似于示例输出:
{ "principalId": "<FLEET-PRINCIPAL-ID>", "tenantId": "<ENTRA-ID-TENANT>", "type": "SystemAssigned", "userAssignedIdentities": null }
将
Traffic Manager Contributor
角色分配给舰队管理器中心群集标识,将范围限制为创建流量管理器资源的现有资源组。az role assignment create \ --assignee "<FLEET-PRINCIPAL-ID>" \ --role "Traffic Manager Contributor" \ --scope ${TRAFFIC_MANAGER_RG_ID}
舰队管理器中心群集标识还需要任何成员群集的 Azure
Reader
角色,这样舰队管理器就可以在通过TrafficMangerBackend
将成员群集添加到ServiceExport
时读取成员群集的公共 IP 地址。az role assignment create \ --assignee "<FLEET-PRINCIPAL-ID>" \ --role "Reader" \ --scope /full/path/to/member-cluster
跨舰队资源的成员群集部署工作负载
注释
本操作指南中的步骤适用于仅供演示的示例应用程序。 可以将此工作负载替换为自己现有的任何部署对象和服务对象。
这些步骤使用 Fleet Manager 的群集资源放置(CRP)将示例工作负荷从 Fleet Manager 中心群集部署到成员群集。 另外,可以选择将这些 Kubernetes 配置分别部署到每个成员群集(一次部署到一个群集)。
在 Fleet Manager 中心群集上创建命名空间。
kubectl create namespace kuard-demo
输出类似于:
namespace/kuard-demo created
通过将以下内容保存到名为
kuard-export-service.yaml
的文件,将部署、服务、ServiceExport 对象暂存到 Fleet Manager 中心群集: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
每个服务都需要一个唯一的 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
在名为 的文件中创建以下 Fleet Manager
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
使用 Web 浏览器访问 URL 并查看 Kuard 如何响应。 尝试刷新 DNS 并重试,以查看是否从另一个群集为另一个服务实例提供服务。