Huawei DCS 的基础设施资源

概述

在 Huawei DCS 上创建集群之前,需要配置基础设施资源,包括云凭证、IP 池和计算机模板。

您可以通过 Web UI 或 YAML 清单管理基础设施资源。Web UI 提供带验证功能的引导式界面,而 YAML 则支持自动化操作。

在 Huawei DCS 上,IP 池还包含必须在 VM 替换后保留的磁盘,其中包括平台所需的 /var/cpaas 磁盘。

INFO

命名空间要求 所有基础设施资源都必须部署在 cpaas-system 命名空间中,以确保与平台正确集成为业务集群。

INFO

DCS 平台概念 如果您不熟悉 DCS Cluster、DCS Host、DCS VM Folder 或 DCS VM Template 等术语,或者不清楚这些术语与 DCSCluster 和 DCSMachineTemplate 自定义资源之间的关系,请先阅读Huawei DCS 概念和术语。

云凭证

云凭证存储集群操作所需的 DCS 平台访问信息。

使用 Web UI

先决条件

创建云凭证之前,请确认满足以下 DCS 平台要求:

用户配置:

  • 用户类型:以下类型之一:
    • Interface interconnection user — 默认类型;现有行为。如果 DCS 门户中已配置互联型账户,请使用此类型。
    • Domain user — 由目录服务管理的 LDAP/AD 用户。要求 DCS 已由您的 DCS 管理员配置域身份验证,并且已在 DCS 门户中预先创建目录用户,同时按下文映射角色。
  • 角色:必须为 administrator

密码策略(仅适用于 Interface interconnection user):

导航到系统管理 → 权限管理 → 权限管理策略并确认:

  • 策略:Whether to modify the password of an interface interconnection user upon password resetting and first login
  • 值:必须设为否

如果设为 Yes,用户首次登录时将被强制修改密码,导致身份验证失败并使集群创建失败。

对于 Domain user,密码生命周期由 LDAP/AD 目录服务管理,而非由 DCS 门户策略管理。

创建云凭证

导航:集群 → 云凭证 → 创建云凭证 → 选择 Huawei DCS

表单字段:

字段类型必填说明
名称text是凭证的唯一标识符(1-63 个字符,仅限小写字母、数字和连字符)
显示名称text否便于识别的自定义描述
DCS EndpointURL是DCS 平台 API 地址(必须以 http:// 或 https:// 开头)
用户名text是DCS 平台 API 用户登录名
密码password是DCS 平台 API 用户登录密码
站点text是VM 模板所在的站点(所有资源必须位于同一站点)

验证规则:

  • 名称必须为 1-63 个字符,只能包含小写字母、数字和连字符,并且必须以字母或数字开头和结尾
  • DCS Endpoint 必须是有效 URL 格式,并以 http:// 或 https:// 开头

管理云凭证

查看凭证:导航到集群 → 云凭证,可查看所有已配置凭证的类型、创建时间和创建者。

更新凭证:点击凭证上的更新可修改显示名称。当前版本不支持更新密码(计划在未来版本中提供)。

删除凭证:点击删除以移除凭证,并在对话框中确认删除。

INFO

域用户支持:此版本仅支持 YAML

当前 Web UI 只能创建 Interface interconnection user 凭证。若要创建 Domain user 凭证,请使用下方的 CLI 操作方式,并将 userType 设为 domain。

使用 CLI

在 cpaas-system 中创建 Secret,以存储 DCS 身份验证信息。

使用编辑器编写凭证文件,而不要在 shell 提示符下直接输入值。Shell 会将整条命令(包括密码)记录在历史记录中;而使用编辑器编写文件则不会留下此类副本。

dcs-credential.env
authUser=<auth-user>
authKey=<auth-key>
endpoint=https://<dcs-api-host>:7443
site=<dcs-site-id>
userType=interconnect

限制文件权限,从文件创建 Secret,然后删除该文件:

chmod 600 dcs-credential.env

DCS_SECRET_NAME="<auth-secret-name>"

kubectl create secret generic "${DCS_SECRET_NAME}" \
  --namespace cpaas-system \
  --from-env-file=dcs-credential.env

rm -f dcs-credential.env

以纯文本形式填写值 — kubectl 会在创建 Secret 时对其进行 base64 编码,因此无需单独执行编码步骤。每行的格式为 key=value。不要给值加引号:kubectl 会将引号字符视为实际内容,因此 authKey="s3cret" 会存储带引号的 "s3cret"。值中可以包含 =;每行中只有第一个 = 用于分隔键和值。

对于接口互联用户(默认类型),请省略 userType 行。对于域用户,请将其设为 domain — 请参阅凭证用户类型。

WARNING

请勿使用 kubectl apply 创建凭证 Secret。客户端应用会将所应用的清单(包括 DCS 密码)存储在 Secret 本身的 kubectl.kubernetes.io/last-applied-configuration 注解中。kubectl create 不会写入此类注解。无论值是以 stringData 形式还是 base64 data 形式编写,均适用此规则;base64 是一种编码方式,并不提供保护。

之后如需更改凭证,请对其应用补丁,而不要重新应用清单。出于同样的原因,请使用编辑器编写补丁文件:

dcs-credential-patch.yaml
stringData:
  authKey: <new-auth-key>
chmod 600 dcs-credential-patch.yaml

kubectl patch secret "${DCS_SECRET_NAME}" --namespace cpaas-system \
  --type=merge --patch-file=dcs-credential-patch.yaml

rm -f dcs-credential-patch.yaml

参数说明:

键说明
authUserDCS 平台 API 用户登录名。
authKeyDCS 平台 API 用户登录密码。
endpointDCS 平台 API 地址,包含 http 或 https 方案。注意:DCS 平台的默认 API 端口为 7443(而非常见的 8443)。如果您的环境使用自定义端口,请向管理员确认。
siteDCS 站点 ID。Provider 会从此 Secret 中读取该值,并在 DCSCluster.spec.site 字段为空时将其写入该字段,因此在此处设置即可。仅当需要为单个集群覆盖 Secret 中的值时,才显式设置 DCSCluster.spec.site。
userType可选。允许的值为 interconnect(默认值;未设置该键或其值为空时使用)或 domain。匹配时不区分大小写(Domain、DOMAIN 和 domain 都映射到同一值)。任何其他值,包括旧版 DCS 魔数 1 和 2,都会导致配置错误并被拒绝,以确保 domain 用户不会在不知情的情况下作为 interconnect 用户进行身份验证。

凭证用户类型

DCS Provider 支持两种凭证用户类型,通过可选 Secret 键 userType 进行选择:

userType 的值映射到的 DCS 用户适用场景DCS 端要求密码生命周期
interconnect(默认值;等同于未设置该键或该键为空)Interface interconnection user现有部署;如果 DCS 中已配置互联账户,这是最简单的使用方式。DCS 门户必须将策略“重置密码和首次登录时是否修改接口互联用户的密码”设为否。由 DCS 门户策略管理。
domainDomain user(LDAP/AD 用户)安全审计要求使用 LDAP/AD 管理的凭证,或部署已统一使用目录服务账户的客户。DCS 必须已由您的 DCS 管理员配置域身份验证,并且必须已在 DCS 门户中预先创建目录用户并为其分配 administrator 角色。由 LDAP/AD 目录服务管理,而非由 DCS 门户策略管理。

兼容性:不含 userType 键的现有 Secret 仍会像以前一样进行身份验证;继续使用互联型凭证无需迁移。

UI 覆盖范围:当前 Web UI 表单不提供 userType 字段。若要使用 domain 值,请通过 YAML 配置 Secret。


IP Pools

IP 池定义集群节点的网络配置(IP 地址、子网掩码、网关、DNS)。每个池可以包含多个节点条目,每个节点可以有多个网络接口配置。

对于 DCS 多 NIC 集群,每个 IP 条目可以声明 additionNic 项。这些额外 NIC 会绑定到 IP 槽位,并在 Provider 创建新 VM 时应用。更新现有池中的 additionNic 不会为已运行的 VM 热添加 NIC。

对于 DCS 持久磁盘,每个 IP 条目还可以声明 persistentDisk 项。这些磁盘绑定到 IP 槽位,而不是 VM 生命周期,因此在滚动升级期间,可以从旧 VM 分离并重新挂载到替换 VM。对于平台要求的 /var/cpaas 磁盘,以及任何必须在删除并重新创建操作后保留的其他节点本地数据,请使用此机制。此 persistentDisk 声明仅支持通过 YAML 配置。

使用 Web UI

先决条件

  • 已创建 Cloud Credential
INFO

IP Pool Web UI 仅涵盖标准 IP、主机名和网络设置,不提供 DCSIpHostnamePool.spec.pool[].persistentDisk。请通过 YAML 清单配置持久磁盘。

创建 IP Pool

导航路径:Clusters → Virtual Machine → IP Pools → Create IP Pool → Select Credential

表单结构:

IP Pool 表单由 Pools 列表组成。每个 Pool 表示一个节点,包含:

  1. Node IP(必填,每个 Pool 恰好一个)
  2. Additional NIC IPs(可选,每个 Pool 可有多个)

Node IP 字段:

字段类型必填说明
IPIP 地址是Kubernetes 节点的 IP 地址
Subnet MaskCIDR 前缀长度是网络的子网掩码,以前缀长度形式输入,例如 24
GatewayIP 地址是网关 IP 地址
DNSIP 地址否DNS 服务器地址(多个地址以分号分隔)
Hostname文本否虚拟机的主机名
Machine Name文本否DCS 平台中的虚拟机名称
dvSwitch Name下拉菜单否虚拟交换机名称(来自 DCS 平台)
Port Group Name下拉菜单否端口组名称(来自 DCS 平台)

Additional NIC IPs 字段:

字段类型必填说明
IPIP 地址是非节点 IP 地址(例如,存储网络)
Subnet MaskCIDR 前缀长度是网络的子网掩码,以前缀长度形式输入,例如 24
GatewayIP 地址是网关 IP 地址
DNSIP 地址否DNS 服务器地址(多个地址以分号分隔)
dvSwitch Name下拉菜单是虚拟交换机名称(来自 DCS 平台)
Port Group Name下拉菜单是端口组名称(来自 DCS 平台)

验证规则:

  • 同一个 IP Pool 中的 IP 地址必须唯一
  • IP 地址必须是有效的 IPv4 格式
  • 子网掩码必须以有效的 CIDR 前缀长度输入,例如 24。请勿包含 /,也不要使用点分十进制格式,例如 255.255.255.0。
  • IP 地址必须位于已配置的子网范围内
  • 网关必须是子网范围内有效的 IPv4 地址

提示:

  • 至少需要一个节点条目
  • 每个节点必须且只能配置一个 Node IP
  • 多 NIC 场景下可选配置 additionNic[] 条目,例如用于分离存储网络

管理 IP Pools

查看 Pools:导航至 Clusters → Virtual Machine → IP Pools,可查看所有已配置的池、其节点 IP 和创建时间。

更新 Pools:点击 Update,即可添加或移除节点条目并修改网络配置。

删除 Pools:点击 Delete 删除池,并在对话框中确认删除。

使用 YAML

创建 DCSIpHostnamePool 资源:

dcs-ippool.yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSIpHostnamePool
metadata:
  name: <iphostname-pool-name>
  namespace: cpaas-system
spec:
  pool:
  - ip: "<ip-1>"
    mask: "<cidr-prefix-length>"
    gateway: "<gateway>"
    dns: "<dns>"
    hostname: "<hostname-1>"
    machineName: "<machine-name-1>"
    additionNic:
    - ip: "<additional-ip-1>"
      mask: "<additional-cidr-prefix-length>"
      gateway: "<additional-gateway>"
      dns: "<additional-dns>"
      dvSwitchName: "<additional-dvs>"
      portGroupName: "<additional-port-group>"
  - ip: "<ip-2>"
    mask: "<cidr-prefix-length>"
    gateway: "<gateway>"
    dns: "<dns>"
    hostname: "<hostname-2>"
    machineName: "<machine-name-2>"
  - ip: "<ip-3>"
    mask: "<cidr-prefix-length>"
    gateway: "<gateway>"
    dns: "<dns>"
    hostname: "<hostname-3>"
    machineName: "<machine-name-3>"

参数说明:

参数类型说明必填
.spec.pool[].ipstring要创建的虚拟机的 IP 地址是
.spec.pool[].maskstringCIDR 前缀长度格式的子网掩码,不含 /,例如 24是
.spec.pool[].gatewaystring网关 IP 地址是
.spec.pool[].dnsstringDNS 服务器 IP 地址(使用 ; 分隔多个服务器)否
.spec.pool[].machineNamestringDCS 平台中的虚拟机名称否
.spec.pool[].hostnamestring虚拟机的主机名否
.spec.pool[].additionNic[][]object从此 IP 槽位创建的 VM 的额外 NIC。Provider 仅在创建新 VM 时应用这些配置。否
.spec.pool[].additionNic[].ipstring用于生成的客户机网络配置的额外 NIC IP 地址。此地址不是 Kubernetes 节点 IP。建议填写*
.spec.pool[].additionNic[].maskstringCIDR 前缀长度格式的额外 NIC 子网掩码,不含 /,例如 24。建议填写*
.spec.pool[].additionNic[].gatewaystring额外 NIC 网络的网关。设置此值前请确认路由行为。否
.spec.pool[].additionNic[].dnsstring额外 NIC 网络的 DNS 服务器 IP 地址;需要多个值时以分号分隔。否
.spec.pool[].additionNic[].dvSwitchNamestring用于解析额外 NIC 的 Port Group 的 DCS 分布式虚拟交换机。是*
.spec.pool[].additionNic[].portGroupNamestring用于连接额外 NIC 的 DCS Port Group。是*

*标记为 Yes* 的字段是 Provider 解析目标网络并连接额外 NIC 所必需的。标记为 Recommended* 的字段是生成静态客户机网络配置所需的。CRD 不会强制要求这些字段。

WARNING

您必须配置的机器信息数量大于或等于计划部署的节点数量。条目不足将导致节点无法部署。

IP Pool 中的额外 NIC

在 DCSIpHostnamePool.spec.pool[].additionNic[] 中声明额外 NIC。

当节点需要辅助网络(例如存储、管理或应用隔离网络)时,请使用此字段。除非您有意计划更改 Node IP,否则请将主要 .spec.pool[].ip 保留为 Kubernetes Node IP。

生效方式:

  • 当新的 DCSMachine 声明某个槽位时,Provider 会将 Pool 槽位中的 additionNic[] 复制到 DCSMachine.status.additionalNic。
  • Provider 克隆 DCS VM 时会添加这些 NIC。
  • 客户机 OS 会在首次启动期间通过生成的 NetworkManager 配置来配置这些接口。
  • 后续编辑 Pool 不会热更新现有 VM。

网络边界:

  • DCS Provider 不会在 DCS 平台上预留额外 NIC 的 IP 地址。应用 Pool 前请避免 IP 冲突。
  • 引用的 DVS 和 Port Group 必须已存在,且目标 DCS 主机必须能够访问它们。
  • 每个额外 NIC 都要提供 dvSwitchName 和 portGroupName。Provider 会在克隆 VM 前使用这些值解析 Port Group URN。
  • Provider 仅对 IP、掩码、网关、DNS、DVS 和 Port Group 进行建模。路由度量值、静态路由和 NIC 角色必须通过 MCP 或客户机 OS 配置处理。
  • 如果额外 NIC 配置了网关,请验证它不会意外取代主要 NIC 的默认路由。

IP Pool 中的持久磁盘

在 DCSIpHostnamePool.spec.pool[].persistentDisk 中声明升级期间保留的磁盘,而不是在 DCSMachineTemplate 中声明。

这些持久磁盘仅支持通过 YAML 声明。

  • 使用 IP 条目将每个持久磁盘绑定到固定的 (ip, slot) 标识。
  • 对平台要求的 /var/cpaas 磁盘使用此模型。
  • 将 DCSMachineTemplate 用于系统磁盘和任何可能随 VM 一同重新创建的模板本地磁盘。
  • 替换 VM 启动时,客户机磁盘设置脚本会检查是否存在现有文件系统。如果已存在,则跳过格式化并直接挂载磁盘。
  • Pool 管理的持久磁盘需要逐个替换。使用此功能时,请保留 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge = 0 和 MachineDeployment.spec.strategy.rollingUpdate.maxSurge = 0。

如果计划使用持久磁盘,请确保 DCS VM 模板为 4.2.1 或更高版本,因为安全关机和磁盘分离依赖于客户机 OS 中的客户机工具。

示例:

dcs-ippool-with-persistent-disk.yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSIpHostnamePool
metadata:
  name: <iphostname-pool-name>
  namespace: cpaas-system
spec:
  pool:
  - ip: "<ip-1>"
    mask: "<cidr-prefix-length>"
    gateway: "<gateway>"
    dns: "<dns>"
    hostname: "<hostname-1>"
    machineName: "<machine-name-1>"
    persistentDisk:
    - slot: 0
      quantityGB: 40
      datastoreClusterName: <datastore-cluster-name>
      path: /var/cpaas
      format: xfs
      mountOptions:
      - defaults

持久磁盘字段说明:

字段说明
slotIP 槽位中的磁盘位置。它决定挂载顺序、客户机设备命名,以及卷声明和重新挂载时使用的序号。
quantityGB磁盘大小,单位为 GB。
datastoreName / datastoreClusterName为持久磁盘指定且仅指定一个存储目标。
isThin可选。控制新建持久卷的 DCS 精简置备。如果省略,Provider 不会发送 isThin,DCS 将使用平台默认值。
path客户机 OS 中的挂载路径。/var/cpaas 是平台要求的路径。
format磁盘首次初始化时使用的文件系统。如果替换 VM 检测到现有文件系统,则跳过格式化。
options仅在首次格式化磁盘时应用的 mkfs 选项。
mountOptions挂载磁盘时应用的挂载选项。
pciType可选的 PCI 磁盘类型。如果省略,控制器将使用实现中的默认值。

更新规则:

  • 可以向现有 IP 槽位追加新的 persistentDisk 条目。控制器会在 DCS 端将新添加的磁盘连接到正在运行的 VM,但不会在客户机 OS 中格式化或挂载该磁盘。只有在 VM 被替换且替换 VM 在引导期间运行生成的磁盘设置后,客户机中的格式化和挂载才会生效。
  • 控制器会将新持久卷创建为独立的持久普通卷。复用现有卷时,只要求该卷为独立且持久,不要求特定的 DCS 卷类型。
  • 请勿从 spec 中删除现有的 persistentDisk 条目。Webhook 会拒绝此类删除。
  • 创建后,将 format、options 和 pciType 视为不可变。
  • 将 quantityGB 和 datastore 更改视为可能影响滚动更新的更改。当池带有集群标签时,Webhook 会尽力进行平台验证。isThin 仅在创建时生效:更改它不会验证、协调或转换现有卷,只会影响之后创建的持久卷。
  • 将 path 和 mountOptions 的更改视为客户机端更改,并在滚动更新期间通过替换机器生效。

DCS 平台容量与放置

在编写 DCSMachineTemplate 资源之前,请确认目标 DCS 站点、datastore 和计算集群有足够的可用容量来承载计划中的 VM,并确认 DCS 侧调度策略能够将新 VM 放置到可用主机上。跳过这些检查是 VM 卡在 creating 状态且 DCS API 未返回任何错误的最常见原因。

运行诊断片段

以下容量和放置检查使用只读 DCS REST 调用。运行任何片段之前,请在 shell 中设置以下环境变量:

变量含义获取方式
DCS_BASEDCS REST API 基础 URL,包含协议和端口。DCS REST API 发布在端口 7443 上(与 8443 Web 门户分开)。向 DCS 平台管理员询问 API 端点。相同的值存储在云凭证 Secret 的 endpoint 键下。
SITEDCS 站点 ID(大写字母数字,例如 EC1C108C)。存储在云凭证 Secret 的 site 键下,也可通过 DCSCluster.spec.site 查看。
TOKEN由 POST /service/session 返回的短期 X-Auth-Token。令牌在空闲约 30 分钟后失效。运行下方的会话命令。DCS 用户名和密钥存储在云凭证 Secret 的 authUser 和 authKey 下。

在诊断会话开始时设置这三个变量:

# Replace the placeholders with values appropriate for your environment.
export DCS_BASE='https://<dcs-api-host>:7443'
export SITE='<site-id>'

# Read the user and key from the cloud-credential Secret without printing them.
DCS_USER="$(kubectl -n cpaas-system get secret <credential-secret-name> -o jsonpath='{.data.authUser}' | base64 -d)"
DCS_KEY="$(kubectl -n cpaas-system get secret <credential-secret-name> -o jsonpath='{.data.authKey}' | base64 -d)"

# Acquire a session token. The response header X-AUTH-TOKEN carries the value used by subsequent calls.
HEADERS="$(mktemp)"
curl -k -sS -D "$HEADERS" -o /dev/null -X POST "${DCS_BASE}/service/session" \
  -H "X-Auth-User: $DCS_USER" \
  -H "X-Auth-Key: $DCS_KEY" \
  -H 'X-ENCRYPT-ALGORITHM: 1' \
  -H 'X-Auth-UserType: 2' \
  -H 'version: 8.1'
export TOKEN="$(grep -i '^X-AUTH-TOKEN:' "$HEADERS" | tail -n1 | cut -d' ' -f2- | tr -d '\r\n ')"
rm -f "$HEADERS"
unset DCS_USER DCS_KEY
WARNING

令牌处理 请勿将令牌记录到文件或 shell 历史记录中。会话令牌拥有与底层 DCS 用户相同的权限,该用户通常是管理员。

在本页后续的每个诊断片段中复用 $DCS_BASE、$SITE 和 $TOKEN。当 API 开始返回 errorCode: 10000002(会话已过期或尚未登录)时,重新运行 POST /service/session 命令以刷新令牌。

选择 datastore

每个 DCSMachineDiskSpec 条目都会通过两个互斥字段之一将磁盘绑定到 DCS datastore:

  • datastoreName — 将磁盘固定到特定 datastore。即使相邻的 datastore 有可用空间,DCS 调度器也不会检查它们。这是最严格的绑定方式。
  • datastoreClusterName — 将磁盘固定到 datastore 集群(DCS 侧的一组 datastore)。DCS 调度器会从该集群中选择一个满足容量要求的特定 datastore。如果平台提供 datastore 集群,这是更安全的默认选项。

只要 DCS 管理员配置了 datastore 集群,就优先使用 datastoreClusterName,这样即使某个 datastore 即将用满,只要相邻 datastore 仍有可用空间,也不会阻塞部署。

容量预检:

应用新的 DCSMachineTemplate 之前,请列出已有的 DCS datastore,并确认目标 datastore 有足够的可用容量来满足 system disk + ∑(spec disk size) × replica count 的最坏情况需求。在可访问 DCS API 的环境中,只读列表查询如下所示:

curl -k -sS "${DCS_BASE}/service/sites/${SITE}/datastores" \
  -H "X-Auth-Token: ${TOKEN}" -H 'version: 8.1' \
  | python3 -c "
import json,sys
for ds in json.load(sys.stdin).get('datastores',[]) or []:
  print(f\"{ds.get('name','?'):24} cap={ds.get('capacityGB','?')}GB used={ds.get('usedSizeGB','?')}GB free={ds.get('freeSizeGB','?')}GB state={ds.get('status','?')}\")"

每对 DCSMachineTemplate 控制平面节点和工作节点通常需要系统磁盘(模板默认值,通常约为 80 GB)以及 spec 中声明的显式数据磁盘,因此单个带有 etcd 10G + kubelet 100G + containerd 100G + /var/cpaas 100G 的控制平面节点在计入模板的系统磁盘之前,大约会占用 390 GB。当 datastore 的使用率超过约 70% 时,这是应选择其他 datastore 的明确信号——即使绝对可用空间看起来很多,碎片和预留空间也可能导致新 VM 放置停滞。

主机放置和高可用性

DCS 平台上的主机放置由 DCS 调度器执行。DCS Provider 不提供通过 DCSMachineTemplate 将虚拟机固定到特定 DCS 主机的方式。因此,从同一模板克隆的虚拟机可能会落在同一台物理主机上。

由此会产生两个影响:

  • 容量热点:如果 DCS 集群的主机负载不均(例如,一台主机的 CPU 超额分配严重,而另一台主机大部分处于空闲状态),DCS 调度器可能会拒绝在超额分配的主机上放置新 VM。部署任务可能会停滞,直到 DCS 侧重新平衡负载或启用 DRS。使用下方片段确认主机负载是否为原因。
  • 控制平面分散取决于 DRS:机器模板不会将控制平面虚拟机固定到特定主机。对于高可用性部署,请按照下文控制平面跨主机高可用性中的说明启用由 Provider 管理的 DRS 互斥。

应用新模板之前,请检查当前主机负载:

curl -k -sS "${DCS_BASE}/service/sites/${SITE}/hosts" \
  -H "X-Auth-Token: ${TOKEN}" -H 'version: 8.1' \
  | python3 -c "
import json,sys
for h in json.load(sys.stdin).get('hosts',[]) or []:
  print(f\"{h.get('name','?'):10} status={h.get('status','?'):10} cpuUsed/total={h.get('cpuUsedCores','?')}/{h.get('cpuTotalCores','?')}c memUsed={h.get('memUsedSizeMB','?')}MB cpuMuxRatio={h.get('cpuMuxRatio','?')}\")"

如果集群中每台主机的 cpuMuxRatio(CPU 分配量 / 物理核心数)都高于约 3 倍,则表明集群已饱和,在 DCS 侧重新平衡负载之前,很可能会拒绝新的放置请求。

控制平面跨主机高可用性

DCS Provider 不实现主机固定或 Cluster API FailureDomain 分散。相反,启用 DCSCluster.spec.controlPlaneHA 后,它可以为控制平面虚拟机维护由 Provider 管理的 DCS DRS 规则。

控制平面 VM 创建完成且其 VM URN 已知后,Provider 会创建并更新一条 DRS ruleType=2 互斥规则。该规则会列出一个业务集群当前的控制平面 VM,并要求 DCS 调度器将它们放置在不同的物理主机上。放置决策的执行以及任何运行时迁移仍由 DCS 负责。

Provider 不会调用 DCS Run DRS API,也不会应用 DRS 建议。如果规则维护完成后,ControlPlaneHAReady 仍为 False,且原因是 ControlPlaneHAPending,则表示 DCS 调度器尚未完成放置调整。请等待 DCS 侧调度,或使用 DCS 平台操作流程运行 DRS 并应用生成的建议。

启用此功能之前,请确认满足以下 DCS 侧要求:

  • 目标 DCS 计算集群已启用 DRS。
  • 目标 DCS 计算集群有足够健康的主机和容量。三个副本的控制平面通常至少需要三台可用主机。
  • 所选 datastore 对所有可能运行控制平面 VM 的主机均可见。
  • CD-ROM 设备已挂载等 DCS 侧限制不会阻止 DRS 运行时迁移。

编写集群清单时,在 DCSCluster.spec.controlPlaneHA 中启用此功能。清单示例和需要关注的状态字段,请参阅配置 DCSCluster和验证控制平面 HA。

创建集群后,检查 DCSCluster 上的条件和状态:

kubectl get dcscluster <cluster-name> -n cpaas-system \
  -o jsonpath='{range .status.conditions[?(@.type=="ControlPlaneHAReady")]}{.status}{" "}{.reason}{" "}{.message}{"\n"}{end}'

kubectl get dcscluster <cluster-name> -n cpaas-system \
  -o jsonpath='{.status.controlPlaneHA}{"\n"}'

ControlPlaneHAReady=True 表示由 Provider 管理的 DRS 规则已存在,并且 Provider 已观察到当前控制平面 VM 分布在不同的 DCS 主机上。ControlPlaneHAReady=False 且原因为 ControlPlaneHAPending,通常表示控制器正在等待 VM URN、等待足够的成员,或等待 DCS 侧完成放置调整。ControlPlaneHAReady=False 且原因为 ControlPlaneHAFailed,表示 Provider 无法查询、验证、创建、更新、删除或检查 DRS 规则。查看条件消息后,再检查控制器日志。

故障排除:VM 卡在 creating

如果 DCSMachine 一直处于 Provisioning,且已设置 status.cdRomFile(说明 DCS API 身份验证和 ISO 上传均已成功),但 DCS 侧 VM 始终无法离开 status=creating,也始终未获得 hostName,则故障几乎总是出在 DCS 放置层,而不是控制器中。

按以下顺序进行诊断:

  1. 确认这是放置停滞,而不是启动缓慢。查询 DCS 上的 VM 和与之匹配的部署任务:

    curl -k -sS "${DCS_BASE}/service/sites/${SITE}/vms?name=${VM_NAME}&limit=10" \
      -H "X-Auth-Token: ${TOKEN}" -H 'version: 8.1'
    curl -k -sS "${DCS_BASE}/service/sites/${SITE}/tasks?status=running&limit=50" \
      -H "X-Auth-Token: ${TOKEN}" -H 'version: 8.1'

    放置停滞的症状包括:status=creating、hostName=(为空 / 未调度)、disks 数组为空或没有变化,以及部署任务在没有错误的情况下,超过约 5 分钟停留在相同的 progress 值。

  2. 检查 datastore 可用空间和主机负载,使用选择 datastore和主机放置要求中的片段。datastore 使用率超过 70%,或所有主机的 cpuMuxRatio 都很高,是最常见的原因。

  3. 在 DCS 侧重新平衡负载。如果单台主机已饱和,而其他主机仍有可用容量,请在重试前联系 DCS 平台团队重新平衡负载(手动 Migrate 或通过 DRS 重新平衡)。DCS Provider 不提供按模板固定主机的功能,因此此补救工作由 DCS 平台团队负责。

  4. 如果 DCS 侧部署任务确实陷入死锁(可以取消,但对 ACP 驱动的 DeleteVm 无响应),请联系拥有门户管理员凭证的 DCS 管理员升级处理并取消任务。7443 REST API 不会向非管理员用户提供任务取消端点,因此此恢复流程由 DCS 平台团队负责,而非 ACP。

  5. 注意序列化带来的副作用。在启用了全局 DeployVM 锁的环境中,单个卡住的任务可能导致所有新部署都停滞在相同的进度百分比。解决最初卡住的任务通常即可解除队列阻塞。

如果某个 DCSMachine 的状态条件显示 InfrastructureReady=False reason=WaitingForInfrastructure 已超过 10 分钟,并伴有上述症状,应将其视为 DCS 平台事件,而不是 Cluster API 或 DCS Provider 回归问题。


Machine Templates

Machine template 用于定义集群节点的虚拟机规格(VM 模板、CPU、内存、磁盘、网络)。每个 machine template 都有一个用于确定其用途的 Type:

  • Control Plane:用于控制平面节点
  • Worker Node:用于工作节点

使用 Web UI

先决条件

  • 已创建 IP Pool
  • 已在 DCS 平台上使用 Alauda OS 镜像创建 VM Template
  • 已将 ConfigMap YAML 应用到 global 集群

VM Template 和 ConfigMap:

每个 Alauda OS 版本都包含一个将 VM 模板映射到 Kubernetes 版本的 ConfigMap YAML。创建 machine template 前,请先应用此 YAML:

apiVersion: v1
data:
  corednsTag: 1.12.4-v4.2.3
  etcdTag: v3.5.21-251117
  kubernetesVersion: v1.33.6
  vmImageVersion: alaudaos-42.m55.202512081125-0.x86_64
kind: ConfigMap
metadata:
  labels:
    cpaas.io/dcs-vm-template: <vm-template-name>
    cpaas.io/distribution-version: v4.2.0
    cpaas.io/kubernetes-version: v1.33
  name: 420-dcs-vm-template
  namespace: cpaas-system

重要:cpaas.io/dcs-vm-template 标签值必须与 DCS 平台上的 VM 模板名称一致。

创建 Machine Template

导航路径:集群 → 虚拟机 → Machine Templates → 创建 Machine Template → 选择凭证

表单字段:

字段类型必填描述
Name文本是模板的唯一标识符(1-63 个字符,仅限小写字母、数字和连字符)
Type下拉菜单是Control Plane 或 Worker Node
VM Template Name下拉菜单是来自 ConfigMap,显示 OS 版本和 Kubernetes 版本
Location下拉菜单否DCS VM Folder,用于在 DCS 平台上对克隆的虚拟机进行分组。VM Folder 的定义请参阅 Huawei DCS Concepts and Terminology。必须先在 DCS 平台上创建该文件夹。
Specs-是CPU 和内存规格
Specs.CPU数字是CPU 核数(整数)
Specs.Mem数字是内存大小(MB,在列表视图中以 GB 显示)
Disk-是磁盘配置(见下文)
IP Pool下拉菜单是引用现有 IP Pool

磁盘配置:

磁盘配置因模板类型而异。

控制平面所需磁盘:

挂载路径默认大小(GB)可删除
系统卷(模板默认值)否
/var/lib/kubelet100否
/var/lib/containerd100否
/var/lib/etcd10否

工作节点所需磁盘:

挂载路径默认大小(GB)可删除
系统卷(模板默认值)否
/var/lib/kubelet100否
/var/lib/containerd100否

可以添加其他磁盘,但必须保留上述所有必需磁盘。

INFO

平台必需的持久磁盘

平台仍然需要 /var/cpaas,但不再将其记录为 DCSMachineTemplate 磁盘。请在对应的 DCSIpHostnamePool.spec.pool[].persistentDisk 条目中配置它,使其在 VM 替换后仍能保留。

磁盘字段说明:

字段类型描述
Mount Path文本磁盘挂载目录路径
Disk Size数字(GB)磁盘大小
Datastore下拉菜单类型:ClusterName 或 Name,然后从 DCS 平台中选择

VM Template 选择提示:

TIP

如果多个 VM 模板具有相同的 Kubernetes 版本,请选择 OS 版本最新的模板,以便获得最新的安全更新和系统改进。

管理 Machine Templates

查看模板:导航至集群 → 虚拟机 → Machine Templates,即可查看所有模板及其 VM Template Name、Location、Specs 和 IP Pool。

更新模板:单击 更新 以修改规格。请注意,创建后无法更改 Name 字段。

删除模板:单击 删除 以移除模板。在对话框中确认删除。

使用 YAML

创建 DCSMachineTemplate 资源:

dcs-machinetemplate.yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSMachineTemplate
metadata:
  name: <machine-template-name>
  namespace: cpaas-system
spec:
  template:
    spec:
      vmTemplateName: <vm-template-name>
      location:
        type: folder
        name: <folder-name>
      vmConfig:
        dvSwitchName: <dv-switch-name> # Optional
        portGroupName: <port-group-name> # Optional
        dcsMachineCpuSpec:
          quantity: <cpu-cores>
        dcsMachineMemorySpec: # MB
          quantity: <memory-mb>
        dcsMachineDiskSpec: # GB
        - quantity: 0
          datastoreClusterName: <datastore-cluster-name>
          systemVolume: true
        - quantity: 100
          datastoreClusterName: <datastore-cluster-name>
          path: /var/lib/kubelet
          format: xfs
        - quantity: 100
          datastoreClusterName: <datastore-cluster-name>
          path: /var/lib/containerd
          format: xfs
        - quantity: 10
          datastoreClusterName: <datastore-cluster-name>
          path: /var/lib/etcd
          format: xfs
      ipHostPoolRef:
        name: <iphostname-pool-name>

参数说明:

参数类型描述必填
.spec.template.spec.vmTemplateNamestring在 DCS 平台上注册的 DCS VM Template 名称。是
.spec.template.spec.locationobject将克隆的虚拟机置于 DCS VM Folder 中,以便进行组织分组。若省略,虚拟机不会放入任何文件夹。VM Folder 的定义请参阅 Huawei DCS Concepts and Terminology。否
.spec.template.spec.location.typestring标准工作流中设置为 folder。该文件夹必须已在 DCS 平台上创建。是*
.spec.template.spec.location.namestring现有 DCS VM Folder 的名称。是*
.spec.template.spec.vmConfigobject虚拟机配置是
.spec.template.spec.vmConfig.dvSwitchNamestring虚拟机交换机名称(未指定时使用模板默认值)否
.spec.template.spec.vmConfig.portGroupNamestring端口组名称(必须属于指定的交换机;未指定时使用模板默认值)否
.spec.template.spec.vmConfig.dcsMachineCpuSpec.quantityintVM CPU 规格(核数)是
.spec.template.spec.vmConfig.dcsMachineMemorySpec.quantityintVM 内存大小(MB)是
.spec.template.spec.vmConfig.dcsMachineDiskSpec[]objectVM 磁盘配置是
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].quantityint磁盘大小(GB);系统磁盘设为 0 时使用模板大小是
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].datastoreClusterNamestring磁盘所在的 datastore 集群名称是
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].systemVolumebool是否为系统磁盘(只能有一个磁盘设为 true)否
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].pathstring磁盘挂载目录(未指定时不会挂载磁盘)否
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].formatstring文件系统格式否
.spec.template.spec.ipHostPoolRef.namestring引用的 DCSIpHostnamePool 名称是

*指定父对象时必填

高级:使用共享存储进行多集群部署

默认工作流假设 DCS VM Template(vmTemplateName)与克隆的虚拟机位于同一个 DCS Cluster。对于大多数部署,此假设是正确的,spec.template.spec.location 字段仅用于设置 VM Folder 以便进行组织分组。

跨多个 DCS Cluster 部署,并希望从单个共享 DCS VM Template 克隆到不同目标 DCS Cluster 的场景,需要满足以下条件:

  • 存放 DCS VM Template 的 DCS Datastore 必须对目标 DCS Cluster 可见。配置为支持跨集群访问的 SAN、IPSAN、NAS 或 FusionStorage datastore 符合此条件;由主机本地磁盘提供支持的 datastore 则不符合。
  • vmConfig 引用的 DCS 侧网络资源(分布式虚拟交换机和端口组)也必须对目标 DCS Cluster 可见。

满足这两个条件后,可以通过设置 spec.template.spec.location.type: cluster 和 spec.template.spec.location.name: <target-cluster-name>,而不是使用默认的 type: folder 形式,将克隆的虚拟机放置在目标 DCS Cluster 下。如果 datastore 未在多个 DCS Cluster 之间共享,克隆任务将在 DCS 平台侧失败。建议的替代方案是在每个目标 DCS Cluster 中分别准备一个 DCS VM Template,以便每个 DCSMachineTemplate 都引用一个已位于虚拟机运行所在集群中的模板。

使用此配置前,请向 DCS 平台管理员确认 datastore 在跨集群环境中的可见性。

WARNING

存储要求

Datastore 跨主机访问 datastore 集群(datastoreClusterName)必须支持在 DCS 平台的所有物理机之间进行跨主机访问。如果 datastore 仅在特定主机上可用,当 DCS 平台尝试将 VM 调度到其他主机时,VM 创建将失败。

Ignition 的共享存储 如果 datastore 不支持直接上传文件(Ignition 配置所必需),则必须提供支持多主机挂载的共享存储解决方案(例如 NFS)。

磁盘配置规则 可以添加自定义模板磁盘,但必须根据节点角色保留必需磁盘:

  • 控制平面:systemVolume、/var/lib/kubelet、/var/lib/containerd、/var/lib/etcd
  • 工作节点:systemVolume、/var/lib/kubelet、/var/lib/containerd 在 IP Pool 中将 /var/cpaas 配置为持久磁盘。

资源关系

基础设施资源具有以下依赖关系:

Cloud Credential
    ↓
IP Pool
    (network settings + persistent disk declarations)
    ↓
Machine Template → references IP Pool
    ↓
Cluster Creation

资源复用性:

  • 一个 Cloud Credential 可供多个集群使用
  • 可以为不同的网络网段创建多个 IP Pool
  • 可以为不同的节点类型和规格创建多个 Machine Template

后续步骤

配置基础设施资源后: