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

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

概述

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

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

阅读资源传播概念概述,了解本操作说明中使用的概念。

先决条件

  • 具有活动订阅的 Azure 帐户。 创建帐户

  • 必须具有包含一个或多个成员群集的舰队资源。 否则,请按照快速入门创建具有中心群集的舰队资源,然后将 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
    
  • 你还需要 Azure CLI 扩展 fleet,可以通过运行以下命令来安装该扩展:

    az extension add --name fleet
    

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

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

    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: chinanorth3
        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
    

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

准备要放置的工作负载

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

  • 为中心群集上的工作负载创建命名空间。

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

    将以下 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
    

    使用命令将工作负载定义部署到中心群集。

    kubectl apply -f sample-workload.yaml 
    

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

测试工作负载放置策略

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

注意

如果想要试用每个示例策略,请确保删除以前的 ClusterResourcePlacement。

基于群集节点计数的放置

此示例使用 Descending 顺序显示属性排序程序,这意味着舰队更喜欢具有较高节点计数的群集。

节点计数最高的群集将获得权重 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 顺序,因此舰队更喜欢内存和 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 命令。

有关如何查看放置进度的详细信息,请参阅传播资源快速入门

清理资源

有关如何通过 Azure 门户或 kubectl 命令删除群集资源放置的详细信息,请参阅传播资源快速入门的清理资源部分。

后续步骤

若要了解有关资源传播的详细信息,请参阅以下资源: