华为 DCS 的基础设施资源
目录
概述云凭证使用 Web UI前提条件创建云凭证管理云凭证使用 YAML凭证用户类型IP 池使用 Web UI前提条件创建 IP 池管理 IP 池使用 YAMLIP 池中的附加 NICIP 池中的持久化磁盘DCS 平台容量与放置运行诊断片段选择数据存储Host 放置与高可用性控制平面的跨 Host 高可用性故障排查:VM 卡在creating 状态机器模板使用 Web UI前提条件创建机器模板管理机器模板使用 YAML高级:使用共享存储进行多集群部署资源关系后续步骤概述
在华为 DCS 上创建集群之前,需要先配置基础设施资源,包括云凭证、IP 池和机器模板。
您可以使用 Web UI 或 YAML 清单来管理基础设施资源。Web UI 提供带有校验的引导式界面,而 YAML 则支持自动化能力。
在华为 DCS 上,IP 池还承载任何必须在 VM 替换后仍然保留的磁盘。这包括平台所需的 /var/cpaas 磁盘。
命名空间要求
所有基础设施资源都必须部署在 cpaas-system 命名空间中,以确保它们与平台作为业务集群正确集成。
DCS 平台概念
如果您对 DCS Cluster、DCS Host、DCS VM Folder 或 DCS VM Template 等术语不熟悉,或者不清楚它们与 DCSCluster 和 DCSMachineTemplate 自定义资源之间的关系,请先阅读 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 Management → Rights Management → Rights 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
表单字段:
校验规则:
- Name 必须为 1-63 个字符,仅可包含小写字母、数字和连字符,且必须以字母或数字开头并结尾
- DCS Endpoint 必须是以
http://或https://开头的有效 URL 格式
管理云凭证
查看凭证:导航到 Clusters → Cloud Credentials,可查看所有已配置凭证及其类型、创建时间和创建者。
更新凭证:单击某个凭证上的 Update 可修改 Display Name。当前版本不支持更新密码(计划在未来版本中支持)。
删除凭证:单击 Delete 可删除凭证。在对话框中确认删除。
Domain user 支持:此版本仅支持 YAML
Web UI 当前仅会创建 Interface interconnection user 凭证。若要创建 Domain user 凭证,请使用下方的 YAML 方式,并在 Secret 中将 .data.userType 设置为 domain 的 base64 值(例如 ZG9tYWlu)。base64 编码步骤见本页后文的 Example 块。
使用 YAML
创建一个 Secret 资源来存储 DCS 认证信息:
使用 stringData 跳过手动 base64 步骤
上面的示例使用 data:,这是 Kubernetes 中 Secret 的标准写法——每个值都必须已经完成 base64 编码。如果您希望直接以明文编写 Secret,可以将 data: 块替换为 stringData: 并直接提供值。API server 会在写入时透明地将其 base64 编码,因此最终存储的 Secret 与 data: 形式在字节级别一致,DCS Provider controller 看到的内容也相同。
stringData: 是只写的——一旦 Secret 创建完成,kubectl get secret -o yaml 只会显示 data: 形式,这是规范表示。两种形式在写入时互斥;不要在两个块中为同一个 key 赋值。
参数说明:
示例:
凭证用户类型
DCS Provider 支持两种凭证用户类型,通过可选的 Secret key userType 进行选择:
兼容性:不包含 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
自 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 表示一个节点,并包含:
- Node IP(必填,每个 Pool 恰好一个)
- Additional NIC IPs(可选,每个 Pool 可包含多个)
Node IP 字段:
Additional NIC IPs 字段:
校验规则:
- 同一 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 资源:
参数说明:
*标记为 Yes* 的字段是 provider 解析目标网络并挂载附加 NIC 所必需的。标记为 Recommended* 的字段是生成静态 guest 网络配置所需要的。CRD 不会强制校验这些字段。
您必须配置数量大于或等于计划部署节点数量的机器信息。条目不足将导致节点无法部署。
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 都要同时提供
dvSwitchName和portGroupName。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 = 0和MachineDeployment.spec.strategy.rollingUpdate.maxSurge = 0。
如果您计划使用持久化磁盘,请确保 DCS VM 模板版本为 4.2.1 或更高,因为安全关机和磁盘分离依赖于 guest OS 中的 guest tools。
示例:
持久化磁盘字段说明:
更新规则:
- 您可以向现有 IP 槽位追加新的
persistentDisk条目。controller 会在 DCS 侧将新添加的磁盘挂载到运行中的 VM,但不会在 guest OS 中对磁盘进行格式化或挂载。guest 侧的格式化和挂载仅会在 VM 被替换后,并且替换后的 VM 在引导期间运行生成的磁盘设置流程时生效。 - controller 会将新的持久化卷创建为独立的持久化普通卷。当复用现有卷时,只要求该卷是独立且持久化的;不要求特定的 DCS 卷类型。
- 不要从 spec 中删除已有的
persistentDisk条目。webhook 会拒绝这种删除操作。 - 将
format、options和pciType视为创建后不可变字段。 - 将
quantityGB和存储池变更视为与滚动发布相关的变更。当 Pool 带有集群标签时,webhook 会尽力进行平台校验。isThin仅在创建时生效:修改它不会对现有卷进行校验、协调或转换,只会影响之后创建的持久化卷。 - 将
path和mountOptions的变更视为 guest 侧变更,它们会在滚动更新期间对替换后的机器生效。
DCS 平台容量与放置
在编写 DCSMachineTemplate 资源之前,请验证目标 DCS 站点、数据存储和计算集群是否具有足够的可用容量来承载计划中的 VM,并且 DCS 侧的调度策略能够将新 VM 放置到可用 Host 上。跳过这些检查是最常见的故障原因之一:VM 会看起来一直停留在 creating 状态,而 DCS API 不返回任何错误。
运行诊断片段
下面的容量和放置检查使用只读 DCS REST 调用。在运行任何片段之前,请在 shell 中设置以下环境变量:
在诊断会话开始时一次性设置这三个变量:
令牌处理 不要将令牌记录到文件或 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 访问权限的环境中,只读列表如下所示:
每个 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 负载:
如果集群中的每个 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:
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 中。
按顺序执行以下诊断步骤:
-
确认这是放置卡住,而不是启动缓慢。 查询 DCS 上的 VM 以及对应的 deploy task:
放置卡住的症状:
status=creating、hostName=(空 / 未调度)、disks数组为空或保持不变,并且 deploy task 的progress值长时间不变且超过 ~5 分钟没有错误。 -
检查数据存储剩余空间 和 Host 负载,可使用 选择数据存储 和 Host 放置要求 中的片段。数据存储使用率超过 70%,或所有 Host 的
cpuMuxRatio都很高,是最主要的原因。 -
在 DCS 侧重新均衡负载。如果某个 Host 已经饱和而其他 Host 还有容量,请在重试之前请求 DCS 平台团队重新均衡负载(手动
Migrate或由 DRS 驱动的重新均衡)。DCS Provider 不提供按模板固定 Host 的能力,因此这项修复由 DCS 平台团队负责。 -
如果 DCS 侧的 deploy task 确实死锁了(可以取消,但对 ACP 驱动的
DeleteVm无响应),请联系拥有门户管理员凭证的 DCS 管理员来取消该任务。7443 REST API 不为非管理员用户提供 task-cancel endpoint,因此恢复路径由 DCS 平台团队负责,而不是由 ACP 负责。 -
注意序列化副作用。在存在全局 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:
重要:cpaas.io/dcs-vm-template 标签值必须与 DCS 平台中的 VM 模板名称一致。
创建机器模板
导航路径:Clusters → Virtual Machine → Machine Templates → Create Machine Template → Select Credential
表单字段:
磁盘配置:
磁盘配置会因模板类型而异。
Control Plane 所需磁盘:
Worker Node 所需磁盘:
您可以添加额外磁盘,但必须保留上述所有必需磁盘。
平台要求的持久化磁盘
平台仍然需要 /var/cpaas,但它不再作为 DCSMachineTemplate 磁盘文档化。请改为在对应的 DCSIpHostnamePool.spec.pool[].persistentDisk 条目中进行配置,以便在 VM 替换后仍能保留。
磁盘字段说明:
VM Template 选择提示:
如果多个 VM 模板具有相同的 Kubernetes 版本,请选择 OS 版本最新的模板,以获得最新的安全更新和系统改进。
管理机器模板
查看模板:导航到 Clusters → Virtual Machine → Machine Templates,可查看所有模板及其 VM Template Name、Location、Specs 和 IP Pool。
更新模板:单击 Update 可修改规格。请注意,Name 字段在创建后无法更改。
删除模板:单击 Delete 可删除模板。在对话框中确认删除。
使用 YAML
创建一个 DCSMachineTemplate 资源:
参数说明:
*当指定了父对象时必填
高级:使用共享存储进行多集群部署
默认流程假设 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 设置为 cluster 且 spec.template.spec.location.name: <target-cluster-name>,而不是默认的 type: folder 形式,将克隆出的虚拟机放置到目标 DCS Cluster 下。如果数据存储不在 DCS Cluster 之间共享,则克隆任务会在 DCS 平台侧失败。推荐的替代方案是在每个目标 DCS Cluster 内分别准备一个 DCS VM Template,这样每个 DCSMachineTemplate 引用的模板都已经存在于虚拟机实际运行的集群中。
在使用此配置之前,请先与 DCS 平台管理员确认跨集群数据存储可见性。
存储要求
数据存储跨 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
- 可为不同节点类型和规格创建多个 Machine Template
后续步骤
在完成基础设施资源配置后: