安装 global 集群
本文档介绍如何将 global 集群安装到 Immutable Infrastructure 上。global 集群是平台控制平面,并通过 Cluster API 进行部署。当平台控制平面必须运行在不可变操作系统(例如 Alauda OS)上时,请使用此路径。
何时使用此路径
当满足以下所有条件时,选择此安装路径:
- 希望
global 集群运行在不可变操作系统上。当前支持的镜像是 Alauda OS。
- 你的基础设施属于本文档所支持的提供商之一:Huawei DCS、VMware vSphere 或 Huawei Cloud Stack。
global 集群的裸金属支持计划中。
- 你可以运行一个临时的 KIND 主机,并且该主机可以访问目标 IaaS 平台的网络。
对于 Ubuntu 或 RHEL 等传统操作系统,请改用 标准安装路径。
通用前提条件
以下前提条件适用于所有提供商:
- 一个满足最低硬件和网络要求的 KIND 主机。有关规格建议,请参见 概述。
- 来自 Customer Portal 的 Core Package。
- Alauda Container Platform Kubeadm Provider 包。
- 目标平台对应的基础设施提供商包。
- KIND 主机与目标 IaaS 平台 API 端点之间的网络可达性。
global 控制平面和 worker 节点的 IP 与主机名规划。请参见 基础设施资源,了解各提供商使用的资源模型。
global 集群的稳定 Kubernetes API 端点,例如 VIP 或负载均衡器地址。
- 平台访问地址、registry 地址,以及 Pod 和 Service CIDR 范围。
- 对于使用 ACP 提供的 Alauda OS 镜像的 x86_64 节点,底层 CPU 必须支持
x86-64-v2 ISA 基线。请参见 OS 支持矩阵。
命名规范(必需)
此规则适用于此安装路径支持的所有基础设施提供商——Huawei DCS、Huawei Cloud Stack、VMware vSphere,以及未来添加的任何提供商。你在第 4 步中编写的每个 manifest 都必须遵守该规则。资源命名错误有两种不同的失败模式,下面分别说明;一种会破坏初始部署,另一种只会在灾难恢复期间暴露。
- CAPI
Cluster 以及提供商的基础设施集群资源(例如 Huawei DCS 的 DCSCluster,或 Huawei Cloud Stack 的 HCSCluster;每个提供商都有各自对应的资源)必须精确命名为 global。cpaas-installer 会按字面名称进行查找,而且只有当基础设施集群命名为 global 时,Huawei Cloud Stack 提供商才会分配 global ELB 监听端口(注册表和控制台使用 11443,DR etcd-sync 使用 2379,Web 访问使用 443)。使用其他名称会静默破坏 registry 拉取、DR etcd-sync 和 Web 控制台。
- 其他所有 CAPI 资源(
KubeadmControlPlane、KubeadmConfigTemplate、MachineDeployment)以及其他所有提供商基础设施资源(机器模板、IP/主机名池、机器配置池,以及任何其他按提供商区分的资源)必须使用带有 global- 前缀的名称。DR(故障切换)机制会使用该前缀来识别属于 global 集群的资源。没有 global- 前缀的 global 集群资源对 DR 不可见,并会在故障切换时导致待机集群的机器被删除——集群会正常部署并运行,但在首次执行 DR 时会丢失节点。这是硬性要求,不是风格约定。
Cluster.spec.controlPlaneRef.name 以及任何其他交叉引用都必须与带前缀的名称完全一致。
兼容性与版本输入
在安装前,请记录交付包支持的版本集:
操作步骤
第 1 步 — 准备通用变量
在 KIND 主机上设置通用变量。
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.
从 KIND 主机推送包时使用 LOCAL_REGISTRY_ADDRESS。在 AppRelease chart repository values 中使用 BOOTSTRAP_REGISTRY_ADDRESS,因为 provider Pod 会从 bootstrap KIND 网络内部读取 chart repository。在 Cluster API registry 注释中使用 NODE_REGISTRY_ADDRESS,因为已部署的 global 节点必须通过其子网内可达的地址拉取镜像。
第 2 步 — 引导 KIND 主机
运行 Core Package 提供的 bootstrap 脚本。这会在 KIND 主机上拉起一个临时管理集群 minialauda。
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 脚本会部署一个嵌入式 registry、Cluster API 控制平面以及驱动 global 集群安装的安装器组件。
第 3 步 — 上传并安装 Provider 包
将 Kubeadm provider 包和基础设施提供商包上传到本地 registry。
为何所有提供商的 cluster.type 都是 Baremetal
下方各个选项卡中的 AppRelease values 都将 global.cluster.type 设置为 Baremetal。这是一种 chart 内部分类,而不是 IaaS 提供商名称。对于 Huawei DCS、VMware vSphere 和 Huawei Cloud Stack 的 global 安装,请保持使用 Baremetal。该值用于驱动平台如何配置节点级组件;它不会用于选择基础设施提供商。
设置 provider 包路径和 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}"
为 Kubeadm provider 和 DCS provider 创建并应用 AppRelease 资源。
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
设置 provider 包路径和 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}"
为 Kubeadm provider 和 VMware vSphere provider 创建并应用 AppRelease 资源。
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
设置 provider 包路径和 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}"
为 Kubeadm provider 和 HCS provider 创建并应用 AppRelease 资源。
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
状态:计划中
Immutable Infrastructure 上 global 集群的裸金属支持计划中。
第 4 步 — 配置 provider 特定的 global Manifest
为 global 集群创建一个 provider 特定的 manifest。该 manifest 使用的 provider 资源与业务集群相同,但还必须包含平台控制平面所需的 global 特定标签、注解、registry 值、与安装器兼容的 kubeadm 设置以及持久数据路径。
请使用 provider 创建指南作为详细的资源参考:
将 通用前提条件中的命名规范 应用于你在下方编写的 manifest 中的每个资源。
将 KubeadmControlPlane.spec.kubeadmConfigSpec.format 设置为目标提供商接受的值。provider controller 会强制执行此要求:
在渲染之前,为 DCS global manifest 设置输出路径。
export GLOBAL_DCS_YAML="/root/yamls/new-global.yaml"
DCS global manifest 必须在 cpaas-system 命名空间中包含以下资源:
使用 在 Huawei DCS 上创建集群 和 Huawei DCS 的基础设施资源 中的 DCS 资源字段。对于 global 集群,请保留以下附加要求:
- 将
Cluster.metadata.name 和 DCSCluster.metadata.name 设置为 global(基础设施集群与 CAPI Cluster 共用同一个名称)。为其他所有 CAPI 资源和 provider 资源添加 global- 前缀;下方的 wiring 片段使用 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}。
- 为 Alauda OS 设置
KubeadmControlPlane.spec.kubeadmConfigSpec.format: ignition。
- 保留发布 manifest 中非加密的 kubeadm 文件、kubelet patch、audit policy 和 installer RBAC 条目。
- 对于普通的非 DR 部署,不要设置
DCSCluster.spec.encryptionProviderConfigRef,也不要在 KubeadmControlPlane.spec.kubeadmConfigSpec.files 中添加 /etc/kubernetes/encryption-provider.conf。
- 保持
/var/cpaas 作为平台状态。如果需要磁盘在滚动替换后继续保留,请将其声明在 DCSIpHostnamePool.spec.pool[].persistentDisk 中;不要依赖 DCSMachineTemplate 模板磁盘作为持久状态。
- 除非你已验证所选 datastore cluster 能够在可运行目标 VM 的主机上放置卷,否则请为 DCS 本地存储使用具体的
datastoreName 值。
片段范围
以下 YAML 是差异片段,不是可以直接应用的完整 manifest。请将这些 global 特定变更合并到你根据 DCS create-cluster 参考准备的 manifest 中,然后再应用完整 manifest 文件。
下方片段展示了 global 特定的 Cluster API wiring。请使用上面的 DCS create-cluster 参考来填充 provider 资源字段。
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 manifest 设置输出路径。
export GLOBAL_VSPHERE_YAML="/root/yamls/new-global.yaml"
VMware vSphere global manifest 必须在 cpaas-system 命名空间中包含以下资源:
请使用 为 VMware vSphere 集群准备参数 来准备 vSphere 输入值。请使用 在 global 集群中创建 VMware vSphere 集群 和 VMware vSphere Provider 作为基础参考来准备 global 集群 manifest。create-cluster 指南是为从 global 集群创建的业务集群编写的,但在应用以下附加要求后,该指南中的大多数 vSphere YAML 都可以复用于 global 集群:
- 将
Cluster.metadata.name 和 VSphereCluster.metadata.name 设置为 global(基础设施集群与 CAPI Cluster 共用同一个名称)。为其他所有 CAPI 资源和 provider 资源添加 global- 前缀;下方的 wiring 片段使用 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}。
- 保留平台 controller 所需的 VMware vSphere 注解,包括 VMware vSphere create-cluster 指南中的网络和 CPI 注解。
- 将
VSphereMachineTemplate.spec.template.spec.folder 设置为 /<datacenter>/vm/global,以便运维人员可以在 vCenter 中识别 global 集群的 VM。在 DR 部署中,分别为主集群和待机集群使用不同的子 folder,例如 /<datacenter>/vm/global/primary 和 /<datacenter>/vm/global/standby。
- 将
VSphereCluster.spec.identityRef.name 设置为 global-vsphere-credentials。此固定 Secret 名称仅适用于 VMware vSphere global 安装路径;非 global 的 VMware vSphere 集群应遵循通用 create-cluster 指南。
- 将
KubeadmControlPlane.spec.kubeadmConfigSpec.format 设置为 cloud-init,或者保持该字段为空,因为 VMware vSphere 的默认值就是 cloud-init。
- 保留发布 manifest 中的 kubeadm 文件,包括 VMware vSphere 的
/etc/kubernetes/encryption-provider.conf 文件条目、kubelet patch、audit policy 和 installer RBAC 条目。VMware vSphere 通过 KubeadmControlPlane.spec.kubeadmConfigSpec.files 提供该文件;不要遵循 DCS 的 DCSCluster.spec.encryptionProviderConfigRef 模式。
片段范围
以下 YAML 是差异片段,不是可以直接应用的完整 manifest。请将这些 global 特定变更合并到你根据 VMware vSphere create-cluster 指南准备的 manifest 中,然后再应用完整 manifest 文件。
下方片段展示了 global 特定的 Cluster API wiring。请使用上面的 VMware vSphere create-cluster 参考来填充 provider 资源字段。
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 manifest 设置输出路径。
export GLOBAL_HCS_YAML="/root/yamls/new-global.yaml"
HCS global manifest 必须在 cpaas-system 命名空间中包含以下资源:
使用 在 Huawei Cloud Stack 上创建集群 和 Huawei Cloud Stack 的基础设施资源 中的 HCS 资源字段。对于 global 集群,请保留以下附加要求:
- 将
Cluster.metadata.name 和 HCSCluster.metadata.name 设置为 global(基础设施集群与 CAPI Cluster 共用同一个名称)。为其他所有 CAPI 资源和 provider 资源添加 global- 前缀;下方的 wiring 片段使用 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,或者保持该字段为空,因为 HCS 的默认值就是 cloud-init。
- 保留发布 manifest 中非加密的 kubeadm 文件、kubelet patch、audit policy 和 installer RBAC 条目。
- 对于普通的非 DR 部署,不要在
KubeadmControlPlane.spec.kubeadmConfigSpec.files 中添加 /etc/kubernetes/encryption-provider.conf。
- 保持
/var/cpaas 作为平台状态。如果它必须在节点替换后继续保留,请将其声明在 HCSMachineConfigPool.spec.configs[].persistentDisks[] 中;不要依赖 HCSMachineTemplate.spec.template.spec.dataVolumes[] 作为持久状态。
global 集群应使用高可用控制平面。单控制平面 HCS 集群仅适用于创建时拓扑,不是推荐的 global 升级路径。
片段范围
以下 YAML 是差异片段,不是可以直接应用的完整 manifest。请将这些 global 特定变更合并到你根据 HCS create-cluster 参考准备的 manifest 中,然后再应用完整 manifest 文件。
下方片段展示了 global 特定的 Cluster API wiring。请使用上面的 HCS create-cluster 参考来填充 provider 资源字段。
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}"
状态:计划中
Immutable Infrastructure 上 global 集群的裸金属 manifest 要求计划中。
第 5 步 — 应用 global Manifest
将 provider 特定的 manifest 应用到 minialauda。
kubectl apply -f "${GLOBAL_DCS_YAML}"
kubectl apply -f "${GLOBAL_VSPHERE_YAML}"
kubectl apply -f "${GLOBAL_HCS_YAML}"
状态:计划中
Immutable Infrastructure 上 global 集群的裸金属应用步骤计划中。
第 6 步 — 等待控制平面
等待 Cluster API provider 部署虚拟机并拉起 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 步 — 导入 Provider 资源
在触发安装器之前,对于需要额外资源导入的 provider,请在 cpaas-system 命名空间中创建 dcs-import-extra-resources ConfigMap。即使 provider 不是 Huawei DCS,ConfigMap 名称仍保留 dcs 前缀,以兼容历史安装器。
VMware vSphere 和 Huawei Cloud Stack 在正常和灾难恢复的 global 安装中都需要此 ConfigMap。Huawei DCS 的默认安装不需要它,因为 DCS provider 资源会通过内置流程迁移;只有当你需要导入内置 provider 资源迁移之外的额外资源时,才为 DCS 创建它。
对于默认的 DCS 安装路径,不要创建 DCS dcs-import-extra-resources ConfigMap。DCS provider 资源会通过内置流程迁移。
在触发安装器之前,创建并应用 VMware vSphere import ConfigMap。此 ConfigMap 对正常和灾难恢复的 global 安装都必需。global-vsphere-credentials Secret 存储 vCenter 用户名和密码,且其名称必须与 VMware vSphere global manifest 中 VSphereCluster.spec.identityRef.name 引用的 Secret 名称一致。
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
在触发安装器之前,创建并应用 HCS import ConfigMap。此 ConfigMap 对正常和灾难恢复的 global 安装都必需。将 HCS_SECRET_NAME 设置为与 HCSCluster.spec.identityRef.name 相同的 Secret 名称。
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
状态:计划中
Immutable Infrastructure 上 global 集群的裸金属 provider 资源导入计划中。
第 8 步 — 触发平台安装
向嵌入式安装器 REST API 提交平台安装请求。安装器会将 Cluster API 资源导入到新的 global 集群中,部署基础 operator,并安装所选插件。
export INSTALLER_IP=$(kubectl get pods -n cpaas-system -l service_name=cpaas-installer \
-o jsonpath='{.items[0].status.podIP}')
网络范围
INSTALLER_IP 是 minialauda 中嵌入式安装器的 Pod IP。该端点仅在安装期间使用。
在当前 KIND 主机上创建 provider 特定的安装器配置 JSON 文件,然后将其提交到安装器端点。DCS、VMware vSphere 和 HCS 使用相同的端点路径,但请求体不同。
DCS 安装器请求包含外部 HA VIP,因为 DCS 使用第三方控制平面 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。不要在 console.host 中使用平台域名;平台访问地址请使用 console.globalHost。
VMware vSphere 使用与 DCS 相同的安装器端点路径,但其请求体不包含 cluster.features.ha。控制平面端点在 VSphereCluster.spec.controlPlaneEndpoint.host 中声明,而 cluster CIDR 在 VMware vSphere Cluster manifest 中声明。
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 保持为空列表,因为 VMware vSphere 控制平面端点已经在 global manifest 中设置。不要在 console.host 中使用平台域名;平台访问地址请使用 console.globalHost。
HCS 使用与 DCS 相同的安装器端点路径,但其请求体不包含 cluster.features.ha。控制平面 VIP 由 HCSCluster.spec.controlPlaneLoadBalancer 中声明的 HCS ELB 管理,因此 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}"
状态:计划中
Immutable Infrastructure 上 global 集群的裸金属安装器请求细节计划中。
第三方控制台证书
示例使用自签名控制台证书。如果环境要求第三方证书,请在提交安装器请求之前,将 console.cert 替换为一个 thirdParty 块,其中包含 base64 编码的完整证书链、私钥以及可选的 PKCS#12 值。
第 9 步 — 监控安装过程
安装器接受请求后,安装会经过多个阶段,并且可以从 KIND 主机上观察到。典型的不可变操作系统 global 集群需要 30–60 分钟;总耗时取决于 IaaS 部署速度、镜像拉取时间以及所选插件数量。
你将观察到的阶段
安装期间的信号
请同时关注安装器进度 API 和安装器日志。如果其中一个看起来停滞,请直接在 bootstrap KIND 主机上检查底层 Cluster API 资源。
# 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
安装器日志会记录每一次阶段切换。瞬时错误会以短间隔重试;持续错误会一直显示在日志中,并在进度 API 中体现为停滞阶段。
当安装器报告成功后,检查 global 集群。
kubectl --kubeconfig <global-kubeconfig> get nodes
kubectl --kubeconfig <global-kubeconfig> get pods -n cpaas-system
kubectl --kubeconfig <global-kubeconfig> get clustermodule global
常见卡住情况及排查位置
这里未列出的其他问题通常指向环境特定原因。请收集安装器日志、进度 API 响应以及相关的 kubectl describe 输出,然后上报。
可选的灾难恢复部署
当你为灾难恢复部署主集群和待机 global 集群时,使用本节内容。在为每个 global 集群应用 provider 特定 manifest 之前,先完成这些补充项。
主集群和待机集群必须使用相同的 encryption provider 配置。对于 DCS 和 HCS,正常的非 DR 部署不会在 KubeadmControlPlane.spec.kubeadmConfigSpec.files 中添加 /etc/kubernetes/encryption-provider.conf;对于 DCS,正常的非 DR 部署也不会设置 DCSCluster.spec.encryptionProviderConfigRef。VMware vSphere 会保留发布 manifest 中的 /etc/kubernetes/encryption-provider.conf 文件条目。
准备共享 DR 变量
在主集群和待机集群的安装环境上设置相同的加密密钥值。
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
为 KubeadmControlPlane 添加 DR 证书 SAN
在第 4 步生成的 manifest 中,将主集群和待机集群的控制平面 VIP 以及平台访问地址都包含到 KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.serverCertSANs 中。主集群和待机集群的安装环境都应使用相同的 SAN 列表。
serverCertSANs:
- "${PRIMARY_CLUSTER_VIP}"
- "${STANDBY_CLUSTER_VIP}"
- "${PLATFORM_HOST}"
添加 provider 特定的 DR 字段
在 minialauda 中创建 encryption provider Secret。
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 配置。对于 DCS DR 路径,不要在 KubeadmControlPlane.spec.kubeadmConfigSpec.files 中添加 /etc/kubernetes/encryption-provider.conf。
如果你创建了 dcs-import-extra-resources,请在主集群和待机集群的安装环境上都保留该 ConfigMap。
不需要 VSphereCluster encryption Secret 引用。对于 VMware vSphere,请在主集群和待机集群的安装环境上都保留 KubeadmControlPlane.spec.kubeadmConfigSpec.files 中的该文件条目。渲染后的 /etc/kubernetes/encryption-provider.conf 内容在两侧必须完全一致,包括 provider 顺序、key 名称以及 base64 key 值。同时,在两个安装环境上都创建第 7 步中的 VMware vSphere dcs-import-extra-resources ConfigMap,以便安装器导入 vSphere 基础设施资源和 global-vsphere-credentials Secret。
- 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 列表。
不需要 HCSCluster encryption Secret 引用。对于 HCS,请在主集群和待机集群的安装环境上都将该文件条目追加到 KubeadmControlPlane.spec.kubeadmConfigSpec.files 中。渲染后的 /etc/kubernetes/encryption-provider.conf 内容在两侧必须完全一致,包括 provider 顺序、key 名称以及 base64 key 值。
- 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 列表。
在两个安装环境上都创建第 7 步中的 HCS dcs-import-extra-resources ConfigMap。将 HCS_SECRET_NAME 设置为与 HCSCluster.spec.identityRef.name 使用的 Secret 名称一致。
状态:计划中
Immutable Infrastructure 上 global 集群的裸金属灾难恢复设置计划中。
安装主集群和待机集群
为主集群和待机 global 集群都执行第 1 步到第 9 步。
两侧都要使用 provider 特定的安装器配置差异:
对于主集群,请确保平台域名解析到主集群 HA VIP。在第 8 步中,将 hostIP 设置为主 KIND 节点 IP。对于 DCS,将 console.host 和 cluster.features.ha.vip 设置为主集群 HA VIP。对于 VMware vSphere,将主 manifest 中的控制平面端点设置为主集群 HA VIP。对于 HCS,保持 console.host: [],因为 VIP 由 HCS ELB 管理。
在主集群安装成功后,根据 DR 流程要求,将平台域名切换到待机集群 HA VIP。然后安装待机集群。在待机 KIND 主机上的第 8 步中,将 hostIP 设置为待机 KIND 节点 IP。对于 DCS,将 console.host 和 cluster.features.ha.vip 设置为待机集群 HA VIP。对于 VMware vSphere,将待机 manifest 中的控制平面端点设置为待机集群 HA VIP。对于 HCS,保持 console.host: []。INSTALLER_IP 请从待机 KIND 主机上的 cpaas-installer Pod 获取;不要复用主 KIND 主机的值。
在两个集群都安装完成后,在主控制平面节点上获取主集群的 k8sadmin 令牌。etcd-sync 仅安装在待机集群上,其 active_cluster_* 值指向主集群。请将该值保持为原始的 base64 Secret 形式,用于 active_cluster_token。
export PRIMARY_CLUSTER_TOKEN_B64="$(sudo kubectl get secret -n cpaas-system k8sadmin -o jsonpath='{.data.token}')"
在待机控制平面节点上获取待机集群的 k8sadmin 令牌。使用这个解码后的 bearer token 调用待机集群的 ModuleInfo API。
export STANDBY_CLUSTER_BEARER_TOKEN="$(sudo kubectl get secret -n cpaas-system k8sadmin -o jsonpath='{.data.token}' | base64 -d)"
如果你从其他主机创建 global-etcd-sync ModuleInfo payload,请将待机控制平面节点上的解码值安全传输到该主机并在那里导出。
export STANDBY_CLUSTER_BEARER_TOKEN="<decoded-standby-token>"
为待机集群创建 global-etcd-sync ModuleInfo payload。active_cluster_vip 和 active_cluster_token 的值必须指向主集群。
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
通过调用待机集群上的 ModuleInfo API 来安装 global-etcd-sync。
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}"
重启必须重新加载 DR 和端点配置的 Pod。在主控制平面节点和待机控制平面节点上执行相同命令。
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 Cluster Disaster Recovery。
验证
安装器报告完成后,请验证 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 报告
status: Success 且 type: Complete。
- 所有
global 集群节点均为 Ready。
cpaas-system 中的关键 Pod 处于 Running 或 Completed 状态。
ClusterModule/global 报告基础模块健康。
后续步骤