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

    Этот документ содержит инструкции по созданию кластеров Kubernetes на платформе Huawei DCS. Создание кластеров на основе YAML доступно через manifests. Если установлен Fleet Essentials и версия Alauda Container Platform DCS Infrastructure Provider — 1.0.13 или более поздняя, кластеры также можно создавать через веб-интерфейс.

    INFO

    Веб-интерфейс предоставляет пошаговый сценарий с проверкой параметров, а YAML — больше гибкости для автоматизации.

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

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

    1. Ресурсы инфраструктуры

    Перед созданием кластера настройте следующие ресурсы инфраструктуры:

    • Cloud Credential - сведения о доступе к платформе DCS
    • IP Pool - конфигурация сети для узлов кластера
    • Machine Template - параметры VM для control plane и worker-узлов

    Подробные инструкции по настройке см. в разделе Ресурсы инфраструктуры для Huawei DCS.

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

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

    • Alauda Container Platform Kubeadm Provider
    • Alauda Container Platform DCS Infrastructure Provider

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

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

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

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

    Сведения о компонентах Kubernetes, включенных в каждый образ VM, см. в Матрице поддержки ОС.

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

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

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

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

    5. Настройка LoadBalancer

    Перед созданием кластера настройте LoadBalancer для Kubernetes API Server. LoadBalancer распределяет трафик API server между узлами control plane, обеспечивая высокую доступность.

    6. Настройка публичного registry

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

    • Настройку адреса репозитория registry
    • Корректную настройку учетных данных для аутентификации

    Использование веб-интерфейса

    Требование к версии: для этого сценария требуются Fleet Essentials и Alauda Container Platform DCS Infrastructure Provider версии 1.0.13 или более поздней. Если версия provider ниже 1.0.13, используйте YAML manifests.

    Сценарий создания

    Создание кластера выполняется через мастер из 5 шагов:

    Step 1: Basic Info
    
    Step 2: Control Plane Node Pool
    
    Step 3: Worker Node Pools
    
    Step 4: Networking
    
    Step 5: Review

    Навигация: Clusters → Clusters → Create Cluster → Select Huawei DCS

    Шаг 1: Основная информация

    ПолеТипОбязательноОписание
    Infrastructure Credentialвыпадающий списокДаВыберите существующий Cloud Credential
    NameтекстДаУникальный идентификатор кластера (строчные буквы, цифры, дефисы)
    Display NameтекстНетПроизвольное описание для удобства идентификации
    Distribution Versionтолько чтение-Версия ACP (совпадает с global cluster)
    Kubernetes Versionтолько чтение-Определяется Distribution Version
    Cluster API AddressтекстДаФормат: https://<load-balancer-address>:6443

    Проверка предварительных условий:

    Перед созданием кластера убедитесь, что:

    • В платформе DCS существуют шаблоны DCS VM Templates, а версия MicroOS соответствует версии Kubernetes
    • Для Kubernetes API Server настроен LoadBalancer

    Ограничение по версии: можно создать только последнюю версию Kubernetes, поддерживаемую платформой.

    Шаг 2: Пул узлов control plane

    Пул узлов control plane фиксирован на 3 реплики для обеспечения высокой доступности.

    ПолеТипОбязательноОписание
    Machine Templateвыпадающий списокДаФильтрация шаблонов по Type: Control Plane и совместимой версии Kubernetes
    Replicasтолько чтение-Фиксировано: 3
    SSH Authorized KeysтекстНетДобавьте несколько SSH public keys для доступа к узлам

    Проверка: связанный IP Pool должен иметь достаточное количество доступных IP-адресов (≥ 3).

    Шаг 3: Пулы worker-узлов

    Можно добавить несколько пулов worker-узлов. Каждый пул имеет следующую конфигурацию:

    ПолеТипОбязательноОписание
    Pool NameтекстДаУникальный идентификатор этого пула узлов
    Machine Templateвыпадающий списокДаФильтрация шаблонов по Type: Worker Node и совместимой версии Kubernetes
    ReplicasчислоДаЗначение по умолчанию: 3
    Max SurgeчислоНетЗначение по умолчанию: 0, должно быть ≥ 0
    Max UnavailableчислоНетЗначение по умолчанию: 1, должно быть ≥ 0. Когда maxSurge = 0, maxUnavailable должен быть > 0 и ≤ Replicas
    SSH Authorized KeysтекстНетДобавьте несколько SSH public keys

    Правила проверки:

    • Имена пулов должны быть уникальны в пределах кластера
    • IP Pool должен иметь достаточное количество доступных IP-адресов (≥ Replicas)
    • maxSurge и maxUnavailable должны удовлетворять ограничению: если maxSurge = 0, то maxUnavailable > 0

    Совет: добавляйте к имени пула префикс с именем кластера, за которым следует дефис (например, mycluster-worker-1), чтобы избежать конфликтов имен между разными кластерами.

    Шаг 4: Сеть

    ПолеТипОбязательноОписание
    Pods CIDRCIDRДаДиапазон адресов сети Pod
    Services CIDRCIDRДаДиапазон адресов сети Service
    Join CIDRCIDRДаПараметр Join CIDR для Kube-OVN

    Проверка: Pods CIDR и Services CIDR не должны пересекаться.

    Шаг 5: Проверка

    Перед созданием кластера проверьте все параметры конфигурации:

    Основная информация:

    • Name, Display Name, Infrastructure Credential
    • Distribution Version, Kubernetes Version
    • Cluster API Address

    Пул узлов control plane:

    • Machine Template с именем VM Template, версией ОС, версией Kubernetes
    • CPU, Memory, Replicas, SSH Keys

    Пулы worker-узлов (представление списка):

    • Pool Name, Machine Template, Replicas
    • Max Surge, Max Unavailable, SSH Keys

    Сеть:

    • Pods CIDR, Services CIDR, Join CIDR

    Нажмите Create, чтобы начать процесс создания кластера.


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

    Сценарий создания кластера

    При использовании YAML вы создаете ресурсы Cluster API в кластере global, чтобы подготовить инфраструктуру и развернуть рабочий кластер Kubernetes.

    WARNING

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

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

    Сценарий конфигурации

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

    1. Настройте KubeadmControlPlane
    2. Настройте DCSCluster
    3. Создайте ресурс Cluster

    Примечание: инфраструктурные ресурсы (Secret, DCSIpHostnamePool, DCSMachineTemplate) следует настраивать отдельно. Инструкции см. в разделе Ресурсы инфраструктуры для Huawei DCS.

    Планирование сети и LoadBalancer

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

    Требования:

    • Сегментация сети: спланируйте диапазоны IP-адресов для узлов control plane
    • Load balancer: разверните и настройте доступ к API server
    • Адрес API server: подготовьте стабильный VIP или адрес load balancer для Kubernetes API Server
    • Подключение: обеспечьте сетевое соединение между всеми компонентами

    Настройка KubeadmControlPlane

    Ресурс KubeadmControlPlane определяет конфигурацию control plane, включая версию Kubernetes, характеристики узлов и параметры bootstrap.

    TIP

    Полная справка по конфигурации

    В приведенном ниже примере длинные файлы конфигурации сокращены для удобства чтения. Полную конфигурацию, включая политики аудита по умолчанию, controls admission и содержимое файлов, см. в Полной конфигурации KubeadmControlPlane в приложении.

    kubeadmcontrolplane.yaml
    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) ..."
            }
        # ... (other files) ...
        clusterConfiguration:
          imageRepository: cloud.alauda.io/alauda
          dns:
            imageTag: <dns-image-tag>
          etcd:
            local:
              imageTag: <etcd-image-tag>
          # ... (apiServer, controllerManager, scheduler) ...
        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>

    Описание параметров:

    ПараметрТипОписаниеОбязательно
    .spec.kubeadmConfigSpecobjectПараметры запуска bootstrap provider kubeadmДа
    .spec.machineTemplate.infrastructureRefobjectСсылка на DCSMachineTemplateДа
    .spec.replicasintКоличество реплик control plane (≤ размер IP Pool)Да
    .spec.versionstringВерсия Kubernetes (должна совпадать с шаблоном VM)Да

    Для версий компонентов (например, <dns-image-tag>, <etcd-image-tag>) см. Матрицу поддержки ОС.

    Настройка DCSCluster

    DCSCluster — это декларация инфраструктурного кластера, которая ссылается на load balancer и учетные данные платформы DCS.

    dcscluster.yaml
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: DCSCluster
    metadata:
      name: "<cluster-name>"
      namespace: cpaas-system
    spec:
      controlPlaneLoadBalancer:
        host: <load-balancer-ip-or-domain-name>
        port: 6443
        type: external
      credentialSecretRef:
        name: <auth-secret-name>
      controlPlaneEndpoint:
        host: <load-balancer-ip-or-domain-name>
        port: 6443
      networkType: kube-ovn
      site: <site>

    Описание параметров:

    ПараметрТипОписаниеОбязательно
    .spec.controlPlaneLoadBalancerobjectСпособ публикации API server control planeДа
    .spec.controlPlaneLoadBalancer.typestringВ настоящее время поддерживается только "external"Да
    .spec.controlPlaneLoadBalancer.hoststringIP-адрес или доменное имя load balancerДа
    .spec.credentialSecretRef.namestringИмя Secret для аутентификации DCSДа
    .spec.networkTypestringВ настоящее время поддерживается только "kube-ovn"Да
    .spec.sitestringИдентификатор site платформы DCSДа

    Настройка Cluster

    Ресурс Cluster объявляет кластер и ссылается на ресурсы control plane и инфраструктуры.

    cluster.yaml
    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 сети PodНет
    .spec.clusterNetwork.services.cidrBlocks[]stringCIDR сети ServiceНет
    .spec.controlPlaneRefobjectСсылка на control planeДа
    .spec.infrastructureRefobjectСсылка на инфраструктурный кластерДа

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

    Инструкции по развертыванию worker-узлов см. в разделе Управление узлами в Huawei DCS.


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

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

    Через Console

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

    Через kubectl

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

    # Check cluster status
    kubectl get cluster -n cpaas-system <cluster-name>
    
    # Verify control plane
    kubectl get kubeadmcontrolplane -n cpaas-system <cluster-name>
    
    # Check machine status
    kubectl get machines -n cpaas-system
    
    # Verify cluster deployment
    kubectl get clustermodule <cluster-name> -o jsonpath='{.status.base.deployStatus}'

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

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

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

    Приложение

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

    Ниже приведена полная конфигурация KubeadmControlPlane, включая все политики аудита по умолчанию, controls admission и содержимое файлов.

    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
            omitStages:
            - "RequestReceived"
            rules:
            - level: None
              users:
              - system:kube-controller-manager
              - system:kube-scheduler
              - system:serviceaccount:kube-system:endpoint-controller
              verbs: ["get", "update"]
              namespaces: ["kube-system"]
              resources:
              - group: ""
                resources: ["endpoints"]
            - level: None
              nonResourceURLs:
              - /healthz*
              - /version
              - /swagger*
            - level: None
              resources:
              - group: ""
                resources: ["events"]
            - level: None
              resources:
              - group: "devops.alauda.io"
            - level: None
              verbs: ["get", "list", "watch"]
            - level: None
              resources:
              - group: "coordination.k8s.io"
                resources: ["leases"]
            - level: None
              resources:
              - group: "authorization.k8s.io"
                resources: ["subjectaccessreviews", "selfsubjectaccessreviews"]
              - group: "authentication.k8s.io"
                resources: ["tokenreviews"]
            - level: None
              resources:
              - group: "app.alauda.io"
                resources: ["imagewhitelists"]
              - group: "k8s.io"
                resources: ["namespaceoverviews"]
            - level: Metadata
              resources:
              - group: ""
                resources: ["secrets", "configmaps"]
            - level: Metadata
              resources:
              - group: "operator.connectors.alauda.io"
                resources: ["installmanifests"]
              - group: "operators.katanomi.dev"
                resources: ["katanomis"]
            - level: RequestResponse
              resources:
              - group: ""
              - 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"]
            - 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>

    Следующие шаги

    После создания кластера: