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

表单字段:

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

验证规则:

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

管理云凭证

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

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

删除凭证:单击 删除,移除凭证。在对话框中确认删除操作。

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。客户端 apply 会将其应用的清单(包括 DCS 密码)存储在 Secret 本身的 kubectl.kubernetes.io/last-applied-configuration 注解中。kubectl create 不会写入此类注解。无论值是以 stringData 形式还是以 base64 data 形式写入,这一点都适用;base64 是编码方式,而不是保护机制。

若要稍后更改凭证,请使用 patch,而不要重新应用清单。出于相同原因,请使用编辑器编写 patch 文件:

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 管理员配置域身份验证,并且目录用户必须使用 administrator 角色预先创建于 DCS 门户中。由您的 LDAP/AD 目录服务管理,而不是由 DCS 门户策略管理。

兼容性:不包含 userType 键的现有 Secret 会继续按之前的方式进行身份验证;若继续使用互联类型凭证,则无需迁移。

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


IP 池

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

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

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

使用 Web UI

前提条件

  • 已创建 Cloud Credential
INFO

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

创建 IP 池

导航:集群 → Virtual Machine → IP Pools → Create IP Pool → Select Credential

表单结构:

IP 池表单由 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 池中的 IP 地址必须唯一
  • IP 地址必须采用有效的 IPv4 格式
  • 子网掩码必须输入有效的 CIDR 前缀长度,例如 24。请勿包含 /,也不要使用点分十进制格式,例如 255.255.255.0。
  • IP 地址必须位于配置的子网范围内
  • 网关必须是子网范围内的有效 IPv4 地址

提示:

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

管理 IP 池

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

更新池:单击 Update 添加或删除节点条目,以及修改网络配置。

删除池:单击 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[].maskstring不含 / 的 CIDR 前缀长度格式子网掩码,例如 24是
.spec.pool[].gatewaystring网关 IP 地址是
.spec.pool[].dnsstringDNS 服务器 IP,使用 ; 分隔多个服务器否
.spec.pool[].machineNamestringDCS 平台中的虚拟机名称否
.spec.pool[].hostnamestring虚拟机的主机名否
.spec.pool[].additionNic[][]object从此 IP 槽位创建的 VM 的附加 NIC。提供程序仅在创建新 VM 时应用这些 NIC。否
.spec.pool[].additionNic[].ipstring生成的客户机网络配置中的附加 NIC IP 地址。这不是 Kubernetes 节点 IP。建议*
.spec.pool[].additionNic[].maskstring不含 / 的 CIDR 前缀长度格式附加 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* 的字段是提供程序解析目标网络并连接附加 NIC 所必需的。标记为 Recommended* 的字段是生成静态客户机网络配置所需的。CRD 不会强制要求这些字段。

WARNING

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

IP 池中的附加 NIC

在 DCSIpHostnamePool.spec.pool[].additionNic[] 中声明附加 NIC。

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

生效方式:

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

网络边界:

  • DCS provider 不会在 DCS 平台上预留附加 NIC IP 地址。在应用池之前,请避免 IP 冲突。
  • 引用的 DVS 和 Port Group 必须已存在,并且目标 DCS 主机必须能够访问它们。
  • 为每个附加 NIC 提供 dvSwitchName 和 portGroupName。提供程序使用它们在克隆 VM 前解析 Port Group URN。
  • 提供程序仅对 IP、掩码、网关、DNS、DVS 和 Port Group 建模。路由度量、静态路由和 NIC 角色必须通过 MCP 或客户机 OS 配置处理。
  • 如果附加 NIC 配置了网关,请确认它不会意外地从主 NIC 接管默认路由。

IP 池中的持久磁盘

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

由于 DCS provider v1.0.16,YAML 是声明这些持久磁盘的唯一支持方式。

  • 使用 IP 条目将每个持久磁盘绑定到固定的 (ip, slot) 身份。
  • 使用此模型配置平台所需的 /var/cpaas 磁盘。
  • 让 DCSMachineTemplate 专注于系统磁盘以及可能随 VM 一起重新创建的模板本地磁盘。
  • 当替换 VM 启动时,客户机磁盘设置脚本会检查是否存在现有文件系统。如果已存在文件系统,则跳过格式化并直接挂载磁盘。
  • 池管理的持久磁盘需要逐个替换。依赖此功能时,请保留 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

持久磁盘字段描述:

字段描述
slot磁盘在 IP 槽位中的位置。它决定连接顺序、客户机设备命名,以及在卷声明和重新连接期间使用的序列号。
quantityGB磁盘大小,单位为 GB。
datastoreName / datastoreClusterName持久磁盘必须且只能指定一个存储目标。
isThin可选。控制新创建持久卷的 DCS 精简配置。如果省略,提供程序不会发送 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 站点、数据存储和计算集群具有足够的可用容量来承载计划中的 VM,并且 DCS 侧的调度策略可以将新 VM 放置到可用主机上。跳过这些检查是导致 VM 看似卡在 creating 状态且 DCS API 未返回任何错误的最常见原因。

运行诊断代码片段

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

变量含义获取方式
DCS_BASEDCS REST API 基础 URL,包括协议和端口。DCS REST API 发布在 7443 端口上(与 8443 Web 门户分开)。向 DCS 平台管理员获取 API 端点。相同的值存储在 cloud-credential Secret 的 endpoint 键下。
SITEDCS 站点 ID(大写字母数字,例如 EC1C108C)。存储在 cloud-credential Secret 的 site 键下,也可显示为 DCSCluster.spec.site。
TOKEN由 POST /service/session 返回的短期 X-Auth-Token。该令牌的空闲有效时间约为 30 分钟。运行下面显示的会话命令。DCS 用户和密钥存储在 cloud-credential 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 命令以刷新令牌。

选择数据存储

每个 DCSMachineDiskSpec 条目通过两个互斥字段之一将磁盘绑定到 DCS 数据存储:

  • datastoreName — 将磁盘固定到特定的数据存储。即使同级数据存储具有可用空间,DCS 调度程序也不会检查它们。这是最严格的绑定方式。
  • datastoreClusterName — 将磁盘固定到数据存储集群(DCS 侧的一组数据存储)。DCS 调度程序会从满足容量要求的集群中选择一个特定的数据存储。当平台提供数据存储集群时,这是更安全的默认选项。

当 DCS 管理员已配置数据存储集群时,优先使用 datastoreClusterName,这样即使同级数据存储仍有可用空间,也不会因某个接近满载的数据存储而阻止部署。

容量预检查:

在应用新的 DCSMachineTemplate 之前,列出已有的 DCS 数据存储,并确认目标数据存储具有足够的可用容量,以应对 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 cp / worker 对通常需要系统磁盘(模板默认值,通常约为 ~80 GB)以及 spec 中声明的显式数据磁盘,因此,单个带有 etcd 10G + kubelet 100G + containerd 100G + /var/cpaas 100G 的控制平面节点在计算模板系统磁盘之前大约会占用 390 GB。使用率超过 ~70 % 的数据存储是选择其他数据存储的强烈信号——即使绝对可用空间看起来很大,碎片和预留空间也可能导致新 VM 放置停滞。

主机放置和高可用性

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

这会带来两个后果:

  • 容量热点:如果 DCS 集群中的主机负载不均衡(例如,一台主机严重超额分配 CPU,而另一台主机大部分处于空闲状态),DCS 调度程序可能会拒绝在负载过高的主机上进行新的放置。部署任务可能会一直停滞,直到 DCS 侧重新平衡负载或启用 DRS。使用下面的代码片段确认主机负载是否是原因。
  • 控制平面分散取决于 DRS:控制平面虚拟机不会通过 machine template 固定到特定主机。对于高可用部署,请按照下面控制平面的跨主机高可用中的说明启用 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 计算集群具有足够的健康主机和容量。三个副本的控制平面通常至少需要三台可用主机。
  • 所选数据存储对所有可能运行控制平面 VM 的主机均可见。
  • 运行时 DRS 迁移不会受到 DCS 侧约束的阻止,例如已挂载的 CD-ROM 设备。

编写集群清单时,在 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 主机上。带有原因 ControlPlaneHAPending 的 ControlPlaneHAReady=False 通常表示控制器正在等待 VM URN、等待足够的成员,或等待 DCS 侧放置完成收敛。带有原因 ControlPlaneHAFailed 的 ControlPlaneHAReady=False 表示 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 数组为空或没有变化,以及部署任务在同一个 progress 值上停留超过 ~5 分钟且没有错误。

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

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

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

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

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


Machine Templates

Machine templates 定义集群节点的虚拟机规格(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

导航路径:Clusters → Virtual Machine → Machine Templates → Create Machine Template → Select Credential

表单字段:

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

磁盘配置:

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

Control Plane 必需磁盘:

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

Worker Node 必需磁盘:

挂载路径默认大小(GB)可删除
System Volume(模板默认值)否
/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 Template

查看模板:导航至 Clusters → Virtual Machine → Machine Templates,查看所有模板及其 VM Template Name、Location、Specs 和 IP Pool。

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

删除模板:点击 Delete 删除模板,并在对话框中确认删除操作。

使用 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磁盘的数据存储集群名称是
.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 数据存储,这是成立的;对于基于主机本地磁盘的数据存储,则不成立。
  • vmConfig 引用的 DCS 侧网络资源(分布式虚拟交换机和端口组)也必须对目标 DCS Cluster 可见。

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

使用此配置前,请与 DCS 平台管理员确认跨集群数据存储的可见性。

WARNING

存储要求

数据存储跨主机访问

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

Ignition 的共享存储

如果您的数据存储不支持直接文件上传(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

后续步骤

配置基础设施资源后: