• Русский
  • Создание кластеров

    В этом документе приведены подробные инструкции по созданию Kubernetes кластеров на платформе DCS с использованием Cluster API. Процесс включает развертывание и настройку множества Kubernetes ресурсов, которые совместно обеспечивают создание и управление инфраструктурой кластера.

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

    Перед созданием кластеров убедитесь, что выполнены все следующие условия:

    1. Установка необходимых плагинов

    Установите следующие плагины в global кластере :

    • Cluster API Provider Kubeadm — обеспечивает возможности начальной загрузки Kubernetes кластера
    • Cluster API Provider DCS — обеспечивает интеграцию и управление инфраструктурой DCS

    Подробные инструкции по установке см. в Installation Guide.

    2. Подготовка шаблона виртуальной машины

    Для установки Kubernetes необходимо:

    • Загрузить образ MicroOS, предоставленный , на платформу DCS
    • Создать шаблон виртуальной машины на основе этого образа
    • Убедиться, что шаблон содержит все необходимые компоненты Kubernetes

    Подробности о компонентах Kubernetes, включённых в каждый образ ВМ, см. в OS Support Matrix.

    3. Сетевое подключение

    Убедитесь, что все узлы в global кластере имеют доступ к платформе DCS по следующим портам:

    • Порт 7443 (DCS API)
    • Порт 8443 (DCS Web Console)

    Требование: Подключение к обоим портам обязательно для создания и управления кластером.

    4. Учетные данные платформы DCS

    Учетные данные платформы DCS, используемые для создания кластера, должны соответствовать определённым требованиям.

    Требуемая конфигурация пользователя

    • Тип пользователя: должен быть Interface interconnection user (接口互联用户)
    • Роль: должен быть administrator

    Требуемая политика паролей
    Проверьте следующую настройку в System ManagementRights ManagementRights Management Policy:

    • Политика: Whether to modify the password of an interface interconnection user upon password resetting and first login
    • Значение: должно быть установлено в No

    Влияние: Если установлено значение Yes, пароль пользователя будет принудительно изменён при первом входе, что нарушит аутентификацию и приведёт к сбоям при создании кластера.

    5. Конфигурация публичного реестра

    Настройте учетные данные публичного реестра на . Это включает:

    • Конфигурацию адреса репозитория реестра
    • Правильную настройку аутентификационных данных

    Подробные шаги настройки см. в документации Alauda Container Platform: Configure → Clusters → How to → Updating Public Registry Credentials.

    Обзор создания кластера

    В общих чертах, вы создадите следующие ресурсы Cluster API в global кластере , чтобы обеспечить инфраструктуру и запустить рабочий Kubernetes кластер.

    WARNING

    Важное требование к namespace

    Для корректной интеграции с в качестве бизнес-кластеров все ресурсы должны быть развернуты в namespace cpaas-system. Размещение ресурсов в других namespace может привести к проблемам интеграции.

    Конфигурация Control Plane

    Control plane управляет состоянием кластера, планированием и Kubernetes API. В этом разделе показано, как настроить высокодоступный control plane.

    WARNING

    Рекомендации по параметрам конфигурации

    При настройке ресурсов будьте осторожны с изменениями параметров:

    • Заменяйте только значения, заключённые в <>, на значения, специфичные для вашей среды
    • Сохраняйте все остальные параметры без изменений, так как они представляют оптимизированные или обязательные настройки
    • Изменение параметров, не являющихся заполнителями, может привести к нестабильности кластера или проблемам интеграции

    Порядок настройки

    Выполните следующие шаги по порядку:

    1. Спланируйте сеть и разверните балансировщик нагрузки API
    2. Настройте учетные данные DCS (Secret)
    3. Создайте пул IP и имён хостов
    4. Создайте DCSMachineTemplate для control plane
    5. Настройте KubeadmControlPlane
    6. Настройте DCSCluster
    7. Создайте ресурс Cluster

    После применения манифестов будет создан DCS Kubernetes control plane с помощью .

    Планирование сети и балансировщик нагрузки

    Перед созданием ресурсов control plane спланируйте сетевую архитектуру и разверните балансировщик нагрузки для обеспечения высокой доступности.

    Требования

    • Сегментация сети: спланируйте диапазоны IP-адресов для узлов control plane
    • Балансировщик нагрузки: разверните и настройте доступ к API серверу
    • Привязка IP: свяжите балансировщик нагрузки с IP из пула IP control plane
    • Подключение: обеспечьте сетевое соединение между всеми компонентами

    Балансировщик нагрузки распределяет трафик API сервера между узлами control plane для обеспечения доступности и отказоустойчивости.

    Настройка аутентификации DCS

    Информация для аутентификации DCS хранится в ресурсе Secret.

    В следующем примере <auth-secret-name> — имя сохранённого Secret:

    apiVersion: v1
    data:
      authUser: <base64-encoded-auth-user>
      authKey: <base64-encoded-auth-key>
      endpoint: <base64-encoded-endpoint>
    kind: Secret
    metadata:
      name: <auth-secret-name>
      namespace: cpaas-system
    type: Opaque
    ПараметрОписание
    .data.authUserИмя пользователя API платформы DCS (кодировано в base64)
    .data.authKeyПароль пользователя API платформы DCS (кодировано в base64)
    .data.endpointАдрес API платформы DCS с протоколом http или https (кодировано в base64). Примечание: стандартный порт API платформы DCS — 7443 (не 8443). Если в вашей среде используется нестандартный порт, уточните у администратора.
    INFO

    Перед настройкой этого Secret убедитесь, что ваши учетные данные платформы DCS соответствуют требованиям, указанным в разделе Prerequisites → DCS Platform Credential Requirements.

    Настройка пула IP и имён хостов

    Необходимо заранее спланировать IP-адреса виртуальных машин control plane, имена хостов, DNS-серверы и другую сетевую информацию.

    WARNING

    Вы должны настроить информацию о машинах для количества машин, равного или превышающего количество узлов control plane.

    В следующем примере <control-plane-iphostname-pool-name> — имя ресурса:

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: DCSIpHostnamePool
    metadata:
      name: <control-plane-iphostname-pool-name>
      namespace: cpaas-system
    spec:
      pool:
      - ip: "<control-plane-ip-1>"
        mask: "<control-plane-mask>"
        gateway: "<control-plane-gateway>"
        dns: "<control-plane-dns>"
        hostname: "<control-plane-hostname-1>"
        machineName: "<control-plane-machine-name-1>"
    ПараметрОписаниеОбязательный
    .spec.pool[].ipIP-адрес виртуальной машины для созданияДа
    .spec.pool[].maskМаска подсетиДа
    .spec.pool[].gatewayIP-адрес шлюзаДа
    .spec.pool[].dnsIP DNS-сервера (для нескольких серверов используйте ',')Нет
    .spec.pool[].machineNameИмя виртуальной машины на платформе DCSНет
    .spec.pool[].hostnameИмя хоста виртуальной машиныНет

    Настройка шаблона машины (Control Plane)

    Шаблон машины DCS объявляет конфигурацию для машин DCS, создаваемых последующими компонентами Cluster API. Шаблон машины указывает шаблон виртуальной машины, подключённые диски, CPU, память и другую информацию о конфигурации.

    WARNING

    Требования к хранилищу

    Доступ к datastore между хостами
    Кластеры datastore (datastoreClusterName) должны поддерживать доступ между всеми физическими машинами платформы DCS.

    • Причина: если datastore доступен только на определённых хостах, создание ВМ завершится неудачей, если платформа DCS попытается запланировать ВМ на другом хосте.

    Общее хранилище для Ignition
    Если ваш datastore не поддерживает прямую загрузку файлов (необходимую для конфигураций Ignition), вы должны предоставить решение общего хранилища (например, NFS), поддерживающее монтирование с нескольких хостов.

    Правила конфигурации дисков
    Вы можете добавить пользовательские диски, но обязательно сохраняйте обязательные системные и данные диски, показанные в примере ниже (systemVolume, /var/lib/kubelet, /var/lib/containerd, /var/cpaas).

    В следующем примере <cp-dcs-machine-template-name> — имя шаблона машины control plane:

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: DCSMachineTemplate
    metadata:
      name: <cp-dcs-machine-template-name>
      namespace: cpaas-system
    spec:
      template:
        spec:
          vmTemplateName: <vm-template-name>
          location:
            type: folder
            name: <folder-name>
          resource: # Необязательно, если не указано, используются значения по умолчанию шаблона
            type: cluster # cluster | host. Необязательно
            name: <cluster-name> # Необязательно
          vmConfig:
            dvSwitchName: <dv-switch-name> # Необязательно
            portGroupName: <port-group-name> # Необязательно
            dcsMachineCpuSpec:
              quantity: <control-plane-cpu>
            dcsMachineMemorySpec: # МБ
              quantity: <control-plane-memory>
            dcsMachineDiskSpec: # ГБ
            - quantity: 0
              datastoreClusterName: <datastore-cluster-name>
              systemVolume: true
            - quantity: 10
              datastoreClusterName: <datastore-cluster-name>
              path: /var/lib/etcd
              format: xfs
            - quantity: 100
              datastoreClusterName: <datastore-cluster-name>
              path: /var/lib/kubelet
              format: xfs
            - quantity: 100
              datastoreClusterName: <datastore-cluster-name>
              path: /var/lib/containerd
              format: xfs
            - quantity: 100
              datastoreClusterName: <datastore-cluster-name>
              path: /var/cpaas
              format: xfs
          ipHostPoolRef:
            name: <control-plane-iphostname-pool-name>

    Описание ключевых параметров

    ПараметрТипОписаниеОбязательный
    .spec.template.spec.vmTemplateNamestringИмя шаблона виртуальной машины DCSДа
    .spec.template.spec.locationobjectМесто создания ВМ (автоматически выбирается, если не указано)Нет
    .spec.template.spec.location.typestringТип места создания ВМ (в настоящее время поддерживается только "folder")Да
    .spec.template.spec.location.namestringИмя папки для создания ВМДа
    .spec.template.spec.resourceobjectВыбор вычислительного ресурса для создания ВМ (автоматически выбирается, если не указано)Нет
    .spec.template.spec.resource.typestringТип вычислительного ресурса: cluster или hostДа
    .spec.template.spec.resource.namestringИмя вычислительного ресурсаДа
    .spec.template.spec.vmConfigobjectКонфигурация виртуальной машиныДа
    .spec.template.spec.vmConfig.dvSwitchNamestringИмя коммутатора виртуальной машины (используется значение по умолчанию шаблона, если не указано)Нет
    .spec.template.spec.vmConfig.portGroupNamestringИмя группы портов (должна принадлежать вышеуказанному коммутатору, используется значение по умолчанию шаблона, если не указано)Нет
    .spec.template.spec.vmConfig.dcsMachineCpuSpec.quantityintСпецификация CPU ВМ (ядра)Да
    .spec.template.spec.vmConfig.dcsMachineMemorySpec.quantityintРазмер памяти ВМ (МБ)Да
    .spec.template.spec.vmConfig.dcsMachineDiskSpec[]objectКонфигурация дисков ВМДа
    .spec.template.spec.vmConfig.dcsMachineDiskSpec[].quantityintРазмер диска (ГБ). Для системного диска 0 автоматически устанавливается размер системного диска шаблонаДа
    .spec.template.spec.vmConfig.dcsMachineDiskSpec[].datastoreClusterNamestringИмя кластера datastore для дискаДа
    .spec.template.spec.vmConfig.dcsMachineDiskSpec[].systemVolumeboolЯвляется ли системным диском (только один диск может иметь значение true)Нет
    .spec.template.spec.vmConfig.dcsMachineDiskSpec[].pathstringКаталог монтирования диска (если не указан, диск не монтируется)Нет
    .spec.template.spec.vmConfig.dcsMachineDiskSpec[].formatstringФормат файловой системыНет
    .spec.template.spec.ipHostPoolRef.namestringИмя ссылающегося ресурса DCSIpHostnamePoolДа

    Настройка KubeadmControlPlane

    Текущая реализация control plane в DCS опирается на провайдер control plane kubeadm из Cluster API и требует настройки ресурса KubeadmControlPlane.

    Большинство параметров в примере уже оптимизированы или обязательны, но некоторые параметры могут потребовать настройки под вашу среду.

    TIP

    Полная справочная конфигурация
    Пример ниже сокращён для удобства чтения. Для полной конфигурации (включая политики аудита по умолчанию, admission контролы и содержимое файлов) см. раздел Complete KubeadmControlPlane Configuration в приложении.

    В следующем примере <cluster-name> — имя ресурса:

    Для версий компонентов (например, <dns-image-tag>, <etcd-image-tag>) см. OS Support Matrix.

    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    metadata:
      name: <cluster-name>
      namespace: cpaas-system
      annotations:
        controlplane.cluster.x-k8s.io/skip-kube-proxy: ""
    spec:
      rolloutStrategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 0
      kubeadmConfigSpec:
        users:
        - name: boot
          sshAuthorizedKeys:
          - "<ssh-authorized-keys>"
        format: ignition
        files:
        - path: /etc/kubernetes/admission/psa-config.yaml
          owner: "root:root"
          permissions: "0644"
          content: |
            # ... (Admission Configuration Content) ...
        - path: /etc/kubernetes/patches/kubeletconfiguration0+strategic.json
          owner: "root:root"
          permissions: "0644"
          content: |
            {
              "apiVersion": "kubelet.config.k8s.io/v1beta1",
              "kind": "KubeletConfiguration",
              "_comment": "... (Kubelet Configuration Content) ..."
            }
        - path: /etc/kubernetes/encryption-provider.conf
          owner: "root:root"
          append: false
          permissions: "0644"
          content: |
            apiVersion: apiserver.config.k8s.io/v1
            kind: EncryptionConfiguration
            resources:
            - resources:
              - secrets
              providers:
              - aescbc:
                  keys:
                  - name: key1
                    secret: <base64-encoded-secret>
        # ... (Other files including admission config, audit policy, kubelet config) ...
    
        # ... (preKubeadmCommands & postKubeadmCommands) ...
    
        clusterConfiguration:
          imageRepository: cloud.alauda.io/alauda
          dns:
            imageTag: <dns-image-tag>
          etcd:
            local:
              imageTag: <etcd-image-tag>
          # ... (apiServer, controllerManager, scheduler configurations) ...
    
        # ... (initConfiguration & joinConfiguration) ...
    
      machineTemplate:
        nodeDrainTimeout: 1m
        nodeDeletionTimeout: 5m
        infrastructureRef:
          apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
          kind: DCSMachineTemplate
          name: <cp-dcs-machine-template-name>
      replicas: 3
      version: <control-plane-kubernetes-version>

    Описание ключевых параметров

    ПараметрТипОписаниеОбязательный
    .spec.kubeadmConfigSpecobjectПараметры запуска провайдера bootstrap kubeadm для настройки запуска ВМ (пользователи, сеть, файлы и т.д.)Да
    .spec.kubeadmConfigSpec.users[]objectКонфигурация пользователейНет
    .spec.machineTemplate.infrastructureRefobjectИмя DCSMachineTemplate для создания ресурсов DCSMachineДа
    .spec.replicasintКоличество реплик ВМ control plane (не может превышать количество в соответствующем IpHostnamePool)Да
    .spec.versionstringВерсия Kubernetes control plane (должна совпадать с версией шаблона ВМ)Да

    Настройка DCSCluster

    DCSCluster — это декларация инфраструктурного кластера. Поскольку платформа DCS в настоящее время не предоставляет собственный load balancer, необходимо заранее вручную настроить балансировщик нагрузки и привязать его к IP-адресу из пула IP и имён хостов, настроенного в разделе «Настройка пула IP и имён виртуальных машин».

    В следующем примере <cluster-name> — имя ресурса:

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: DCSCluster
    metadata:
      name: "<cluster-name>"
      namespace: cpaas-system
    spec:
      controlPlaneLoadBalancer: # Настройка HA
        host: <load-balancer-ip-or-domain-name>
        port: 6443
        type: external 
      credentialSecretRef: # Ссылка на секрет аутентификации
        name: <auth-secret-name>
      controlPlaneEndpoint: # Спецификация Cluster API, должна совпадать с controlPlane
        host: <load-balancer-ip-or-domain-name>
        port: 6443
      networkType: kube-ovn 
      site: <site>  # Параметр платформы DCS, ID пула ресурсов

    Описание ключевых параметров

    ПараметрТипОписаниеОбязательный
    .spec.controlPlaneLoadBalancerobjectМетод экспонирования API сервера control planeДа
    .spec.controlPlaneLoadBalancer.typestringВ настоящее время поддерживается только значение "external"Да
    .spec.controlPlaneLoadBalancer.hoststringIP или доменное имя балансировщика нагрузкиДа
    .spec.controlPlaneLoadBalancer.portint64Номер портаДа
    .spec.credentialSecretRef.namestringИнформация аутентификации кластера DCS (см. раздел «Настройка аутентификации DCS»)Да
    .spec.controlPlaneEndpointobjectАдрес экспонирования API сервера (спецификация Cluster API)Нет
    .spec.networkTypestringВ настоящее время поддерживается только "kube-ovn"Да
    .spec.sitestringID площадки платформы DCSДа

    Настройка Cluster

    Ресурс Cluster в Cluster API используется для объявления кластера и должен ссылаться на соответствующий ресурс control plane и инфраструктурный ресурс кластера:

    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      annotations:
        capi.cpaas.io/resource-group-version: infrastructure.cluster.x-k8s.io/v1beta1
        capi.cpaas.io/resource-kind: DCSCluster
        cpaas.io/kube-ovn-version: <kube-ovn-version>
        cpaas.io/kube-ovn-join-cidr: <kube-ovn-join-cidr>
      labels:
        cluster-type: DCS
      name: <cluster-name>
      namespace: cpaas-system
    spec:
      clusterNetwork:
        pods:
          cidrBlocks:
          - <pods-cidr>
        services:
          cidrBlocks:
          - <services-cidr>
      controlPlaneRef:
        apiVersion: controlplane.cluster.x-k8s.io/v1beta1
        kind: KubeadmControlPlane
        name: <cluster-name>
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: DCSCluster
        name: <cluster-name>

    Описание ключевых параметров

    ПараметрТипОписаниеОбязательный
    .spec.clusterNetwork.pods.cidrBlocks[]stringCIDR для подовНет
    .spec.clusterNetwork.services.cidrBlocks[]stringCIDR для сервисной сетиНет
    .spec.controlPlaneRefobjectСсылка на control plane (см. раздел «Настройка ресурса KubeadmControlPlane»)Да
    .spec.infrastructureRefobjectСсылка на инфраструктурный кластер (см. раздел «Настройка ресурса DCSCluster»)Да

    Развёртывание узлов

    Инструкции см. на странице Deploy Nodes.

    Проверка кластера

    После развертывания всех ресурсов кластера проверьте, что кластер успешно создан и работает.

    Использование консоли

    1. Перейдите в представление Administrator в консоли
    2. Откройте ClustersClusters
    3. Найдите ваш недавно созданный кластер в списке
    4. Убедитесь, что статус кластера отображается как Running
    5. Проверьте, что все узлы control plane и worker имеют статус Ready

    Использование kubectl

    Альтернативно, вы можете проверить кластер с помощью команд kubectl:

    # Проверка статуса кластера
    kubectl get cluster -n cpaas-system <cluster-name>
    
    # Проверка узлов control plane
    kubectl get kubeadmcontrolplane -n cpaas-system <cluster-name>
    
    # Проверка статуса машин
    kubectl get machines -n cpaas-system
    
    # Проверка статуса развертывания кластера
    kubectl get clustermodule <cluster-name> -o jsonpath='{.status.base.deployStatus}'

    Ожидаемые результаты

    Успешно созданный кластер должен иметь:

    • Статус кластера: Running или Provisioned
    • Все машины control plane: Running
    • Все рабочие узлы (если развернуты): Running
    • Узлы Kubernetes: Ready
    • Статус Cluster Module: Completed

    Приложение

    Полная конфигурация KubeadmControlPlane

    Ниже приведена полная конфигурация KubeadmControlPlane, включая все политики аудита по умолчанию, admission контролы и содержимое файлов. Вы можете скопировать весь блок и изменить <placeholders> по необходимости.

    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    metadata:
      name: <cluster-name>
      namespace: cpaas-system
      annotations:
        controlplane.cluster.x-k8s.io/skip-kube-proxy: ""
    spec:
      rolloutStrategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 0
      kubeadmConfigSpec:
        users:
        - name: boot
          sshAuthorizedKeys:
          - "<ssh-authorized-keys>"
        format: ignition
        files:
        - path: /etc/kubernetes/admission/psa-config.yaml
          owner: "root:root"
          permissions: "0644"
          content: |
            apiVersion: apiserver.config.k8s.io/v1
            kind: AdmissionConfiguration
            plugins:
            - name: PodSecurity
              configuration:
                apiVersion: pod-security.admission.config.k8s.io/v1
                kind: PodSecurityConfiguration
                defaults:
                  enforce: "privileged"
                  enforce-version: "latest"
                  audit: "baseline"
                  audit-version: "latest"
                  warn: "baseline"
                  warn-version: "latest"
                exemptions:
                  usernames: []
                  runtimeClasses: []
                  namespaces:
                  - kube-system
                  - cpaas-system
        - path: /etc/kubernetes/patches/kubeletconfiguration0+strategic.json
          owner: "root:root"
          permissions: "0644"
          content: |
            {
              "apiVersion": "kubelet.config.k8s.io/v1beta1",
              "kind": "KubeletConfiguration",
              "protectKernelDefaults": true,
              "tlsCertFile": "/etc/kubernetes/pki/kubelet.crt",
              "tlsPrivateKeyFile": "/etc/kubernetes/pki/kubelet.key",
              "streamingConnectionIdleTimeout": "5m",
              "clientCAFile": "/etc/kubernetes/pki/ca.crt"
            }
        - path: /etc/kubernetes/encryption-provider.conf
          owner: "root:root"
          append: false
          permissions: "0644"
          content: |
            apiVersion: apiserver.config.k8s.io/v1
            kind: EncryptionConfiguration
            resources:
            - resources:
              - secrets
              providers:
              - aescbc:
                  keys:
                  - name: key1
                    secret: <base64-encoded-secret>
        - path: /etc/kubernetes/audit/policy.yaml
          owner: "root:root"
          append: false
          permissions: "0644"
          content: |
            apiVersion: audit.k8s.io/v1
            kind: Policy
            # Don't generate audit events for all requests in RequestReceived stage.
            omitStages:
            - "RequestReceived"
            rules:
            # The following requests were manually identified as high-volume and low-risk,
            # so drop them.
            - level: None
              users:
              - system:kube-controller-manager
              - system:kube-scheduler
              - system:serviceaccount:kube-system:endpoint-controller
              verbs: ["get", "update"]
              namespaces: ["kube-system"]
              resources:
              - group: "" # core
                resources: ["endpoints"]
            # Don't log these read-only URLs.
            - level: None
              nonResourceURLs:
              - /healthz*
              - /version
              - /swagger*
            # Don't log events requests.
            - level: None
              resources:
              - group: "" # core
                resources: ["events"]
            # Don't log devops requests.
            - level: None
              resources:
              - group: "devops.alauda.io"
            # Don't log get list watch requests.
            - level: None
              verbs: ["get", "list", "watch"]
            # Don't log lease operation
            - level: None
              resources:
              - group: "coordination.k8s.io"
                resources: ["leases"]
            # Don't log access review and token review requests.
            - level: None
              resources:
              - group: "authorization.k8s.io"
                resources: ["subjectaccessreviews", "selfsubjectaccessreviews"]
              - group: "authentication.k8s.io"
                resources: ["tokenreviews"]
            # Don't log imagewhitelists and namespaceoverviews operations
            - level: None
              resources:
              - group: "app.alauda.io"
                resources: ["imagewhitelists"]
              - group: "k8s.io"
                resources: ["namespaceoverviews"]
            # Secrets, ConfigMaps can contain sensitive & binary data,
            # so only log at the Metadata level.
            - level: Metadata
              resources:
              - group: "" # core
                resources: ["secrets", "configmaps"]
            # devops installmanifests and katanomis can contains huge data and sensitive data, only log at the Metadata level.
            - level: Metadata
              resources:
              - group: "operator.connectors.alauda.io"
                resources: ["installmanifests"]
              - group: "operators.katanomi.dev"
                resources: ["katanomis"]
            # Default level for known APIs
            - level: RequestResponse
              resources:
              - group: "" # core
              - group: "aiops.alauda.io"
              - group: "apps"
              - group: "app.k8s.io"
              - group: "authentication.istio.io"
              - group: "auth.alauda.io"
              - group: "autoscaling"
              - group: "asm.alauda.io"
              - group: "clusterregistry.k8s.io"
              - group: "crd.alauda.io"
              - group: "infrastructure.alauda.io"
              - group: "monitoring.coreos.com"
              - group: "operators.coreos.com"
              - group: "networking.istio.io"
              - group: "extensions.istio.io"
              - group: "install.istio.io"
              - group: "security.istio.io"
              - group: "telemetry.istio.io"
              - group: "opentelemetry.io"
              - group: "networking.k8s.io"
              - group: "portal.alauda.io"
              - group: "rbac.authorization.k8s.io"
              - group: "storage.k8s.io"
              - group: "tke.cloud.tencent.com"
              - group: "devopsx.alauda.io"
              - group: "core.katanomi.dev"
              - group: "deliveries.katanomi.dev"
              - group: "integrations.katanomi.dev"
              - group: "artifacts.katanomi.dev"
              - group: "builds.katanomi.dev"
              - group: "versioning.katanomi.dev"
              - group: "sources.katanomi.dev"
              - group: "tekton.dev"
              - group: "operator.tekton.dev"
              - group: "eventing.knative.dev"
              - group: "flows.knative.dev"
              - group: "messaging.knative.dev"
              - group: "operator.knative.dev"
              - group: "sources.knative.dev"
              - group: "operator.devops.alauda.io"
              - group: "flagger.app"
              - group: "jaegertracing.io"
              - group: "velero.io"
                resources: ["deletebackuprequests"]
              - group: "connectors.alauda.io"
              - group: "operator.connectors.alauda.io"
                resources: ["connectorscores", "connectorsgits", "connectorsocis"]
            # Default level for all other requests.
            - level: Metadata
        preKubeadmCommands:
        - while ! ip route | grep -q "default via"; do sleep 1; done; echo "NetworkManager started"
        - mkdir -p /run/cluster-api && restorecon -Rv /run/cluster-api
        - if [ -f /etc/disk-setup.sh ]; then bash /etc/disk-setup.sh; fi
        postKubeadmCommands:
        - chmod 600 /var/lib/kubelet/config.yaml
        clusterConfiguration:
          imageRepository: cloud.alauda.io/alauda
          dns:
            imageTag: <dns-image-tag>
          etcd:
            local:
              imageTag: <etcd-image-tag>
          apiServer:
            extraArgs:
              audit-log-format: json
              audit-log-maxage: "30"
              audit-log-maxbackup: "10"
              audit-log-maxsize: "200"
              profiling: "false"
              audit-log-mode: batch
              audit-log-path: /etc/kubernetes/audit/audit.log
              audit-policy-file: /etc/kubernetes/audit/policy.yaml
              tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
              encryption-provider-config: /etc/kubernetes/encryption-provider.conf
              admission-control-config-file: /etc/kubernetes/admission/psa-config.yaml
              tls-min-version: VersionTLS12
              kubelet-certificate-authority: /etc/kubernetes/pki/ca.crt
            extraVolumes:
            - name: vol-dir-0
              hostPath: /etc/kubernetes
              mountPath: /etc/kubernetes
              pathType: Directory
          controllerManager:
            extraArgs:
              bind-address: "::"
              profiling: "false"
              tls-min-version: VersionTLS12
              flex-volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
          scheduler:
            extraArgs:
              bind-address: "::"
              tls-min-version: VersionTLS12
              profiling: "false"
        initConfiguration:
          patches:
            directory: /etc/kubernetes/patches
          nodeRegistration:
            kubeletExtraArgs:
              node-labels: "kube-ovn/role=master"
              provider-id: PROVIDER_ID
              volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
              protect-kernel-defaults: "true"
        joinConfiguration:
          patches:
            directory: /etc/kubernetes/patches
          nodeRegistration:
            kubeletExtraArgs:
              node-labels: "kube-ovn/role=master"
              provider-id: PROVIDER_ID
              volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
              protect-kernel-defaults: "true"
      machineTemplate:
        nodeDrainTimeout: 1m
        nodeDeletionTimeout: 5m
        infrastructureRef:
          apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
          kind: DCSMachineTemplate
          name: <cp-dcs-machine-template-name>
      replicas: 3
      version: <control-plane-kubernetes-version>