Установка кластера 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 и любые другие кросс-ссылки должны точно соответствовать именам с префиксом.
Совместимость и входные данные версий
Перед установкой зафиксируйте поддерживаемый набор версий для пакета поставки:
Процедура
Шаг 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. Это значение определяет, как платформа настраивает компоненты на уровне узлов; оно не выбирает инфраструктурного провайдера.
Установите пути к пакетам провайдера и версии 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
Установите пути к пакетам провайдера и версии chart.
export VSPHERE_PROVIDER_PACK="/root/cluster-api-provider-vsphere.amd64.<version>.tgz"
export KUBEADM_PROVIDER_PACK="/root/cluster-api-provider-kubeadm.amd64.<version>.tgz"
export VSPHERE_PROVIDER_VERSION="<vsphere-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 "${VSPHERE_PROVIDER_PACK}"
/root/cpaas-install/installer/res/amd64/packtool pack push \
-r "${LOCAL_REGISTRY_ADDRESS}" -c "${KUBEADM_PROVIDER_PACK}"
Создайте и примените ресурсы AppRelease для провайдера Kubeadm и провайдера VMware vSphere.
mkdir -p /root/yamls
export VSPHERE_PROVIDER_APPRELEASES="/root/yamls/vsphere-provider-appreleases.yaml"
cat > "${VSPHERE_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-vsphere
namespace: cpaas-system
spec:
destination:
cluster: ""
namespace: ""
source:
chartPullSecret: global-registry-auth
charts:
- name: ait/chart-cluster-api-provider-vsphere
releaseName: cluster-api-provider-vsphere
targetRevision: ${VSPHERE_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 "${VSPHERE_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 vsphereclusters.infrastructure.cluster.x-k8s.io --ignore-not-found 2>/dev/null | grep -q vsphereclusters.infrastructure.cluster.x-k8s.io; do
sleep 10
done
Установите пути к пакетам провайдера и версии chart.
export HCS_PROVIDER_PACK="/root/cluster-api-provider-hcs.amd64.<version>.tgz"
export KUBEADM_PROVIDER_PACK="/root/cluster-api-provider-kubeadm.amd64.<version>.tgz"
export HCS_PROVIDER_VERSION="<hcs-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 "${HCS_PROVIDER_PACK}"
/root/cpaas-install/installer/res/amd64/packtool pack push \
-r "${LOCAL_REGISTRY_ADDRESS}" -c "${KUBEADM_PROVIDER_PACK}"
Создайте и примените ресурсы AppRelease для провайдера Kubeadm и провайдера HCS.
mkdir -p /root/yamls
export HCS_PROVIDER_APPRELEASES="/root/yamls/hcs-provider-appreleases.yaml"
cat > "${HCS_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-hcs
namespace: cpaas-system
spec:
destination:
cluster: ""
namespace: ""
source:
chartPullSecret: global-registry-auth
charts:
- name: ait/chart-cluster-api-provider-hcs
releaseName: cluster-api-provider-hcs
targetRevision: ${HCS_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 "${HCS_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 hcsclusters.infrastructure.cluster.x-k8s.io --ignore-not-found 2>/dev/null | grep -q hcsclusters.infrastructure.cluster.x-k8s.io; do
sleep 10
done
Статус: запланировано
Поддержка bare-metal для кластера global в Immutable Infrastructure запланирована.
Шаг 4 — Настройка provider-specific манифеста global
Создайте один provider-specific манифест для кластера global. Манифест использует те же ресурсы провайдера, что и workload cluster, но также должен включать глобальные labels, annotations, значения registry, совместимые с installer настройки kubeadm и пути к постоянным данным, требуемые управляющей плоскостью платформы.
Используйте руководства по созданию провайдера как подробный справочник по ресурсам:
Применяйте соглашение об именовании из Общих предварительных требований ко всем ресурсам в манифесте, который вы создаете ниже.
Установите KubeadmControlPlane.spec.kubeadmConfigSpec.format в значение, принимаемое целевым провайдером. Это принудительно проверяется контроллерами провайдера:
Установите выходной путь для манифеста DCS global перед его рендерингом.
export GLOBAL_DCS_YAML="/root/yamls/new-global.yaml"
Манифест DCS global должен содержать следующие ресурсы в namespace cpaas-system:
Используйте поля ресурсов 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}"
Установите выходной путь для манифеста VMware vSphere global перед его рендерингом.
export GLOBAL_VSPHERE_YAML="/root/yamls/new-global.yaml"
Манифест VMware vSphere global должен содержать следующие ресурсы в namespace cpaas-system:
Подготовьте входные значения vSphere, используя Подготовка параметров для кластера VMware vSphere. Подготовьте манифест кластера global, используя Создание кластера VMware vSphere в кластере global и Провайдер VMware vSphere в качестве базовых ссылок. Руководство create-cluster написано для workload cluster, создаваемых из кластера global, но большую часть YAML vSphere из этого руководства можно повторно использовать для кластера global, если вы примените следующие дополнительные требования:
- Установите
Cluster.metadata.name и VSphereCluster.metadata.name в global (инфраструктурный кластер разделяет имя CAPI Cluster). Префикс global- должен использоваться для каждого другого ресурса CAPI и ресурса провайдера; фрагмент связки ниже использует KubeadmControlPlane.metadata.name: global-kcp.
- Добавьте
Cluster.metadata.labels.is-global: "true" и Cluster.metadata.labels.cluster-type: VSphere.
- Добавьте
Cluster.metadata.annotations["cpaas.io/registry-address"] со значением ${NODE_REGISTRY_ADDRESS}.
- Сохраните аннотации VMware vSphere, требуемые контроллерами платформы, включая сетевые аннотации и аннотации CPI из руководства VMware vSphere create-cluster.
- Установите
VSphereMachineTemplate.spec.template.spec.folder в /<datacenter>/vm/global, чтобы операторы могли идентифицировать VM кластера global в vCenter. В DR-развертывании используйте отдельные дочерние папки, например /<datacenter>/vm/global/primary и /<datacenter>/vm/global/standby, для primary и standby кластеров.
- Установите
VSphereCluster.spec.identityRef.name в global-vsphere-credentials. Это фиксированное имя Secret требуется только для пути установки VMware vSphere global; не-global кластеры VMware vSphere следуют общему руководству create-cluster.
- Установите
KubeadmControlPlane.spec.kubeadmConfigSpec.format: cloud-init или оставьте поле пустым, так как cloud-init является значением по умолчанию для VMware vSphere.
- Сохраните в release manifest kubeadm-файлы, включая запись VMware vSphere
/etc/kubernetes/encryption-provider.conf, патчи kubelet, policy audit и записи installer RBAC. VMware vSphere доставляет этот файл через KubeadmControlPlane.spec.kubeadmConfigSpec.files; не следуйте шаблону DCSCluster.spec.encryptionProviderConfigRef из DCS.
Область фрагмента
Следующий YAML является дифференциальным фрагментом, а не полным манифестом, который можно применить напрямую. Сначала объедините эти изменения, специфичные для global, с манифестом, который вы подготовите на основе руководства VMware vSphere create-cluster, а затем примените полный файл манифеста.
Следующий фрагмент показывает global-специфичную связку Cluster API. Заполните поля ресурсов провайдера, используя приведенную выше ссылку на создание кластера VMware vSphere.
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: global
namespace: cpaas-system
labels:
cluster-type: VSphere
is-global: "true"
addons.cluster.x-k8s.io/vsphere-cpi: "enabled"
annotations:
capi.cpaas.io/resource-group-version: infrastructure.cluster.x-k8s.io/v1beta1
capi.cpaas.io/resource-kind: VSphereCluster
cpaas.io/alb-address-type: ClusterAddress
cpaas.io/network-type: kube-ovn
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: VSphereCluster
name: global
---
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
name: global-kcp
namespace: cpaas-system
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: VSphereMachineTemplate
name: global-master-machine-template
kubeadmConfigSpec:
format: cloud-init
clusterConfiguration:
etcd:
local:
serverCertSANs:
- "${CONTROL_PLANE_VIP}"
- "${PLATFORM_HOST}"
Установите выходной путь для манифеста HCS global перед его рендерингом.
export GLOBAL_HCS_YAML="/root/yamls/new-global.yaml"
Манифест HCS global должен содержать следующие ресурсы в namespace cpaas-system:
Используйте поля ресурсов HCS из Создание кластеров в Huawei Cloud Stack и Ресурсы инфраструктуры для Huawei Cloud Stack. Для кластера global сохраните следующие дополнительные требования:
- Установите
Cluster.metadata.name и HCSCluster.metadata.name в global (инфраструктурный кластер разделяет имя CAPI Cluster). Префикс global- должен использоваться для каждого другого ресурса CAPI и ресурса провайдера; фрагмент связки ниже использует KubeadmControlPlane.metadata.name: global-kcp.
- Добавьте
Cluster.metadata.labels.is-global: "true" и Cluster.metadata.labels.cluster-type: HCS.
- Добавьте
Cluster.metadata.annotations["cpaas.io/registry-address"] со значением ${NODE_REGISTRY_ADDRESS}.
- Установите
KubeadmControlPlane.spec.kubeadmConfigSpec.format: cloud-init или оставьте поле пустым, так как cloud-init является значением по умолчанию для HCS.
- Сохраните в release manifest нешифруемые kubeadm-файлы, патчи kubelet, policy audit и записи installer RBAC.
- Для обычного не-DR развертывания не добавляйте
/etc/kubernetes/encryption-provider.conf в KubeadmControlPlane.spec.kubeadmConfigSpec.files.
- Оставьте
/var/cpaas как состояние платформы. Объявляйте его в HCSMachineConfigPool.spec.configs[].persistentDisks[], когда он должен переживать замену узла; не полагайтесь на HCSMachineTemplate.spec.template.spec.dataVolumes[] как на сохраняемое состояние.
- Используйте высокодоступную управляющую плоскость для кластера
global. HCS-кластеры с одной управляющей плоскостью являются топологиями только для создания и не являются рекомендуемым путем upgrade для global.
Область фрагмента
Следующий YAML является дифференциальным фрагментом, а не полным манифестом, который можно применить напрямую. Сначала объедините эти изменения, специфичные для global, с манифестом, который вы подготовите на основе ссылок HCS create-cluster, а затем примените полный файл манифеста.
Следующий фрагмент показывает global-специфичную связку Cluster API. Заполните поля ресурсов провайдера, используя приведенные выше ссылки на создание кластера HCS.
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: global
namespace: cpaas-system
labels:
cluster-type: HCS
is-global: "true"
annotations:
capi.cpaas.io/resource-group-version: infrastructure.cluster.x-k8s.io/v1beta1
capi.cpaas.io/resource-kind: HCSCluster
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: HCSCluster
name: global
---
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
name: global-kcp
namespace: cpaas-system
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: HCSMachineTemplate
name: global-master-machine-template
kubeadmConfigSpec:
format: cloud-init
clusterConfiguration:
etcd:
local:
serverCertSANs:
- "${CONTROL_PLANE_VIP}"
- "${PLATFORM_HOST}"
Статус: запланировано
Требования к манифесту bare-metal для кластера global в Immutable Infrastructure запланированы.
Шаг 5 — Применение манифеста global
Примените provider-specific манифест к minialauda.
kubectl apply -f "${GLOBAL_DCS_YAML}"
kubectl apply -f "${GLOBAL_VSPHERE_YAML}"
kubectl apply -f "${GLOBAL_HCS_YAML}"
Статус: запланировано
Шаги применения bare-metal для кластера global в Immutable Infrastructure запланированы.
Шаг 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 только тогда, когда нужно импортировать дополнительные ресурсы сверх встроенной миграции ресурсов провайдера.
Не создавайте ConfigMap dcs-import-extra-resources для пути установки DCS по умолчанию. Ресурсы провайдера DCS мигрируются встроенным потоком.
Создайте и примените import ConfigMap VMware vSphere перед запуском installer. Этот ConfigMap требуется как для обычных, так и для disaster recovery установок global. Secret global-vsphere-credentials хранит имя пользователя и пароль vCenter и должен иметь то же имя Secret, на которое ссылается VSphereCluster.spec.identityRef.name в манифесте VMware vSphere global.
mkdir -p /root/yamls
cat > /root/yamls/dcs-import-extra-resources.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: dcs-import-extra-resources
namespace: cpaas-system
data:
resources.yaml: |
resources:
- resource: "vsphereclusters.infrastructure.cluster.x-k8s.io"
names: ["global"]
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/vsphereclusters/cpaas-system/"
method: etcdctl
- resource: "vspheremachinetemplates.infrastructure.cluster.x-k8s.io"
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/vspheremachinetemplates/cpaas-system/"
method: etcdctl
- resource: "vspheremachines.infrastructure.cluster.x-k8s.io"
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/vspheremachines/cpaas-system/"
method: etcdctl
- resource: "vspherevms.infrastructure.cluster.x-k8s.io"
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/vspherevms/cpaas-system/"
method: etcdctl
- resource: "vspheremachineconfigpools.infrastructure.cluster.x-k8s.io"
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/vspheremachineconfigpools/cpaas-system/"
method: etcdctl
- resource: "secrets"
names: ["global-vsphere-credentials"]
method: kubectl
EOF
kubectl apply -f /root/yamls/dcs-import-extra-resources.yaml
Создайте и примените import ConfigMap HCS перед запуском installer. Этот ConfigMap требуется как для обычных, так и для disaster recovery установок global. Установите HCS_SECRET_NAME в то же имя Secret, которое используется HCSCluster.spec.identityRef.name.
mkdir -p /root/yamls
cat > /root/yamls/dcs-import-extra-resources.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: dcs-import-extra-resources
namespace: cpaas-system
data:
resources.yaml: |
resources:
- resource: "secrets"
names: ["${HCS_SECRET_NAME}"]
method: kubectl
- resource: "hcsclusters.infrastructure.cluster.x-k8s.io"
names: ["global"]
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/hcsclusters/cpaas-system/"
method: etcdctl
- resource: "hcsmachinetemplates.infrastructure.cluster.x-k8s.io"
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/hcsmachinetemplates/cpaas-system/"
method: etcdctl
- resource: "hcsmachineconfigpools.infrastructure.cluster.x-k8s.io"
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/hcsmachineconfigpools/cpaas-system/"
method: etcdctl
- resource: "hcsmachines.infrastructure.cluster.x-k8s.io"
etcdKeyBase: "/registry/infrastructure.cluster.x-k8s.io/hcsmachines/cpaas-system/"
method: etcdctl
EOF
kubectl apply -f /root/yamls/dcs-import-extra-resources.yaml
Статус: запланировано
Импорт ресурсов провайдера bare-metal для кластера global в Immutable Infrastructure запланирован.
Шаг 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, но их тела запросов различаются.
Запрос 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 для адреса доступа к платформе.
VMware vSphere использует тот же путь endpoint installer, что и DCS, но его тело запроса не включает cluster.features.ha. Endpoint управляющей плоскости объявляется в VSphereCluster.spec.controlPlaneEndpoint.host, а cluster CIDR объявляются в манифесте VMware vSphere Cluster.
mkdir -p /root/yamls
export INSTALLER_CONFIG_JSON="/root/yamls/installer-config-vsphere.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": [],
"globalHost": "${PLATFORM_HOST}",
"httpPort": 80,
"httpsPort": 443,
"cert": {
"selfSigned": {}
}
},
"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 пустым списком, потому что endpoint управляющей плоскости VMware vSphere уже задан в манифесте global. Не используйте domain платформы в console.host; используйте console.globalHost для адреса доступа к платформе.
HCS использует тот же путь endpoint installer, что и DCS, но его тело запроса не включает cluster.features.ha. VIP управляющей плоскости принадлежит HCS ELB, объявленному в HCSCluster.spec.controlPlaneLoadBalancer, поэтому console.host должен оставаться пустым списком.
mkdir -p /root/yamls
export INSTALLER_CONFIG_JSON="/root/yamls/installer-config-hcs.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": [],
"globalHost": "${PLATFORM_HOST}",
"httpPort": 80,
"httpsPort": 443,
"cert": {
"selfSigned": {}
}
},
"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}"
Статус: запланировано
Детали запроса installer для bare-metal кластера global в Immutable Infrastructure запланированы.
Сертификаты консоли от стороннего CA
В примерах используется самоподписанный сертификат консоли. Если среда требует сертификат от стороннего CA, замените console.cert блоком thirdParty, который содержит полную цепочку сертификатов в base64, закрытый ключ и необязательные значения PKCS#12 перед отправкой запроса installer.
Шаг 9 — Мониторинг установки
После того как installer примет запрос, установка проходит через несколько фаз, которые можно наблюдать с KIND host. Типичный кластер global на неизменяемой ОС устанавливается за 30–60 минут; общее время зависит от скорости provisioning IaaS, времени загрузки образов и количества выбранных plugins.
Фазы, которые вы увидите
Сигналы во время установки
Наблюдайте за 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
Частые зависания и где искать
Проблемы, не перечисленные здесь, обычно указывают на причины, зависящие от среды. Соберите 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
Создайте 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.
Ссылка на Secret encryption для VSphereCluster не требуется. Для VMware vSphere сохраните эту запись файла в KubeadmControlPlane.spec.kubeadmConfigSpec.files в обеих средах установки — primary и standby. Содержимое /etc/kubernetes/encryption-provider.conf, отрендеренное в обеих средах, должно быть идентичным, включая порядок providers, имя ключа и base64-значение ключа. Также создайте ConfigMap VMware vSphere dcs-import-extra-resources из Шага 7 в обеих средах установки, чтобы installer импортировал ресурсы инфраструктуры vSphere и Secret global-vsphere-credentials.
- 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: ${ENCRYPTION_PROVIDER_SECRET_B64}
Сохраняйте один и тот же список DR serverCertSANs в обеих средах установки — primary и standby.
Ссылка на Secret encryption для HCSCluster не требуется. Для HCS добавьте эту запись файла в KubeadmControlPlane.spec.kubeadmConfigSpec.files в обеих средах установки — primary и standby. Содержимое /etc/kubernetes/encryption-provider.conf, отрендеренное в обеих средах, должно быть идентичным, включая порядок providers, имя ключа и base64-значение ключа.
- 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: ${ENCRYPTION_PROVIDER_SECRET_B64}
Сохраняйте один и тот же список DR serverCertSANs в обеих средах установки — primary и standby.
Создайте ConfigMap HCS dcs-import-extra-resources из Шага 7 в обеих средах установки. Установите HCS_SECRET_NAME в то же имя Secret, которое используется HCSCluster.spec.identityRef.name.
Статус: запланировано
Настройки disaster recovery для bare-metal кластера global в Immutable Infrastructure запланированы.
Установка primary и standby кластеров
Выполните Шаги 1–9 для обоих кластеров global — primary и standby.
Используйте различия в конфигурации installer для каждого провайдера на обеих сторонах:
Для 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 сообщает, что базовый модуль находится в здоровом состоянии.
Следующие шаги