• Русский
  • Настройка аннотаций, меток и taints на узлах

    Overview

    Cluster API (CAPI) может передавать выбранные метаданные Machine соответствующему Node:

    • Метки (Labels): через синхронизацию controller manager
    • Аннотации (Annotations): через синхронизацию controller manager
    • Taints: через шаблоны Machine (применяются во время регистрации узла)

    В этом руководстве показано, как настроить каждый из этих элементов и как проверить их применение как к ресурсам Machine, так и Node.

    Примечание: В примерах предполагается, что ваш controller manager Cluster API называется capi-controller-manager, и что вы управляете объектами MachineDeployment и KubeadmControlPlane для рабочих и управляющих узлов соответственно.

    Требования

    • Права на редактирование деплоймента capi-controller-manager и ресурсов Cluster API
    • версии 4.2.0 или новее

    1) Синхронизация меток с Machines на Nodes

    Шаг 1: Включите синхронизацию меток в controller manager

    Добавьте следующий аргумент в контейнер capi-controller-manager, чтобы указать, какие метки Machine синхронизировать с Nodes:

    spec:
      template:
        spec:
          containers:
          - name: manager
            args:
            - --additional-sync-machine-labels=env,role,topology.kubernetes.io/zone

    Замените список через запятую на метки, которые вы хотите синхронизировать.

    INFO

    additional-sync-machine-labels поддерживает регулярные выражения.

    Шаг 2: Добавьте метки в шаблоны Machine

    • Для рабочих узлов (MachineDeployment): задайте метки в .spec.template.metadata.labels.

    • Для управляющих узлов (KubeadmControlPlane): задайте метки в .spec.machineTemplate.metadata.labels.

      ---
      apiVersion: cluster.x-k8s.io/v1beta1
      kind: MachineDeployment
      metadata:
        name: <md-name>
        namespace: <namespace>
      spec:
        clusterName: <cluster-name>
        template:
          metadata:
            labels:
              env: prod
              role: app
              topology.kubernetes.io/zone: az1
          spec: {}
      ---
      apiVersion: controlplane.cluster.x-k8s.io/v1beta1
      kind: KubeadmControlPlane
      metadata:
        name: <kcp-name>
        namespace: <namespace>
      spec:
        version: <k8s-version>
        clusterName: <cluster-name>
        machineTemplate:
          metadata:
            labels:
              env: prod
              role: control-plane
              topology.kubernetes.io/zone: az1
          spec: {}
        kubeadmConfigSpec: {}

    Проверка

    # Проверить, что у Machine есть метки
    kubectl get machine -n <namespace> -l cluster.x-k8s.io/cluster-name=<cluster-name> \
      -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels}{"\n"}{end}'
    
    # Проверить, что у Node есть метки
    kubectl get node -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels}{"\n"}{end}'

    2) Синхронизация аннотаций с Machines на Nodes

    Шаг 1: Включите синхронизацию аннотаций в controller manager

    Добавьте следующий аргумент в контейнер capi-controller-manager, чтобы указать, какие аннотации Machine синхронизировать с Nodes:

    spec:
      template:
        spec:
          containers:
          - name: manager
            args:
            - --additional-sync-machine-annotations=example.com/owner,example.com/runtime
    INFO

    additional-sync-machine-annotations поддерживает регулярные выражения.

    Замените список через запятую на аннотации, которые вы хотите синхронизировать.

    Шаг 2: Добавьте аннотации в шаблоны Machine

    • Для рабочих узлов (MachineDeployment): задайте аннотации в .spec.template.metadata.annotations.

    • Для управляющих узлов (KubeadmControlPlane): задайте аннотации в .spec.machineTemplate.metadata.annotations.

      ---
      apiVersion: cluster.x-k8s.io/v1beta1
      kind: MachineDeployment
      metadata:
        name: <md-name>
        namespace: <namespace>
      spec:
        clusterName: <cluster-name>
        template:
          metadata:
            annotations:
              example.com/owner: team-a
              example.com/runtime: containerd
          spec: {}
      ---
      apiVersion: controlplane.cluster.x-k8s.io/v1beta1
      kind: KubeadmControlPlane
      metadata:
        name: <kcp-name>
        namespace: <namespace>
      spec:
        version: <k8s-version>
        clusterName: <cluster-name>
        machineTemplate:
          metadata:
            annotations:
              example.com/owner: platform
              example.com/runtime: containerd
          spec: {}
        kubeadmConfigSpec: {}

    Проверка

    # Проверить, что у Machine есть аннотации
    kubectl get machine -n <namespace> -l cluster.x-k8s.io/cluster-name=<cluster-name> \
      -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations}{"\n"}{end}'
    
    # Проверить, что у Node есть аннотации
    kubectl get node -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations}{"\n"}{end}'

    3) Применение taints с Machines на Nodes

    Taints настраиваются непосредственно в шаблонах Machine, чтобы применяться к Node во время регистрации.

    • Для рабочих узлов (MachineDeployment): задайте taints в .spec.template.spec.taints.

    • Для управляющих узлов (KubeadmControlPlane): задайте taints в .spec.machineTemplate.taints.

      ---
      apiVersion: cluster.x-k8s.io/v1beta1
      kind: MachineDeployment
      metadata:
        name: <md-name>
        namespace: <namespace>
      spec:
        clusterName: <cluster-name>
        template:
          metadata: {}
          spec:
            taints:
            - key: dedicated
              value: db
              effect: NoSchedule
      ---
      apiVersion: controlplane.cluster.x-k8s.io/v1beta1
      kind: KubeadmControlPlane
      metadata:
        name: <kcp-name>
        namespace: <namespace>
      spec:
        version: <k8s-version>
        clusterName: <cluster-name>
        machineTemplate:
          metadata: {}
          taints:
          - key: custom-taint-key
            effect: NoSchedule
          spec: {}
        kubeadmConfigSpec: {}

    Проверка

    # Проверить, что у Machine есть taints
    kubectl get machine -n <namespace> -l cluster.x-k8s.io/cluster-name=<cluster-name> \
      -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints}{"\n"}{end}'
    
    # Проверить, что у Node есть taints
    kubectl get node -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints}{"\n"}{end}'

    Примечания

    • Убедитесь, что имена полей написаны правильно: metadata.labels, metadata.annotations.
    • Обновляйте списки синхронизируемых меток и аннотаций в controller при добавлении новых ключей в Machines.
    • После внесения изменений дождитесь завершения процесса согласования; обновления Node могут появляться с небольшой задержкой.