华为 DCS 的基础设施资源

概述

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

您可以使用 Web UI 或 YAML 清单来管理基础设施资源。Web UI 提供带有校验的引导式界面,而 YAML 则支持自动化能力。

在华为 DCS 上,IP 池还承载任何必须在 VM 替换后仍然保留的磁盘。这包括平台所需的 /var/cpaas 磁盘。

INFO

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

INFO

DCS 平台概念 如果您对 DCS ClusterDCS HostDCS VM FolderDCS VM Template 等术语不熟悉,或者不清楚它们与 DCSClusterDCSMachineTemplate 自定义资源之间的关系,请先阅读 Huawei DCS Concepts and Terminology

云凭证

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

使用 Web UI

前提条件

在创建云凭证之前,请先验证以下 DCS 平台要求:

用户配置

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

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

导航到 System ManagementRights ManagementRights Management Policy,并验证:

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

如果设置为 Yes,用户在首次登录时将被强制修改密码,从而导致认证失败并引发集群创建失败。

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

创建云凭证

导航路径:Clusters → Cloud Credentials → Create Cloud Credential → Select Huawei DCS

表单字段

字段名类型是否必填描述
Nametext凭证的唯一标识符(1-63 个字符,仅允许小写字母、数字和连字符)
Display Nametext用于便于识别的自定义描述
DCS EndpointURLDCS 平台 API 地址(必须以 http://https:// 开头)
UsernametextDCS 平台 API 用户登录名
PasswordpasswordDCS 平台 API 用户登录密码
SitetextVM 模板所在的站点(所有资源必须位于同一站点)

校验规则

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

管理云凭证

查看凭证:导航到 Clusters → Cloud Credentials,可查看所有已配置凭证及其类型、创建时间和创建者。

更新凭证:单击某个凭证上的 Update 可修改 Display Name。当前版本不支持更新密码(计划在未来版本中支持)。

删除凭证:单击 Delete 可删除凭证。在对话框中确认删除。

INFO

Domain user 支持:此版本仅支持 YAML

Web UI 当前仅会创建 Interface interconnection user 凭证。若要创建 Domain user 凭证,请使用下方的 YAML 方式,并在 Secret 中将 .data.userType 设置为 domain 的 base64 值(例如 ZG9tYWlu)。base64 编码步骤见本页后文的 Example 块。

使用 YAML

创建一个 Secret 资源来存储 DCS 认证信息:

dcs-secret.yaml
apiVersion: v1
data:
  authUser: <base64-encoded-auth-user>
  authKey: <base64-encoded-auth-key>
  endpoint: <base64-encoded-endpoint>
  userType: <base64-encoded-user-type>   # optional; "interconnect" (default) or "domain"
kind: Secret
metadata:
  name: <auth-secret-name>
  namespace: cpaas-system
type: Opaque
TIP

使用 stringData 跳过手动 base64 步骤

上面的示例使用 data:,这是 Kubernetes 中 Secret 的标准写法——每个值都必须已经完成 base64 编码。如果您希望直接以明文编写 Secret,可以将 data: 块替换为 stringData: 并直接提供值。API server 会在写入时透明地将其 base64 编码,因此最终存储的 Secret 与 data: 形式在字节级别一致,DCS Provider controller 看到的内容也相同。

dcs-secret-stringdata.yaml
apiVersion: v1
stringData:
  authUser: <plain-text-auth-user>
  authKey: <plain-text-auth-key>
  endpoint: <plain-text-endpoint>
  userType: <plain-text-user-type>   # optional; "interconnect" (default) or "domain"
kind: Secret
metadata:
  name: <auth-secret-name>
  namespace: cpaas-system
type: Opaque

stringData: 是只写的——一旦 Secret 创建完成,kubectl get secret -o yaml 只会显示 data: 形式,这是规范表示。两种形式在写入时互斥;不要在两个块中为同一个 key 赋值。

参数说明

参数描述
.data.authUserDCS 平台 API 用户登录名(base64 编码)
.data.authKeyDCS 平台 API 用户登录密码(base64 编码)
.data.endpoint带有 http 或 https 协议的 DCS 平台 API 地址(base64 编码)。注意:DCS 平台默认 API 端口为 7443(不是常见的 8443)。如果您的环境使用自定义端口,请向管理员确认。
.data.userType可选。凭证用户类型的 base64 值。允许的明文值(base64 编码前)为 interconnect(默认值;当该 key 缺失或为空时使用)或 domain。匹配不区分大小写(DomainDOMAINdomain 都映射到同一值)。任何其他值,包括旧版 DCS 的魔法数字 12,都会因配置错误而被拒绝,因此 domain 用户绝不会在未显式声明的情况下被作为 interconnect 进行认证。

示例

# Encode credentials
echo -n "admin" | base64
echo -n "your-password" | base64
echo -n "https://dcs.example.com:7443" | base64
echo -n "domain" | base64   # only when using a domain user; omit for interconnect (default)

# Apply the Secret
kubectl apply -f dcs-secret.yaml -n cpaas-system

凭证用户类型

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

userType映射到的 DCS 用户使用场景DCS 侧要求密码生命周期
interconnect(默认值;等同于该 key 缺失或为空)Interface interconnection user已有部署场景,以及当 DCS 中已配置互联账号时最简单的使用方式。DCS 门户必须将策略“Whether to modify the password of an interface interconnection user upon password resetting and first login”保持为 No由 DCS 门户策略管理。
domainDomain user(基于 LDAP/AD)安全审计要求使用 LDAP/AD 管理的凭证,或已经统一采用目录服务账号的部署场景。DCS 必须已由您的 DCS 管理员配置域认证,并且目录用户必须预先在 DCS 门户中创建,且角色为 administrator由您的 LDAP/AD 目录服务管理,而不是由 DCS 门户策略管理。

兼容性:不包含 userType key 的现有 Secret 将继续按之前的方式进行认证;无需迁移即可继续使用互联类型凭证。

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


IP 池

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

对于 DCS 多 NIC 集群,每个 IP 条目都可以声明 additionNic 项。这些附加 NIC 会绑定到 IP 槽位,并在 provider 创建新 VM 时应用。对现有 Pool 更新 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 Pool Web UI 仅覆盖标准 IP、主机名和网络设置。它不暴露 DCSIpHostnamePool.spec.pool[].persistentDisk。请通过 YAML 清单配置持久化磁盘。

创建 IP 池

导航路径: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 addressKubernetes Node 的 IP 地址
Subnet MaskCIDR prefix length网络子网掩码,以前缀长度形式输入,例如 24
GatewayIP address网关 IP 地址
DNSIP addressDNS 服务器地址(多个地址用分号分隔)
Hostnametext虚拟机主机名
Machine NametextDCS 平台中的虚拟机名称
dvSwitch Namedropdown虚拟交换机名称(来自 DCS 平台)
Port Group NamedropdownPort Group 名称(来自 DCS 平台)

Additional NIC IPs 字段

字段名类型是否必填描述
IPIP address非 Node IP 地址(例如存储网络)
Subnet MaskCIDR prefix length网络子网掩码,以前缀长度形式输入,例如 24
GatewayIP address网关 IP 地址
DNSIP addressDNS 服务器地址(多个地址用分号分隔)
dvSwitch Namedropdown虚拟交换机名称(来自 DCS 平台)
Port Group NamedropdownPort Group 名称(来自 DCS 平台)

校验规则

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

提示

  • 至少需要一个节点条目
  • 每个节点恰好需要一个 Node IP 配置
  • additionNic[] 条目是可选的,适用于多 NIC 场景,例如存储网络隔离

管理 IP 池

查看池:导航到 Clusters → 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[].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生成的 guest 网络配置中的附加 NIC IP 地址。这不是 Kubernetes Node IP。推荐*
.spec.pool[].additionNic[].maskstring附加 NIC 的子网掩码,采用 CIDR 前缀长度格式,不包含 /,例如 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* 的字段是生成静态 guest 网络配置所需要的。CRD 不会强制校验这些字段。

WARNING

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

IP 池中的附加 NIC

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

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

生效方式:

  • 当新的 DCSMachine 认领该槽位时,provider 会将 additionNic[] 从 Pool 槽位复制到 DCSMachine.status.additionalNic
  • provider 在克隆 DCS VM 时会添加这些 NIC
  • guest OS 会在首次启动时通过生成的 NetworkManager 配置来配置这些接口
  • 之后编辑 Pool 时,现有 VM 不会被热更新

网络边界:

  • DCS provider 不会在 DCS 平台上为附加 NIC IP 地址预留资源。在应用 Pool 之前,请避免 IP 冲突。
  • 引用的 DVS 和 Port Group 必须已经存在,并且目标 DCS Host 必须能够访问它们。
  • 每个附加 NIC 都要同时提供 dvSwitchNameportGroupName。provider 会在克隆 VM 之前使用它们来解析 Port Group URN。
  • provider 仅建模 IP、mask、gateway、DNS、DVS 和 Port Group。路由度量、静态路由和 NIC 角色必须通过 MCP 或 guest OS 配置处理。
  • 如果某个附加 NIC 配置了网关,请确认它不会意外接管主 NIC 的默认路由。

IP 池中的持久化磁盘

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

自 DCS provider v1.0.16 起,YAML 是声明这些持久化磁盘的唯一受支持方式。

  • 使用 IP 条目将每个持久化磁盘绑定到固定的 (ip, slot) 标识。
  • 平台所需的 /var/cpaas 磁盘应使用此模型。
  • DCSMachineTemplate 重点用于系统盘以及任何可能随 VM 一起重建的模板本地磁盘。
  • 当替换 VM 启动后,guest 磁盘设置脚本会检查是否已存在文件系统。如果已存在,则跳过格式化并直接挂载磁盘。
  • 由 Pool 管理的持久化磁盘需要逐个替换。在依赖此功能时,请将 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge = 0MachineDeployment.spec.strategy.rollingUpdate.maxSurge = 0

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

示例:

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 槽位中的磁盘位置。它决定了挂载顺序、guest 设备命名,以及在卷认领和重新附加时使用的序号。
quantityGB磁盘大小,单位为 GB。
datastoreName / datastoreClusterName为持久化磁盘指定且仅指定一个存储目标。
isThin可选。控制新建持久化卷时 DCS 的精简置备。如果省略,provider 不会发送 isThin,DCS 将使用平台默认值。
pathguest OS 内的挂载路径。/var/cpaas 是平台要求的路径。
format磁盘首次初始化时使用的文件系统。如果替换 VM 发现已有文件系统,则会跳过格式化。
options仅在磁盘首次格式化时应用的 mkfs 选项。
mountOptions挂载磁盘时应用的挂载选项。
pciType可选的 PCI 磁盘类型。如果省略,controller 将使用实现中的默认值。

更新规则:

  • 您可以向现有 IP 槽位追加新的 persistentDisk 条目。controller 会在 DCS 侧将新添加的磁盘挂载到运行中的 VM,但不会在 guest OS 中对磁盘进行格式化或挂载。guest 侧的格式化和挂载仅会在 VM 被替换后,并且替换后的 VM 在引导期间运行生成的磁盘设置流程时生效。
  • controller 会将新的持久化卷创建为独立的持久化普通卷。当复用现有卷时,只要求该卷是独立且持久化的;不要求特定的 DCS 卷类型。
  • 不要从 spec 中删除已有的 persistentDisk 条目。webhook 会拒绝这种删除操作。
  • formatoptionspciType 视为创建后不可变字段。
  • quantityGB 和存储池变更视为与滚动发布相关的变更。当 Pool 带有集群标签时,webhook 会尽力进行平台校验。isThin 仅在创建时生效:修改它不会对现有卷进行校验、协调或转换,只会影响之后创建的持久化卷。
  • pathmountOptions 的变更视为 guest 侧变更,它们会在滚动更新期间对替换后的机器生效。

DCS 平台容量与放置

在编写 DCSMachineTemplate 资源之前,请验证目标 DCS 站点、数据存储和计算集群是否具有足够的可用容量来承载计划中的 VM,并且 DCS 侧的调度策略能够将新 VM 放置到可用 Host 上。跳过这些检查是最常见的故障原因之一:VM 会看起来一直停留在 creating 状态,而 DCS API 不返回任何错误。

运行诊断片段

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

变量含义获取方式
DCS_BASEDCS REST API 基础 URL,包括协议和端口。DCS REST API 发布在 7443 端口上(与 8443 Web 门户分离)。向 DCS 平台管理员询问 API endpoint。相同的值也存储在云凭证 Secretendpoint key 中。
SITEDCS site ID(大写字母数字组合,例如 EC1C108C)。存储在云凭证 Secretsite key 中,也可在 DCSCluster.spec.site 中查看。
TOKENPOST /service/session 返回的短期 X-Auth-Token。该令牌在大约 30 分钟空闲时间内有效。运行下方显示的 session 命令。DCS 用户和 key 存储在云凭证 SecretauthUserauthKey 中。

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

# 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 历史中。session 令牌授予的权限与底层 DCS 用户相同,而该用户通常是管理员。

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

选择数据存储

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

  • datastoreName — 将磁盘固定到某个特定数据存储。即使其他数据存储有空闲空间,DCS scheduler 也不会查看这些相邻的数据存储。这是最严格的绑定方式。
  • datastoreClusterName — 将磁盘固定到某个数据存储集群(DCS 侧的数据存储组)。DCS scheduler 会从该集群中选择一个满足容量要求的具体数据存储。当平台提供数据存储集群时,这是更安全的默认选择。

只要 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 中声明的显式数据盘,因此单个 control plane 节点如果包含 etcd 10G + kubelet 100G + containerd 100G + /var/cpaas 100G,在模板系统盘之外大约会消耗 390 GB。某个数据存储使用率超过 ~70% 是应当切换到其他数据存储的强烈信号——即使绝对剩余空间看起来很多,碎片化和预留空间也可能导致新的 VM 放置停滞。

Host 放置与高可用性

DCS 平台上的 Host 放置由 DCS scheduler 执行。DCS Provider 不提供通过 DCSMachineTemplate 将虚拟机固定到特定 DCS Host 的能力。因此,由同一模板克隆出的虚拟机可能落在同一个物理 Host 上。

由此会带来两个后果:

  • 容量热点:如果 DCS 集群的 Host 负载不均衡(例如,某个 Host 的 CPU 严重超分配,而另一个 Host 大部分空闲),DCS scheduler 可能会拒绝在超分配 Host 上进行新放置。部署任务可能会一直卡住,直到 DCS 侧重新均衡负载或启用 DRS。请使用下面的片段确认 Host 负载是否是根因。
  • control plane 的分布取决于 DRS:control plane 虚拟机不会通过 machine template 被固定到特定 Host。对于高可用部署,请启用 provider 管理的 DRS 互斥规则,具体请参见下方的 控制平面的跨 Host 高可用性

在应用新模板之前检查当前 Host 负载:

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','?')}\")"

如果集群中的每个 Host 的 cpuMuxRatio(CPU 分配 / 物理核心)都超过 ~3×,则说明集群已经饱和,DCS 侧很可能会拒绝新的放置,直到负载重新均衡。

控制平面的跨 Host 高可用性

DCS Provider 不实现 Host 固定或 Cluster API FailureDomain 分布。相反,当您启用 DCSCluster.spec.controlPlaneHA 时,它可以为 control plane 虚拟机维护一个 provider 自有的 DCS DRS 规则。

在 control plane VM 已存在且其 VM URN 已知之后,provider 会创建并更新一个 DRS ruleType=2 的互斥规则。该规则列出某个业务集群当前的 control plane VM,并要求 DCS scheduler 将它们保持在不同的物理 Host 上。DCS 仍负责执行放置决策及任何运行时迁移。

provider 不会调用 DCS Run DRS API,也不会应用 DRS 建议。如果在规则已维护后,ControlPlaneHAReady 仍因 ControlPlaneHAPending 而保持为 False,说明 DCS scheduler 尚未完成放置收敛。请等待 DCS 侧调度,或使用 DCS 平台操作流程执行 DRS 并应用生成的建议。

在启用此功能之前,请验证以下 DCS 侧要求:

  • 目标 DCS 计算集群已启用 DRS。
  • 目标 DCS 计算集群具有足够的健康 Host 和容量。一个三副本 control plane 通常至少需要三个可用 Host。
  • 选定的数据存储对所有可能运行 control plane VM 的 Host 都可见。
  • 运行时 DRS 迁移不会被 DCS 侧限制阻塞,例如已挂载的 CD-ROM 设备。

在编写集群清单时,可在 DCSCluster.spec.controlPlaneHA 中启用该功能。关于清单示例和需要关注的状态字段,请参见 配置 DCSCluster验证 Control Plane HA

集群创建完成后,请检查 DCSCluster 上的 condition 和 status:

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 已观察到当前的 control plane VM 位于不同的 DCS Host 上。ControlPlaneHAReady=False 且原因为 ControlPlaneHAPending,通常表示 controller 正在等待 VM URN、等待成员数量足够,或者等待 DCS 侧放置收敛。ControlPlaneHAReady=False 且原因为 ControlPlaneHAFailed,表示 provider 无法查询、校验、创建、更新、删除或检查 DRS 规则。在查看 controller 日志之前,请先阅读 condition message。

故障排查:VM 卡在 creating 状态

如果某个 DCSMachine 一直停留在 Provisioning,且 status.cdRomFile 已设置(说明 DCS API 认证和 ISO 上传都已成功),但 DCS 侧 VM 始终不离开 status=creating,且从未获得 hostName,则故障几乎总是在 DCS 放置层,而不是 controller 中。

按顺序执行以下诊断步骤:

  1. 确认这是放置卡住,而不是启动缓慢。 查询 DCS 上的 VM 以及对应的 deploy task:

    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=creatinghostName=(空 / 未调度)、disks 数组为空或保持不变,并且 deploy task 的 progress 值长时间不变且超过 ~5 分钟没有错误。

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

  3. 在 DCS 侧重新均衡负载。如果某个 Host 已经饱和而其他 Host 还有容量,请在重试之前请求 DCS 平台团队重新均衡负载(手动 Migrate 或由 DRS 驱动的重新均衡)。DCS Provider 不提供按模板固定 Host 的能力,因此这项修复由 DCS 平台团队负责。

  4. 如果 DCS 侧的 deploy task 确实死锁了(可以取消,但对 ACP 驱动的 DeleteVm 无响应),请联系拥有门户管理员凭证的 DCS 管理员来取消该任务。7443 REST API 不为非管理员用户提供 task-cancel endpoint,因此恢复路径由 DCS 平台团队负责,而不是由 ACP 负责。

  5. 注意序列化副作用。在存在全局 DeployVM 锁的环境中,一个卡住的任务可能会导致后续所有新部署都停在相同的进度百分比。通常只要解决最初卡住的任务,就可以解除队列阻塞。

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


机器模板

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

  • Control Plane:用于 control plane 节点
  • Worker Node:用于 worker 节点

使用 Web UI

前提条件

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

VM Template 和 ConfigMap

每个 Alauda OS 版本都包含一个 ConfigMap YAML,用于将 VM 模板映射到 Kubernetes 版本。在创建机器模板之前,请先应用此 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 模板名称一致。

创建机器模板

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

表单字段

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

磁盘配置

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

Control Plane 所需磁盘

挂载路径默认大小(GB)可删除
System Volume(template default)
/var/lib/kubelet100
/var/lib/containerd100
/var/lib/etcd10

Worker Node 所需磁盘

挂载路径默认大小(GB)可删除
System Volume(template default)
/var/lib/kubelet100
/var/lib/containerd100

您可以添加额外磁盘,但必须保留上述所有必需磁盘。

INFO

平台要求的持久化磁盘

平台仍然需要 /var/cpaas,但它不再作为 DCSMachineTemplate 磁盘文档化。请改为在对应的 DCSIpHostnamePool.spec.pool[].persistentDisk 条目中进行配置,以便在 VM 替换后仍能保留。

磁盘字段说明

字段名类型描述
Mount Pathtext磁盘挂载目录路径
Disk Sizenumber (GB)磁盘大小
Datastoredropdown类型:ClusterName 或 Name,然后从 DCS 平台中选择

VM Template 选择提示

TIP

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

管理机器模板

查看模板:导航到 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.vmTemplateNamestringDCS 平台中注册的 DCS VM Template 名称。
.spec.template.spec.locationobject将克隆出的虚拟机放置在 DCS VM Folder 下以进行组织分组。如果省略,则虚拟机不会放入任何 folder。有关 VM Folder 的定义,请参见 Huawei DCS Concepts and Terminology
.spec.template.spec.location.typestring标准流程设置为 folder。该 folder 必须已经存在于 DCS 平台上。是*
.spec.template.spec.location.namestring已存在的 DCS VM Folder 名称。是*
.spec.template.spec.vmConfigobject虚拟机配置
.spec.template.spec.vmConfig.dvSwitchNamestring虚拟机交换机名称(如果未指定,则使用模板默认值)
.spec.template.spec.vmConfig.portGroupNamestringPort group 名称(必须属于指定的交换机,如果未指定,则使用模板默认值)
.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.vmConfig.dcsMachineDiskSpec[].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 侧网络资源(分布式虚拟交换机和 port group)也必须对目标 DCS Cluster 可见。

当两个条件都满足时,可以通过将 spec.template.spec.location.type 设置为 clusterspec.template.spec.location.name: <target-cluster-name>,而不是默认的 type: folder 形式,将克隆出的虚拟机放置到目标 DCS Cluster 下。如果数据存储不在 DCS Cluster 之间共享,则克隆任务会在 DCS 平台侧失败。推荐的替代方案是在每个目标 DCS Cluster 内分别准备一个 DCS VM Template,这样每个 DCSMachineTemplate 引用的模板都已经存在于虚拟机实际运行的集群中。

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

WARNING

存储要求

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

Ignition 的共享存储 如果您的数据存储不支持直接文件上传(Ignition 配置需要此能力),则必须提供支持多 Host 挂载的共享存储方案(例如 NFS)。

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

  • control plane:systemVolume/var/lib/kubelet/var/lib/containerd/var/lib/etcd
  • worker:systemVolume/var/lib/kubelet/var/lib/containerd 请在 IP 池中将 /var/cpaas 配置为持久化磁盘。

资源关系

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

Cloud Credential

IP Pool
    (network settings + persistent disk declarations)

Machine Template → references IP Pool

Cluster Creation

资源可复用性

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

后续步骤

在完成基础设施资源配置后: