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

    Обзор

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

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

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

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

    Предварительные требования

    • Права на редактирование deployment 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.

    • Для узлов control plane (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: {}

    Проверка

    # Check Machine has labels
    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}'
    
    # Check Node has labels
    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.

    • Для узлов control plane (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: {}

    Проверка

    # Check Machine has annotations
    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}'
    
    # Check Node has annotations
    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.

    • Для узлов control plane (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: {}

    Проверка

    # Check Machine has 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}'
    
    # Check Node has taints
    kubectl get node -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints}{"\n"}{end}'

    Примечания

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