• Русский
  • Установка кластера global

    В этом документе описывается, как установить кластер global в Immutable Infrastructure. Кластер global — это управляющая плоскость платформы, которая разворачивается через Cluster API. Используйте этот путь, если управляющая плоскость платформы должна работать на неизменяемой операционной системе, такой как Alauda OS.

    Когда использовать этот путь

    Выбирайте этот путь установки, если выполняются все следующие условия:

    • Вы хотите, чтобы кластер global работал на неизменяемой операционной системе. Сегодня поддерживаемым образом является Alauda OS.
    • Ваша инфраструктура относится к одной из документированных платформ: Huawei DCS, VMware vSphere или Huawei Cloud Stack. Поддержка bare-metal для кластера global запланирована.
    • Вы можете запустить временный KIND host, имеющий сетевой доступ к целевой платформе IaaS.

    Для традиционных операционных систем, таких как Ubuntu или RHEL, вместо этого используйте стандартный путь установки.

    Общие предварительные требования

    Следующие предварительные требования применяются для любого провайдера:

    • KIND host, соответствующий минимальным требованиям к оборудованию и сети. См. Обзор для рекомендаций по размеру.
    • Core Package из Customer Portal.
    • Пакет Alauda Container Platform Kubeadm Provider.
    • Пакет инфраструктурного провайдера для целевой платформы.
    • Сетовая достижимость между KIND host и целевой конечной точкой API платформы IaaS.
    • Планирование IP-адресов и имен хостов для управляющей плоскости global и worker-узлов. См. Infrastructure Resources для модели ресурсов, используемой каждым провайдером.
    • Стабильная конечная точка Kubernetes API для кластера global, например VIP или адрес балансировщика нагрузки.
    • Адрес доступа к платформе, адрес реестра и диапазоны CIDR для Pod и Service.
    • Для узлов x86_64, использующих образы Alauda OS, предоставляемые ACP, базовые CPU должны поддерживать ISA baseline x86-64-v2. См. Матрица поддержки ОС.
    Соглашение об именовании (обязательно)

    Это правило применяется ко всем провайдерам инфраструктуры, поддерживаемым этим путем установки — Huawei DCS, Huawei Cloud Stack, VMware vSphere и любому провайдеру, который будет добавлен в будущем. Каждый манифест, который вы создаете на шаге 4, должен ему соответствовать. Неверное именование этих ресурсов приводит к двум различным сценариям отказа, описанным ниже: один нарушает начальное развертывание, другой проявляется только во время аварийного восстановления.

    • Ресурс CAPI Cluster и ресурс инфраструктурного кластера провайдера (например, DCSCluster для Huawei DCS или HCSCluster для Huawei Cloud Stack; у каждого провайдера есть свой эквивалент) должны быть названы ровно global. cpaas-installer ищет их по буквальному имени, а провайдер Huawei Cloud Stack выделяет порты слушателя глобального ELB (11443 для реестра и консоли, 2379 для DR etcd-sync, 443 для веб-доступа) только тогда, когда инфраструктурный кластер называется global. Другое имя незаметно ломает загрузку из реестра, DR etcd-sync и веб-консоль.
    • Каждый другой ресурс CAPI (KubeadmControlPlane, KubeadmConfigTemplate, MachineDeployment) и каждый другой ресурс инфраструктуры провайдера (шаблоны машин, пулы IP/hostname, пулы конфигурации машин и любые другие ресурсы провайдера) должен использовать имя с префиксом global-. Механизм DR (failover) использует этот префикс для идентификации ресурсов, принадлежащих кластеру global. Ресурс кластера global без префикса global- невидим для DR и приводит к удалению машин standby-кластера во время failover — кластер будет создаваться и работать нормально, а затем потеряет узлы при первом использовании DR. Это жесткое требование, а не стилистическое соглашение.
    • Cluster.spec.controlPlaneRef.name и любые другие кросс-ссылки должны точно соответствовать именам с префиксом.

    Совместимость и входные данные версий

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

    Входные данныеНазначение
    Версия Core PackageПредоставляет installer, локальный registry и базовый payload платформы.
    Версия chart Kubeadm providerДолжна соответствовать ресурсам управляющей плоскости Cluster API, используемым глобальным манифестом.
    Версия chart infrastructure providerИспользуйте версию chart провайдера VMware vSphere, DCS или HCS, поставляемую с целевым релизом.
    Образ Alauda OS или VM templateДолжен содержать версию Kubernetes, используемую K8S_VERSION.
    K8S_VERSIONИспользуйте semver с префиксом v, соответствующий целевому образу Alauda OS, например v<major>.<minor>.<patch>.

    Процедура

    Шаг 1 — Подготовка общих переменных

    Установите общие переменные на KIND host.

    export HOST_IP="<kind-host-ip>"
    export LOCAL_REGISTRY_ADDRESS="127.0.0.1:11443"
    export BOOTSTRAP_REGISTRY_ADDRESS="172.18.0.1:11443"
    export NODE_REGISTRY_ADDRESS="${HOST_IP}:11443"
    export CONTROL_PLANE_VIP="<global-control-plane-vip>"
    export PLATFORM_HOST="<platform-access-domain-or-vip>"
    export REGISTRY_DOMAIN="<platform-registry-domain-or-vip>:11443"
    export CLUSTER_CIDR="100.3.0.0/16"
    export SERVICE_CIDR="100.4.0.0/16"
    export K8S_VERSION="<target-kubernetes-version>"
    export INGRESS_CLASS_NAME="global-alb2"
    export HCS_SECRET_NAME="global-secret"
    # Use v-prefixed semver that matches the target Alauda OS image.

    Используйте LOCAL_REGISTRY_ADDRESS при отправке пакетов с KIND host. Используйте BOOTSTRAP_REGISTRY_ADDRESS в значениях репозитория chart AppRelease, потому что Pods провайдера читают репозиторий chart изнутри сети bootstrap KIND. Используйте NODE_REGISTRY_ADDRESS в аннотациях реестра Cluster API, потому что развернутые узлы global должны загружать образы через адрес, доступный из их подсети.

    Шаг 2 — Bootstrap KIND host

    Запустите bootstrap script, предоставленный Core Package. Это поднимет временный управляющий кластер minialauda на KIND host.

    mkdir -p /root/cpaas-install
    tar -xvf <core-package> -C /root/cpaas-install
    cd /root/cpaas-install/installer
    sh setup.sh
    mkdir -p ~/.kube
    cp /var/cpaas/data/alauda.kubeconfig ~/.kube/config

    Bootstrap script разворачивает встроенный registry, управляющую плоскость Cluster API и компоненты installer, которые выполняют установку кластера global.

    Шаг 3 — Загрузка и установка пакетов провайдера

    Загрузите пакет провайдера Kubeadm и пакет инфраструктурного провайдера в локальный registry.

    Почему cluster.type равен Baremetal для любого провайдера

    Значения AppRelease во вкладках ниже везде устанавливают global.cluster.type: Baremetal. Это внутренний классификатор chart, а не имя провайдера IaaS. Оставляйте значение Baremetal для установок global на Huawei DCS, VMware vSphere и Huawei Cloud Stack. Это значение определяет, как платформа настраивает компоненты на уровне узлов; оно не выбирает инфраструктурного провайдера.

    Huawei DCS
    VMware vSphere
    Huawei Cloud Stack
    Bare Metal

    Установите пути к пакетам провайдера и версии chart.

    export DCS_PROVIDER_PACK="/root/cluster-api-provider-dcs.amd64.<version>.tgz"
    export KUBEADM_PROVIDER_PACK="/root/cluster-api-provider-kubeadm.amd64.<version>.tgz"
    export DCS_PROVIDER_VERSION="<dcs-provider-chart-version>"
    export KUBEADM_PROVIDER_VERSION="<kubeadm-provider-chart-version>"

    Загрузите пакеты.

    /root/cpaas-install/installer/res/amd64/packtool pack push \
      -r "${LOCAL_REGISTRY_ADDRESS}" -c "${DCS_PROVIDER_PACK}"
    
    /root/cpaas-install/installer/res/amd64/packtool pack push \
      -r "${LOCAL_REGISTRY_ADDRESS}" -c "${KUBEADM_PROVIDER_PACK}"

    Создайте и примените ресурсы AppRelease для провайдера Kubeadm и провайдера DCS.

    mkdir -p /root/yamls
    export DCS_PROVIDER_APPRELEASES="/root/yamls/dcs-provider-appreleases.yaml"
    
    cat > "${DCS_PROVIDER_APPRELEASES}" <<EOF
    ---
    apiVersion: operator.alauda.io/v1alpha1
    kind: AppRelease
    metadata:
      annotations:
        auto-recycle: "true"
        interval-sync: "true"
      name: cluster-api-provider-kubeadm
      namespace: cpaas-system
    spec:
      destination:
        cluster: ""
        namespace: ""
      source:
        chartPullSecret: global-registry-auth
        charts:
          - name: ait/chart-cluster-api-provider-kubeadm
            releaseName: cluster-api-provider-kubeadm
            targetRevision: ${KUBEADM_PROVIDER_VERSION}
        repoURL: ${BOOTSTRAP_REGISTRY_ADDRESS}
      timeout: 120
      values:
        global:
          albName: ${INGRESS_CLASS_NAME}
          auth:
            default_admin: admin@cpaas.io
          cluster:
            isGlobal: true
            name: global
            networkType: kube-ovn
            type: Baremetal
          host: ${PLATFORM_HOST}
          ingress:
            ingressClassName: ${INGRESS_CLASS_NAME}
          labelBaseDomain: cpaas.io
          namespace: cpaas-system
          platformUrl: https://${PLATFORM_HOST}
          protectSecretFiles:
            enabled: false
          region: global
          registry:
            address: ${BOOTSTRAP_REGISTRY_ADDRESS}
            imagePullSecrets:
              - global-registry-auth
          replicas: 1
          scheme: https
    ---
    apiVersion: operator.alauda.io/v1alpha1
    kind: AppRelease
    metadata:
      annotations:
        auto-recycle: "true"
        interval-sync: "true"
      name: cluster-api-provider-dcs
      namespace: cpaas-system
    spec:
      destination:
        cluster: ""
        namespace: ""
      source:
        chartPullSecret: global-registry-auth
        charts:
          - name: ait/chart-cluster-api-provider-dcs
            releaseName: cluster-api-provider-dcs
            targetRevision: ${DCS_PROVIDER_VERSION}
        repoURL: ${BOOTSTRAP_REGISTRY_ADDRESS}
      timeout: 120
      values:
        global:
          albName: ${INGRESS_CLASS_NAME}
          auth:
            default_admin: admin@cpaas.io
          cluster:
            isGlobal: true
            name: global
            networkType: kube-ovn
            type: Baremetal
          host: ${PLATFORM_HOST}
          ingress:
            ingressClassName: ${INGRESS_CLASS_NAME}
          labelBaseDomain: cpaas.io
          namespace: cpaas-system
          platformUrl: https://${PLATFORM_HOST}
          protectSecretFiles:
            enabled: false
          region: global
          registry:
            address: ${BOOTSTRAP_REGISTRY_ADDRESS}
            imagePullSecrets:
              - global-registry-auth
          replicas: 1
          scheme: https
    EOF
    
    kubectl apply -f "${DCS_PROVIDER_APPRELEASES}"
    
    until kubectl get crd kubeadmcontrolplanes.controlplane.cluster.x-k8s.io --ignore-not-found 2>/dev/null | grep -q kubeadmcontrolplanes.controlplane.cluster.x-k8s.io; do
      sleep 10
    done
    
    until kubectl get crd dcsclusters.infrastructure.cluster.x-k8s.io --ignore-not-found 2>/dev/null | grep -q dcsclusters.infrastructure.cluster.x-k8s.io; do
      sleep 10
    done

    Шаг 4 — Настройка provider-specific манифеста global

    Создайте один provider-specific манифест для кластера global. Манифест использует те же ресурсы провайдера, что и workload cluster, но также должен включать глобальные labels, annotations, значения registry, совместимые с installer настройки kubeadm и пути к постоянным данным, требуемые управляющей плоскостью платформы.

    Используйте руководства по созданию провайдера как подробный справочник по ресурсам:

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

    Установите KubeadmControlPlane.spec.kubeadmConfigSpec.format в значение, принимаемое целевым провайдером. Это принудительно проверяется контроллерами провайдера:

    ПровайдерФормат bootstrap userdata
    Huawei DCSignition (принудительно задается провайдером; DCS provider отклоняет любой другой формат с ошибкой invalid format, expected ignition, got <other>).
    VMware vSpherecloud-init (значение по умолчанию провайдера; установка ignition не поддерживается).
    Huawei Cloud Stackcloud-init (принудительно задается провайдером; HCS provider отклоняет ignition с ошибкой ignition format is not supported).
    Huawei DCS
    VMware vSphere
    Huawei Cloud Stack
    Bare Metal

    Установите выходной путь для манифеста DCS global перед его рендерингом.

    export GLOBAL_DCS_YAML="/root/yamls/new-global.yaml"

    Манифест DCS global должен содержать следующие ресурсы в namespace cpaas-system:

    РесурсНазначение
    Secret с type: CloudCredentialХранит authUser, authKey, endpoint и site для доступа к API DCS.
    DCSIpHostnamePool для узлов управляющей плоскостиНазначает статические IP, hostnames, сетевые настройки и любые управляемые пулом постоянные диски.
    DCSMachineTemplate для узлов управляющей плоскостиОпределяет шаблон VM DCS, folder, CPU, memory и локальные диски шаблона.
    KubeadmControlPlaneВыполняет bootstrap управляющей плоскости Kubernetes. Установите spec.version в ${K8S_VERSION}.
    DCSClusterОпределяет инфраструктурный кластер DCS и endpoint управляющей плоскости.
    ClusterСвязывает Cluster API Cluster с DCSCluster и KubeadmControlPlane.
    DCSIpHostnamePool, DCSMachineTemplate, KubeadmConfigTemplate и MachineDeployment для worker-узловСоздает worker-узлы.

    Используйте поля ресурсов DCS из Создание кластеров в Huawei DCS и Ресурсы инфраструктуры для Huawei DCS. Для кластера global сохраните следующие дополнительные требования:

    • Установите Cluster.metadata.name и DCSCluster.metadata.name в global (инфраструктурный кластер разделяет имя CAPI Cluster). Префикс global- должен использоваться для каждого другого ресурса CAPI и ресурса провайдера; фрагмент связки ниже использует KubeadmControlPlane.metadata.name: global-kcp.
    • Добавьте Cluster.metadata.labels.is-global: "true" и Cluster.metadata.labels.cluster-type: DCS.
    • Добавьте Cluster.metadata.annotations["cpaas.io/registry-address"] со значением ${NODE_REGISTRY_ADDRESS}.
    • Установите KubeadmControlPlane.spec.kubeadmConfigSpec.format: ignition для Alauda OS.
    • Оставьте в release manifest нешифруемые kubeadm-файлы, патчи kubelet, policy audit и записи installer RBAC.
    • Для обычного не-DR развертывания не задавайте DCSCluster.spec.encryptionProviderConfigRef и не добавляйте /etc/kubernetes/encryption-provider.conf в KubeadmControlPlane.spec.kubeadmConfigSpec.files.
    • Оставьте /var/cpaas как состояние платформы. Если диск должен переживать rolling replacement, объявите его в DCSIpHostnamePool.spec.pool[].persistentDisk; не полагайтесь на диски шаблона DCSMachineTemplate как на сохраняемое состояние.
    • Используйте конкретные значения datastoreName для локального хранилища DCS, если только вы не убедились, что выбранный datastore cluster может размещать тома на хостах, которые могут запускать целевую VM.
    Область фрагмента

    Следующий YAML является дифференциальным фрагментом, а не полным манифестом, который можно применить напрямую. Сначала объедините эти изменения, специфичные для global, с манифестом, который вы подготовите на основе ссылок DCS create-cluster, а затем примените полный файл манифеста.

    Следующий фрагмент показывает global-специфичную связку Cluster API. Заполните поля ресурсов провайдера, используя приведенные выше ссылки на создание кластера DCS.

    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      name: global
      namespace: cpaas-system
      labels:
        cluster-type: DCS
        is-global: "true"
      annotations:
        capi.cpaas.io/resource-group-version: infrastructure.cluster.x-k8s.io/v1beta1
        capi.cpaas.io/resource-kind: DCSCluster
        cpaas.io/registry-address: "${NODE_REGISTRY_ADDRESS}"
    spec:
      clusterNetwork:
        pods:
          cidrBlocks:
            - ${CLUSTER_CIDR}
        services:
          cidrBlocks:
            - ${SERVICE_CIDR}
      controlPlaneRef:
        apiVersion: controlplane.cluster.x-k8s.io/v1beta1
        kind: KubeadmControlPlane
        name: global-kcp
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: DCSCluster
        name: global
    ---
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    metadata:
      name: global-kcp
      namespace: cpaas-system
      annotations:
        controlplane.cluster.x-k8s.io/skip-kube-proxy: ""
    spec:
      replicas: 3
      version: ${K8S_VERSION}
      rolloutStrategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 0
      machineTemplate:
        nodeDrainTimeout: 1m
        nodeDeletionTimeout: 5m
        infrastructureRef:
          apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
          kind: DCSMachineTemplate
          name: global-master-template
      kubeadmConfigSpec:
        format: ignition
        clusterConfiguration:
          etcd:
            local:
              serverCertSANs:
                - "${CONTROL_PLANE_VIP}"
                - "${PLATFORM_HOST}"

    Шаг 5 — Применение манифеста global

    Примените provider-specific манифест к minialauda.

    Huawei DCS
    VMware vSphere
    Huawei Cloud Stack
    Bare Metal
    kubectl apply -f "${GLOBAL_DCS_YAML}"

    Шаг 6 — Ожидание управляющей плоскости

    Дождитесь, пока провайдер Cluster API развернет виртуальные машины и поднимет управляющую плоскость Kubernetes.

    kubectl get clusters.cluster.x-k8s.io -n cpaas-system
    kubectl get kubeadmcontrolplane -n cpaas-system
    kubectl get machines -n cpaas-system

    Управляющая плоскость готова, когда KubeadmControlPlane сообщает Ready: True, а Cluster сообщает Phase: Provisioned.

    Шаг 7 — Импорт ресурсов провайдера

    Перед запуском installer создайте ConfigMap dcs-import-extra-resources в namespace cpaas-system для провайдеров, которым требуется импорт дополнительных ресурсов. Имя ConfigMap сохраняет префикс dcs по историческим причинам совместимости installer, даже если провайдер не является Huawei DCS.

    VMware vSphere и Huawei Cloud Stack требуют этот ConfigMap как для обычных, так и для disaster recovery установок global. Huawei DCS не требует его для установки по умолчанию, потому что ресурсы провайдера DCS мигрируются встроенным потоком; создавайте его для DCS только тогда, когда нужно импортировать дополнительные ресурсы сверх встроенной миграции ресурсов провайдера.

    Huawei DCS
    VMware vSphere
    Huawei Cloud Stack
    Bare Metal

    Не создавайте ConfigMap dcs-import-extra-resources для пути установки DCS по умолчанию. Ресурсы провайдера DCS мигрируются встроенным потоком.

    Шаг 8 — Запуск установки платформы

    Отправьте запрос на установку платформы во встроенный REST API installer. Installer импортирует ресурсы Cluster API в новый кластер global, разворачивает базовый operator и устанавливает выбранные plugins.

    export INSTALLER_IP=$(kubectl get pods -n cpaas-system -l service_name=cpaas-installer \
      -o jsonpath='{.items[0].status.podIP}')
    Сетевой охват

    INSTALLER_IP — это Pod IP встроенного installer в minialauda. Эндпоинт используется только во время установки.

    Создайте JSON-файл конфигурации installer для конкретного провайдера на текущем KIND host, затем отправьте его на endpoint installer. DCS, VMware vSphere и HCS используют один и тот же путь endpoint, но их тела запросов различаются.

    ПолеHuawei DCSVMware vSphereHuawei Cloud Stack
    Путь endpoint/cpaas-installer/api/config/dcs/cpaas-installer/api/config/dcs/cpaas-installer/api/config/dcs
    console.hostЛокальный список global HA VIPПустой список, []Пустой список, []
    console.globalHostАдрес доступа к платформеАдрес доступа к платформеАдрес доступа к платформе
    cluster.clusterCIDR и cluster.serviceCIDRОбязательноНе задаются; cluster CIDR объявляются в манифесте VMware vSphere ClusterНе задаются
    cluster.features.haОбязательно, указывает на локальный HA VIP с isThirdParty: trueНе задается; endpoint управляющей плоскости объявлен в VSphereCluster.spec.controlPlaneEndpoint.hostНе задается; HCS ELB объявлен в HCSCluster
    hostIPТекущий IP KIND hostТекущий IP KIND hostТекущий IP KIND host
    Huawei DCS
    VMware vSphere
    Huawei Cloud Stack
    Bare Metal

    Запрос installer для DCS включает внешний HA VIP, потому что DCS использует сторонний control plane VIP.

    mkdir -p /root/yamls
    export INSTALLER_CONFIG_JSON="/root/yamls/installer-config-dcs.json"
    
    cat > "${INSTALLER_CONFIG_JSON}" <<EOF
    {
      "basic": {
        "username": "admin@cpaas.io",
        "password": "<base64-platform-admin-password>"
      },
      "registry": {
        "domain": "${REGISTRY_DOMAIN}",
        "username": "<registry-username>",
        "password": "<base64-registry-password>"
      },
      "console": {
        "host": [
          "${CONTROL_PLANE_VIP}"
        ],
        "globalHost": "${PLATFORM_HOST}",
        "httpPort": 80,
        "httpsPort": 443,
        "cert": {
          "selfSigned": {}
        }
      },
      "cluster": {
        "clusterCIDR": "${CLUSTER_CIDR}",
        "serviceCIDR": "${SERVICE_CIDR}",
        "features": {
          "ha": {
            "vip": "${CONTROL_PLANE_VIP}",
            "vport": 6443,
            "isThirdParty": true
          }
        }
      },
      "product": [
        "base",
        "acp"
      ],
      "deployMode": "normal",
      "hostIP": "${HOST_IP}"
    }
    EOF
    
    curl -k -X POST "http://${INSTALLER_IP}:8080/cpaas-installer/api/config/dcs" \
      -H 'Content-Type: application/json' \
      -d @"${INSTALLER_CONFIG_JSON}"

    Установите console.host и cluster.features.ha.vip в локальный global HA VIP. Не используйте domain платформы в console.host; используйте console.globalHost для адреса доступа к платформе.

    Сертификаты консоли от стороннего CA

    В примерах используется самоподписанный сертификат консоли. Если среда требует сертификат от стороннего CA, замените console.cert блоком thirdParty, который содержит полную цепочку сертификатов в base64, закрытый ключ и необязательные значения PKCS#12 перед отправкой запроса installer.

    Шаг 9 — Мониторинг установки

    После того как installer примет запрос, установка проходит через несколько фаз, которые можно наблюдать с KIND host. Типичный кластер global на неизменяемой ОС устанавливается за 30–60 минут; общее время зависит от скорости provisioning IaaS, времени загрузки образов и количества выбранных plugins.

    Фазы, которые вы увидите

    ФазаЧто происходитГде смотреть в первую очередь
    BootstrapBootstrap KIND, встроенный registry и провайдеры Cluster API работают на KIND host. Завершено на Шаге 2 и Шаге 3.Терминал KIND host; kubectl get pods -n cpaas-system
    Provisioning инфраструктурыПровайдер Cluster API создает VM из шаблона Alauda OS на целевой платформе IaaS.kubectl get machines -n cpaas-system
    Bootstrap управляющей плоскостиKubeadmControlPlane выполняет bootstrap первого узла управляющей плоскости, запускается etcd, а дополнительные узлы управляющей плоскости присоединяются.kubectl get kubeadmcontrolplane -n cpaas-system
    Сеть и базовые add-onПровайдер CAPI reconciles Kube-OVN, CoreDNS и kube-proxy в новом кластере.kubectl --kubeconfig <global-kubeconfig> get pods -n kube-system
    Установка платформыInstaller импортирует ресурсы Cluster API в новый кластер global, разворачивает базовый operator и устанавливает выбранные plugins.API progress installer; log installer
    ЗавершениеInstaller помечает запрос как Success и записывает итоговое состояние кластера в ClusterModule/global.API progress installer; kubectl --kubeconfig <global-kubeconfig> get clustermodule global

    Сигналы во время установки

    Наблюдайте за installer progress API и log installer вместе. Если что-то выглядит зависшим, проверьте базовые ресурсы Cluster API напрямую на bootstrap KIND host.

    # Installer progress and live log
    curl "http://${INSTALLER_IP}:8080/cpaas-installer/api/progress"
    tail -f /var/cpaas/data/installer.log
    
    # Cluster API resources on the bootstrap KIND host
    kubectl get clusters.cluster.x-k8s.io -A
    kubectl get kubeadmcontrolplane -A
    kubectl get machines -A

    Log installer записывает каждое изменение фазы. Временные ошибки повторяются с коротким интервалом; постоянные ошибки остаются видимыми в журнале и отображаются в progress API как зависшая стадия.

    Проверьте кластер global после того, как installer сообщит об успехе.

    kubectl --kubeconfig <global-kubeconfig> get nodes
    kubectl --kubeconfig <global-kubeconfig> get pods -n cpaas-system
    kubectl --kubeconfig <global-kubeconfig> get clustermodule global

    Частые зависания и где искать

    СимптомКуда смотреть в первую очередьЧто искать
    Машины остаются в Pending или не появляютсяkubectl describe machine -n cpaas-system <machine>Причину сбоя, специфичную для провайдера, в условиях Bootstrap и Infrastructure машины. Здесь проявляются проблемы quota IaaS, сети и учетных данных.
    KubeadmControlPlane не достигает Readykubectl get nodes с kubeconfig нового кластера и kubectl describe kubeadmcontrolplane -n cpaas-systemСостояние etcd на первом узле управляющей плоскости и прогресс присоединения остальных узлов.
    Pod в kube-system остаются в Pending или не могут загрузить образыkubectl --kubeconfig <global-kubeconfig> describe pod -n kube-system <pod>Ошибки загрузки образов обычно означают, что адрес registry, доступный узлам, недостижим из подсети нового кластера.
    API progress installer показывает зависшую стадию/var/cpaas/data/installer.logПоследняя строка фазы и последнее сообщение об ошибке. Повторяемые ошибки повторяются с коротким интервалом; постоянные ошибки не продвигаются дальше.
    ClusterModule/global не достигает здоровой фазыkubectl --kubeconfig <global-kubeconfig> describe clustermodule globalStatus.conditions показывают, какой модуль блокирует завершение кластера.

    Проблемы, не перечисленные здесь, обычно указывают на причины, зависящие от среды. Соберите log installer, ответ progress API и соответствующий вывод kubectl describe, затем передайте их на эскалацию.

    Необязательное развертывание Disaster Recovery

    Используйте этот раздел, если вы разворачиваете primary и standby кластеры global для disaster recovery. Выполните эти добавления до применения provider-specific манифеста для каждого кластера global.

    Primary и standby кластеры должны использовать одинаковую конфигурацию encryption provider. Для DCS и HCS обычные не-DR развертывания не добавляют /etc/kubernetes/encryption-provider.conf в KubeadmControlPlane.spec.kubeadmConfigSpec.files; для DCS обычные не-DR развертывания также не задают DCSCluster.spec.encryptionProviderConfigRef. VMware vSphere сохраняет запись файла /etc/kubernetes/encryption-provider.conf из release manifest.

    Подготовка общих DR-переменных

    Установите одинаковое значение ключа шифрования в обеих средах установки — primary и standby.

    export ENCRYPTION_PROVIDER_CONF="/root/yamls/encryption-provider.conf"
    export ENCRYPTION_PROVIDER_SECRET_B64="<base64-shared-etcd-encryption-key>"
    export PRIMARY_CLUSTER_VIP="<primary-ha-vip>"
    export STANDBY_CLUSTER_VIP="<standby-ha-vip>"
    export ETCD_SYNC_VERSION="<global-etcd-sync-version>"
    export ETCD_SYNC_MODULEINFO="/root/yamls/global-etcd-sync-moduleinfo.json"

    Создайте файл конфигурации encryption provider в обеих средах установки.

    mkdir -p "$(dirname "${ENCRYPTION_PROVIDER_CONF}")"
    cat > "${ENCRYPTION_PROVIDER_CONF}" <<EOF_CONF
    apiVersion: apiserver.config.k8s.io/v1
    kind: EncryptionConfiguration
    resources:
    - resources:
      - secrets
      providers:
      - aescbc:
          keys:
          - name: key1
            secret: ${ENCRYPTION_PROVIDER_SECRET_B64}
    EOF_CONF

    Добавление DR SAN для сертификатов в KubeadmControlPlane

    В манифесте, сгенерированном на Шаге 4, включите оба VIP управляющей плоскости — primary и standby — и адрес доступа к платформе в KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.serverCertSANs. Используйте один и тот же список SAN в обеих средах установки — primary и standby.

    serverCertSANs:
      - "${PRIMARY_CLUSTER_VIP}"
      - "${STANDBY_CLUSTER_VIP}"
      - "${PLATFORM_HOST}"

    Добавление provider-specific полей DR

    Huawei DCS
    VMware vSphere
    Huawei Cloud Stack
    Bare Metal

    Создайте Secret encryption provider в minialauda.

    kubectl create secret generic encryption-provider-config \
      --from-file=encryption-provider.conf="${ENCRYPTION_PROVIDER_CONF}" \
      -n cpaas-system \
      --dry-run=client -o yaml | kubectl apply -f -

    Добавьте ссылку на Secret в DCSCluster.spec.

    encryptionProviderConfigRef:
      name: encryption-provider-config

    DCS использует DCSCluster.spec.encryptionProviderConfigRef для доставки конфигурации encryption provider для disaster recovery. Не добавляйте /etc/kubernetes/encryption-provider.conf в KubeadmControlPlane.spec.kubeadmConfigSpec.files для DCS DR path.

    Если вы создали dcs-import-extra-resources, сохраните ConfigMap в обеих средах установки — primary и standby.

    Установка primary и standby кластеров

    Выполните Шаги 1–9 для обоих кластеров global — primary и standby.

    Используйте различия в конфигурации installer для каждого провайдера на обеих сторонах:

    ПровайдерУстановка primaryУстановка standby
    Huawei DCSУстановите console.host и cluster.features.ha.vip в primary HA VIP.Установите console.host и cluster.features.ha.vip в standby HA VIP.
    VMware vSphereУстановите VSphereCluster.spec.controlPlaneEndpoint.host в primary HA VIP, используемый в primary манифесте. Создайте ConfigMap VMware vSphere dcs-import-extra-resources из Шага 7 и держите global-vsphere-credentials синхронизированным с VSphereCluster.spec.identityRef.name.Установите VSphereCluster.spec.controlPlaneEndpoint.host в standby HA VIP, используемый в standby манифесте. Создайте ConfigMap VMware vSphere dcs-import-extra-resources из Шага 7 и держите global-vsphere-credentials синхронизированным с VSphereCluster.spec.identityRef.name.
    Huawei Cloud StackОставьте console.host: []; primary VIP управляется HCS ELB. Создайте ConfigMap HCS dcs-import-extra-resources из Шага 7 и держите HCS_SECRET_NAME синхронизированным с HCSCluster.spec.identityRef.name.Оставьте console.host: []; standby VIP управляется HCS ELB. Создайте ConfigMap HCS dcs-import-extra-resources из Шага 7 и держите HCS_SECRET_NAME синхронизированным с HCSCluster.spec.identityRef.name.

    Для primary кластера убедитесь, что domain платформы разрешается в primary HA VIP. На Шаге 8 установите hostIP в IP primary KIND node. Для DCS установите console.host и cluster.features.ha.vip в primary HA VIP. Для VMware vSphere установите endpoint управляющей плоскости в primary манифесте на primary HA VIP. Для HCS оставьте console.host: [], потому что VIP принадлежит HCS ELB.

    После успешной установки primary кластера переключите domain платформы на standby HA VIP, как требуется процедурой DR. Затем установите standby кластер. На Шаге 8 на standby KIND host установите hostIP в IP standby KIND node. Для DCS установите console.host и cluster.features.ha.vip в standby HA VIP. Для VMware vSphere установите endpoint управляющей плоскости в standby манифесте на standby HA VIP. Для HCS оставьте console.host: []. Получите INSTALLER_IP из Pod cpaas-installer на standby KIND host; не используйте значение primary KIND host.

    После установки обоих кластеров получите токен k8sadmin primary на узле управляющей плоскости primary. etcd-sync устанавливается только в standby-кластере, а его значения active_cluster_* указывают на primary-кластер. Храните это значение в его исходной base64 Secret форме для active_cluster_token.

    export PRIMARY_CLUSTER_TOKEN_B64="$(sudo kubectl get secret -n cpaas-system k8sadmin -o jsonpath='{.data.token}')"

    Получите токен k8sadmin standby на узле управляющей плоскости standby. Используйте этот декодированный bearer token для вызова API ModuleInfo standby-кластера.

    export STANDBY_CLUSTER_BEARER_TOKEN="$(sudo kubectl get secret -n cpaas-system k8sadmin -o jsonpath='{.data.token}' | base64 -d)"

    Если вы создаете payload global-etcd-sync ModuleInfo с другого хоста, безопасно передайте декодированное значение с узла управляющей плоскости standby и экспортируйте его там.

    export STANDBY_CLUSTER_BEARER_TOKEN="<decoded-standby-token>"

    Создайте payload global-etcd-sync ModuleInfo для standby-кластера. Значения active_cluster_vip и active_cluster_token должны указывать на primary-кластер.

    cat > "${ETCD_SYNC_MODULEINFO}" <<EOF
    {
      "kind": "ModuleInfo",
      "apiVersion": "cluster.alauda.io/v1alpha1",
      "metadata": {
        "name": "global-etcd-sync",
        "labels": {
          "cpaas.io/cluster-name": "global",
          "cpaas.io/module-name": "etcd-sync",
          "cpaas.io/module-type": "plugin"
        }
      },
      "spec": {
        "version": "${ETCD_SYNC_VERSION}",
        "config": {
          "monitor_check_interval": 1,
          "detail": false,
          "active_cluster_vip": "${PRIMARY_CLUSTER_VIP}",
          "active_cluster_token": "${PRIMARY_CLUSTER_TOKEN_B64}"
        }
      }
    }
    EOF

    Установите global-etcd-sync, вызвав API ModuleInfo на standby-кластере.

    curl -sk -X POST "https://${STANDBY_CLUSTER_VIP}/apis/cluster.alauda.io/v1alpha1/moduleinfoes" \
      -H "Authorization: Bearer ${STANDBY_CLUSTER_BEARER_TOKEN}" \
      -H "Content-Type: application/json" \
      -d @"${ETCD_SYNC_MODULEINFO}"

    Перезапустите Pods, которые должны перечитать конфигурацию DR и endpoint. Выполните те же команды на узле управляющей плоскости primary и на узле управляющей плоскости standby.

    sudo kubectl delete po -n cpaas-system -l 'service_name in (alertmanager,vmselect,vminsert)'
    sudo kubectl delete po -n cpaas-system -l service_name=cpaas-elasticsearch
    sudo kubectl delete po -n cpaas-system -l service_name=cluster-transformer

    О жизненном цикле DR после установки см. Аварийное восстановление кластера global.

    Проверка

    После того как installer сообщит о завершении, проверьте, что кластер global находится в здоровом состоянии.

    kubectl --kubeconfig <global-kubeconfig> get nodes
    kubectl --kubeconfig <global-kubeconfig> get clusters.platform.tkestack.io global \
      -o jsonpath='{.status.phase}'
    kubectl --kubeconfig <global-kubeconfig> get pods -n cpaas-system
    kubectl --kubeconfig <global-kubeconfig> get clustermodule global

    Установка считается успешной, если выполняются все следующие условия:

    • API progress installer сообщает status: Success и type: Complete.
    • Все узлы кластера global имеют состояние Ready.
    • Критические Pods в cpaas-system имеют состояние Running или Completed.
    • ClusterModule/global сообщает, что базовый модуль находится в здоровом состоянии.

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