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

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

应用程序开发人员通常需要将 Kubernetes 资源部署到位于云和本地环境中的多个群集。 舰队操作员通常需要根据试探法(如计算成本)或可用资源(如内存和 CPU)为工作负荷选择最佳群集。 跨多个群集手动创建、更新和跟踪这些 Kubernetes 资源非常繁琐。 本文介绍如何在 Azure Kubernetes 机群管理器中使用智能 Kubernetes 资源放置功能来解决这些方案。

Fleet Manager 支持针对群集范围的 (ClusterResourcePlacement) 和命名空间范围的 (ResourcePlacement) 资源进行智能放置。 资源放置功能可以根据以下群集属性做出计划决策:

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

有关本文中的概念的详细信息,请参阅 群集范围的资源放置命名空间范围内的资源放置

Prerequisites

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

  • 必须具有具有中心群集和一个或多个成员群集的机群管理器。 如果没有,请按照 快速上手指南 创建包含枢纽集群的机群管理器。 然后,以成员身份加入 支持的 Kubernetes 群集

    提示

    请确保配置 Kubernetes 群集,以便通过您感兴趣的群集属性(如位置、节点数量、资源或成本)进行放置测试。

  • 设置以下环境变量:

    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 连接到 Fleet Manager 中心群集:

    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
      

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

测试工作负载放置策略

可以使用以下示例作为编写自己的资源放置对象的指南。 有关详细信息,请参阅 群集范围的资源放置文档命名空间范围内的资源放置文档

每个示例都展示了 ClusterResourcePlacement(适用于群集范围的资源和整个命名空间)和 ResourcePlacement(适用于特定命名空间范围的资源)的变体。

注意

若要试用每个示例策略,请在应用下一个策略之前删除之前的 ClusterResourcePlacementResourcePlacement

基于群集节点计数的放置

此示例显示了一个使用 Descending 顺序的属性排序器。 此顺序意味着 Fleet Manager 更喜欢具有更高节点计数的群集。

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

ClusterResourcePlacement 示例

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:
                propertySorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

ResourcePlacement 示例

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                propertySorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

带有标签选择器和属性排序程序的放置

在此示例中,一个群集只有在标签 env=prod 的情况下才会收到权重。 如果群集满足该标签约束,则 Fleet Manager 会根据该成员群集中 CPU 总量给出比例权重。

此示例介绍了如何使用标签选择器和属性排序器来实现 preferredDuringSchedulingIgnoredDuringExecution 相关性。 使标签选择器失败的成员群集不会获得任何权重。 满足标签选择器的成员群集将得到在属性排序器下指定的成比例权重。

ClusterResourcePlacement 示例

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
                propertySorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

ResourcePlacement 示例

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                labelSelector:
                  matchLabels:
                    env: prod
                propertySorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

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

由于本示例中的排序器有一个 Ascending 订单,因此 Fleet Manager 更喜欢内存和 CPU 核心成本较低的群集。 具有最低内存和 CPU 核心成本的群集的权重为 20,具有最高内存和 CPU 内核成本的群集权重为 0。 其他群集接收通过权重计算公式计算得出的比例权重。

ClusterResourcePlacement 示例

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

ResourcePlacement 示例

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      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 命令查看位置的状态。

有关如何查看放置进度的详细信息:

清理资源

若要删除资源放置,请执行以下操作:

后续步骤