你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure Kubernetes 舰队管理器的智能跨群集 Kubernetes 资源放置

应用程序开发人员通常需要将 Kubernetes 资源部署到多个群集中。 舰队操作员通常需要根据启发法(如计算成本)或可用资源(例如内存和 CPU)为工作负载选择最佳集群。 跨多个群集手动创建、更新和跟踪这些 Kubernetes 资源非常繁琐。 本文介绍如何使用 Azure Kubernetes 舰队管理器(Kubernetes 舰队)中的智能 Kubernetes 资源放置功能应对这些场景。

Kubernetes 舰队提供的资源放置功能可以根据以下群集属性做出计划决策:

  • 节点计数
  • 目标成员群集中的计算/内存成本
  • 目标成员群集中的资源(CPU/内存)可用性

有关本文中的概念的详细信息,请参阅将 Kubernetes 资源从中心群集放置到成员群集

先决条件

  • 需要一个具有活动订阅的 Azure 帐户。 免费创建帐户

  • 必须具有包含一个或多个成员群集的 Kubernetes 舰队资源。 如果没有,请按照快速入门创建包含中心群集的 Kubernetes 舰队资源。 然后,将 Azure Kubernetes 服务 (AKS) 群集加入为成员。

    提示

    确保已配置 AKS 成员群集,以便使用感兴趣的群集属性(位置、节点计数、资源或成本)测试放置。

  • 设置以下环境变量:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • 需要安装 Azure CLI 版本 2.58.0 或更高版本才能完成本文的操作。 若要安装或升级,请参阅安装 Azure CLI

  • 如果尚未安装,可以使用以下命令安装 Kubernetes CLI (kubectl):

    az aks install-cli
    
  • 你需要 fleet Azure CLI 扩展。 通过运行以下命令来安装它:

    az extension add --name fleet
    

    运行 az extension update 命令,更新到扩展的最新版本:

    az extension update --name fleet
    
  • 授权 kubectl 连接到 Kubernetes 舰队中心群集:

    az fleet get-credentials --resource-group $GROUP --name $FLEET
    

检查成员群集属性

通过查询中心群集来检索成员群集的标签、属性和资源。 输出为 YAML,以便可以读取结果。

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

生成的 YAML 文件包含可用于生成放置策略的详细信息(标签和属性)。 下面是一个示例:

apiVersion: cluster.kubernetes-fleet.io/v1
kind: MemberCluster
metadata:
  annotations:
    ...
  labels:
    fleet.azure.com/location: eastus2
    fleet.azure.com/resource-group: resource-group
    fleet.azure.com/subscription-id: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8
  name: cluster01
  resourceVersion: "123456"
  uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4
spec:
  ...
status:
  ...
  properties:
    kubernetes-fleet.io/node-count:
      observationTime: "2024-09-19T01:33:54Z"
      value: "2"
    kubernetes.azure.com/per-cpu-core-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.073"
    kubernetes.azure.com/per-gb-memory-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.022"
  resourceUsage:
    allocatable:
      cpu: 3800m
      memory: 10320392Ki
    available:
      cpu: 2740m
      memory: 8821256Ki
    capacity:
      cpu: "4"
      memory: 14195208Ki

对添加的每个成员群集重复此步骤,以便识别可在策略中使用的标签和属性。

准备要放置的工作负载

接下来,将工作负载发布到中心群集,以便将其放置在成员群集上:

  1. 为中心群集上的工作负载创建命名空间:

    kubectl create namespace test-app 
    
  2. 可以将示例工作负载部署到中心群集上的新命名空间。 由于这些 Kubernetes 资源类型不需要封装,因此无需更改即可部署它们。

    1. 将以下 YAML 保存到名为 sample-workload.yaml 的文件:

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-service
        namespace: test-app
      spec:
        selector:
          app: nginx
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
        type: LoadBalancer
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        namespace: test-app
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 2
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.16.1 
              ports:
              - containerPort: 80
      
    2. 将工作负载定义部署到中心群集:

      kubectl apply -f sample-workload.yaml
      

部署工作负载定义后,现在可以测试 Kubernetes 舰队的智能放置功能。

测试工作负载放置策略

可以使用以下示例以及概念文档作为指南,编写自己的 ClusterResourcePlacement 对象。

注意

如果要试用每个示例策略,请务必删除先前的 ClusterResourcePlacement 对象。

基于群集节点计数的放置

此示例显示使用 Descending 顺序的属性排序器。 此顺序意味着 Kubernetes 舰队喜欢节点计数更高的群集。

节点计数最高的群集获得权重 20,节点计数最低的群集获得权重 0。 其他群集获得通过权重计算公式计算的成比例权重。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

使用标签选择器和属性排序程序进行放置

在此示例中,仅当群集具有标签 env=prod 时,才会获得权重。 如果该集群满足该标签约束,则会根据该成员集群中的 CPU 总量获得成比例权重。

此示例演示如何同时将标签选择器和属性排序程序用于 preferredDuringSchedulingIgnoredDuringExecution 相关性。 不满足标签选择器的成员群集不会获得任何权重。 满足标签选择器的成员群集将得到在属性排序器下指定的成比例权重。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                labelSelector:
                  matchLabels:
                    env: prod
                metricSorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

基于内存和 CPU 核心成本的放置

由于本示例中的排序程序有一个 Ascending 顺序,因此 Kubernetes 舰队更喜欢内存和 CPU 核心成本较低的群集。 内存和 CPU 核心成本最低的群集将获得 20 的权重,最高的群集将获得 0 的权重。 其他群集获得通过权重计算公式计算的成比例权重。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 2
    affinity:
      clusterAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-gb-memory-core-cost
                sortOrder: Ascending
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-cpu-core-cost
                sortOrder: Ascending

查看放置的状态

如果要查看放置的状态,可以使用 Azure 门户或 kubectl 命令。

若要详细了解如何查看放置进度,可参阅使用 ClusterResourcePlacement API 将资源传播到成员群集

清理资源

有关如何通过 Azure 门户或 kubectl 命令删除群集资源放置的详细信息,请参阅传播资源相关文章中的“清理资源”。