Huawei DCS 提供程序

概述

Huawei DCS Infrastructure Provider 使 Huawei Datacenter Virtualization Solution (DCS) 平台支持 Immutable Infrastructure。

DCS(Datacenter Virtualization Solution)是 Huawei 的虚拟化平台,提供企业级虚拟化能力。DCS Provider 与 DCS 集成,用于管理 Kubernetes 集群的虚拟机、网络和存储资源。

INFO

版本

池管理型持久化磁盘首次在 DCS provider v1.0.16 中得到支持。 在 v1.0.16 中,DCSIpHostnamePool.spec.pool[].persistentDisk 仅支持通过 YAML 管理;Web UI 不提供该配置项。

Alauda OS 与 Provider 兼容性

对于使用 Alauda OS 的 Huawei DCS 集群,请为集群上安装的 ACP 版本,从 OS Support Matrix 对应行中选择 Alauda OS 镜像。

对于 ACP v4.3.2 或更高版本,包括 ACP v4.4.0 及更高版本,请安装 DCS Provider v1.0.21 或更高版本。不要将 DCS Provider v1.0.21 或更高版本与早于 v4.3.2 的 ACP 版本所对应的 Alauda OS 镜像配对使用。

INFO

v1.0.21 的控制平面端点边界

DCS Provider v1.0.21 支持用于高可用控制平面端点的外部负载均衡器。它不支持 DCSCluster.spec.controlPlaneLoadBalancer.type: internal。请在 Plan the Control Plane Endpoint 中规划监听器、后端、健康检查和可达性。

主要功能

  • 虚拟机管理:在 DCS 平台上创建和管理 VM
  • 网络配置:支持多 NIC 配置,并可自定义网络设置
  • 存储管理:灵活的磁盘配置,支持模板磁盘以及基于 IP-slot 的跨多个 datastore 的持久化磁盘
  • 高可用性:内置对高可用控制平面部署的支持
  • 滚动更新:自动执行滚动更新,实现零停机维护
  • 升级数据保留:在滚动升级期间,可将声明的持久化磁盘从旧 VM 解绑并重新绑定到替代 VM,从而确保保留的节点本地数据不会随着系统盘丢失

集群管理能力

DCS Provider 始终通过 Cluster API manifest 支持 基于 YAML 的 集群管理。 当安装了 Fleet EssentialsAlauda Container Platform DCS Infrastructure Provider 版本为 1.0.13 或更高时,它也支持 基于 UI 的 集群管理。如果 UI 工作流依赖池管理型持久化磁盘,请使用 DCS provider v1.0.16 或更高版本。在 v1.0.16 中,DCSIpHostnamePool 上的持久化磁盘声明仍然只能通过 YAML 管理。

基于 UI 的管理(Fleet Essentials)

INFO

Fleet Essentials 升级边界

Fleet Essentials 1.0.4 及更高版本可以通过 CVO 请求 ACP 4.3 及更高版本的 Distribution Version 升级。它不会执行 DCS Kubernetes 和 Alauda OS 的替换。此阶段 2 的 YAML 操作用 Huawei DCS 上的 Kubernetes 升级。通过 Fleet Essentials 进行的集群创建和常规 node pool 管理不受此边界影响。

Fleet Essentials 提供 UI 扩展锚点,使 Alauda Container Platform DCS Infrastructure Provider 能够动态添加 DCS 特定页面。 当安装了 Fleet Essentials 且 provider 版本为 1.0.13 或更高时,你可以通过 Web UI 管理 DCS 集群。池管理型持久化磁盘场景需要 DCS provider v1.0.16 或更高版本,但在 v1.0.16 中,DCSIpHostnamePool 上的 persistentDisk 声明仍必须通过 YAML manifest 管理:

基础设施资源管理

  • Cloud Credentials - 存储 DCS 平台访问凭证
  • IP Pools - 管理 IP 地址分配和多 NIC 设置。在 v1.0.16 中,诸如 /var/cpaas 之类的 IP-slot 持久化磁盘仍然通过 YAML 管理
  • Machine Templates - 定义 Control Plane 和 Worker Nodes 的 VM 规格,不包括池管理型持久化磁盘

集群生命周期

  • Create Clusters - 通过 5 步向导引导创建集群
  • 通过 Overview、Nodes、Node Pools 和 Aligned Extensions 选项卡查看集群详情
  • Upgrade Clusters - 两阶段升级:Distribution Version → Kubernetes
  • 通过确认对话框销毁集群

Node Pool 管理

  • 查看 Control Plane 和 Worker Node Pools
  • 添加可配置副本数和滚动策略的 Worker Node Pools
  • 删除 Worker Node Pools
  • 按 Node Pool 升级 Kubernetes 版本
  • 查看 Control Plane Node Pool 的详细 Conditions

基于 YAML 的管理

对于自动化和 GitOps 工作流,你可以使用 YAML manifest 管理 DCS 集群。此工作流不依赖 Fleet Essentials:

  • 定义基础设施资源(Secret、DCSIpHostnamePool、DCSMachineTemplate)
  • 创建集群资源(KubeadmControlPlane、DCSCluster、Cluster)
  • 管理 worker nodes(MachineDeployment、KubeadmConfigTemplate)
  • 执行滚动更新和升级,同时在节点替换过程中保留已声明的持久化磁盘

有关基于 YAML 的说明,请参见 Creating Clusters on Huawei DCS

支持的 Kubernetes 版本

DCS Provider 支持 OS Support Matrix 中定义的 Kubernetes 版本。每个 Alauda OS 版本都包含特定的 Kubernetes 版本,且 VM 模板必须使用对应的 Alauda OS 镜像创建。

架构

DCS Provider 实现了 Cluster API infrastructure provider 规范:

  • DCSCluster:表示 DCS 基础设施集群
  • DCSMachine:表示单个虚拟机
  • DCSMachineTemplate:定义用于创建 machine 的 VM 模板
  • DCSIpHostnamePool:管理 machine 的 IP 和 hostname 分配

概念和术语

Huawei DCS 平台中的若干概念,其名称与 Cluster API custom resource 名称非常相似。其中有两个概念尤其需要注意,因为它们的名称完全重名:DCS Cluster(DCS 平台上的物理主机池)与 DCSCluster custom resource(表示运行在 DCS 之上的 Kubernetes 集群的 Cluster API infrastructure resource)并不是同一个对象。将二者视为同一概念会导致 DCSMachineTemplateDCSCluster 配置错误。

本节列出了 provider 引用的 DCS 平台概念,将每个概念映射到引用它的 Cluster API resource 或 field,并说明网络与存储分层关系——这也是最常见的配置错误来源。

DCS 平台对象层级

DCS 平台以层级结构组织对象。provider 处理以下层(从上到下):

  • DCS Site — 单个 DCS 部署的顶级范围。由如 EC1C108C 这样的 site ID 标识。
  • 在一个 site 内:
    • DCS Clusters — 物理主机池。一个 site 包含一个或多个 DCS Clusters。
    • DCS VM FoldersDCS Cluster Folders — 分别用于虚拟机和集群的组织标签(逻辑分组)。
    • DCS DatastoresDCS Datastore Clusters — 存储容器及其分组。
    • DCS Distributed Virtual Switches (DVS) — 跨越整个 site 的虚拟交换机。
  • 在一个 DCS Cluster 内:
    • DCS Hosts — 物理服务器(例如,CNA-01CNA-02)。
  • 在一个 DCS DVS 内:
    • DCS Port Groups — 虚拟机 NIC 连接到的网络配置项。
  • 独立于 placement 层级:
    • DCS VM Templates — 被标记为模板的虚拟机,用作克隆的源镜像。
    • DCS Volumes — 在 DCS Datastores 上创建的持久化磁盘。

provider 不拥有这些对象中的任何一个。它通过 custom resource 字段按名称或 URN 引用它们。

DCS 平台概念

DCS Site

单个 DCS 部署的顶级容器。site ID 通过 DCSCluster.spec.site 提供,并且也存储在 cloud-credential Secret 中。provider 使用的所有 DCS API path 都包含该 site ID(/service/sites/{siteId}/...)。

DCS Cluster

DCS 平台上的物理主机池。DCS scheduler 会将虚拟机放置到属于同一个 DCS Cluster 的主机上。一个 site 可以包含一个或多个 DCS Clusters;一个 DCS Cluster 包含一个或多个 DCS Hosts。DCS Cluster 名称可在 DCS portal 中看到,并由 GET /service/sites/{siteId}/clusters API 返回。

名称 DCS ClusterDCSCluster Cluster API custom resource 冲突。请参见下文的 Cluster API Resource Mapping

DCS Host

在 DCS Cluster 中注册的单台物理服务器。名称遵循 DCS 平台上的本地约定(例如,CNA-01)。虚拟机运行在 host 上;DCS scheduler 根据 cluster 级别策略(DRS、anti-affinity 规则)和 host 容量来决定新虚拟机落在哪个 host 上。provider 不会将虚拟机固定到某个特定 DCS Host;DCSMachineTemplate resource 不暴露 host 绑定 field。

DCS VM Folder

DCS Site 内用于分组虚拟机的组织标签。VM Folder 不影响计算放置;即使某个虚拟机归入 VM Folder foo,它仍会运行在某个 DCS Cluster 中的 DCS Host 上。provider 通过 GET /service/sites/{siteId}/folder?type=1 查询 VM Folders。

在从 DCSMachineTemplate.spec.template.spec.location 引用 VM Folders(type: folder)之前,必须先在 DCS 平台上创建这些 VM Folders。

DCS Cluster Folder

用于分组 DCS Clusters 本身的组织标签,由相同的 /folder endpoint 通过不同的 type 参数返回。provider 不查询也不引用 DCS Cluster Folders。这里仅列出该概念,是为了避免与 DCS VM Folder 混淆。

DCS VM Template

DCS 平台上被标记为模板(isTemplate=true)的虚拟机。provider 从该模板克隆以创建集群节点。VM Template 通过名称标识(即 DCSMachine.spec.vmTemplateName 的值);provider 通过列出 GET /service/sites/{siteId}/vms?isTemplate=true&name=<name> 将名称解析为 URN。

VM Template 在 DCS Datastore 上拥有自己的磁盘和自己的网络配置。provider 在克隆时会覆盖网络配置(NIC port group、customization);但不会覆盖磁盘的存储类型。默认情况下,克隆得到的虚拟机继承模板所属的 home DCS Cluster;有关跨集群使用,请参见 Infrastructure → Advanced: Multi-Cluster Deployment

DCS Datastore

DCS 平台上的存储容器,用于保存虚拟机磁盘。Datastore 的后端可以是 SAN、IPSAN、NAS、FusionStorage 或本地磁盘。存储后端决定 datastore 是仅对一个 DCS Cluster 可见,还是对多个 DCS Clusters 可见:SAN、IPSAN、NAS 和 FusionStorage 通常支持跨集群访问;本地磁盘不支持。

disk specification 中可通过 datastoreNamedatastoreUrn 引用 Datastore;provider 会先将名称解析为 URN,然后再发送克隆请求。

DCS Datastore Cluster

DCS Datastores 的分组。当 disk specification 通过 datastoreClusterName 引用 Datastore Cluster 时,DCS scheduler 会选择一个具有可用容量的成员 datastore。若 DCS administrator 已配置 datastore cluster,则这是声明存储的推荐方式,因为它能容忍单个 datastore 容量耗尽。

DCS Datastore Cluster 不是 DCS Cluster。二者都包含 “cluster” 一词,因此名称会重叠,但底层概念不同:DCS Cluster 是主机池,而 DCS Datastore Cluster 是 datastore 池。阅读平台文档或与 DCS administrator 交流时,请注意这一重名问题。

DCS Distributed Virtual Switch (DVS)

DCS 平台上的虚拟交换机,跨越一个或多个 DCS Hosts。虚拟机 NIC 连接到 DCS Port Group,而 DCS Port Group 又隶属于某个 DCS DVS。provider 通过 GET /service/sites/{siteId}/dvswitchs 查询 DVS。

DCS Port Group

DCS DVS 上的网络配置项。每个 port group 都包含 VLAN 配置、安全策略和其他网络设置。provider 通过 GET {dvSwitchUri}/portgroups(使用父级 DVS URI)查询 port group,并通过名称(portGroupName)或 URN(portGroupUrn)引用它们。

虚拟机 NIC 必须且只能连接到一个 DCS Port Group。额外的 NIC 需要额外的 port-group 引用。

DCS Volume

DCS 平台上的持久化磁盘。Volume 存放在 DCS Datastore 上,并以类似 urn:sites:EC1C108C:volumes:9841 的 URN 标识。当 DCSIpHostnamePool.spec.pool[].persistentDisk[] 声明了必须在虚拟机替换后仍需保留的磁盘时,provider 会通过 POST /service/sites/{siteId}/volumes 创建 volume;随后通过 attachvol action 将该 volume 挂载到虚拟机。

DCS Volume 在概念上不同于 Kubernetes PersistentVolume。DCS Volume 是附着在 hypervisor 层的 DCS 平台存储对象;Kubernetes PersistentVolume 是表示可供 pod 使用的存储的 Kubernetes API object。provider 只管理 DCS Volumes;集群内的 PersistentVolume resources 由工作负载的 CSI driver 单独管理。

DCS Cloud Credential

provider 用于调用 DCS REST API 的认证材料。provider 通过向 POST /service/session 发送 X-Auth-UserX-Auth-Key headers 来获取 session token,并在后续请求中使用返回的 X-Auth-Token header。凭证以 Kubernetes Secret 的形式存储,并通过 DCSCluster.spec.credentialSecretRef 引用。该 Secret 包含 authUserauthKeyendpointsite keys。

Cluster API Resource Mapping

下表用于区分那些名称与 Cluster API custom resource 相似的 DCS 平台概念。

DCS 平台概念名称相似的 Cluster API resource为什么它们不是同一个概念
DCS ClusterDCSCluster (CRD)DCS Cluster 是 DCS 平台上的物理主机池。DCSCluster 是一个 Cluster API custom resource,表示运行在 DCS 平台之上的 Kubernetes 集群的基础设施侧。单个 DCS Cluster 可以承载一个或多个 Kubernetes 集群的虚拟机。
DCS HostKubernetes NodeDCS Host 是在 DCS 平台上注册的物理服务器。Kubernetes Node 是运行 kubelet 的 Kubernetes 集群内的工作负载主机。provider 不会将 DCS Hosts 暴露给 Kubernetes;Kubernetes Node 与其运行所在 DCS Host 之间的关系由 DCS scheduler 决定,并不会体现在任何 custom resource 中。
DCS VM TemplateDCSMachineTemplate (CRD)DCS VM Template 是由 DCS administrator 在 DCS 平台上准备的 OS 镜像模板。DCSMachineTemplate 是一个 Cluster API resource,它通过名称引用该模板,并附加 Kubernetes 特有配置(CPU、memory、disks、network)。DCSMachineTemplate 不包含镜像数据;它通过 vmTemplateName 指向一个 DCS VM Template。
DCS VolumeKubernetes PersistentVolumeDCS Volume 是附着在 hypervisor 层的 DCS 平台存储对象。Kubernetes PersistentVolume 是表示可供 pod 使用的存储的 Kubernetes API object。provider 创建 DCS Volumes(由 DCSIpHostnamePool.spec.pool[].persistentDisk[] 驱动);Kubernetes PersistentVolume resources 由工作负载的 CSI driver 独立管理。
DCS Cloud CredentialKubernetes Secret(由 DCSCluster.spec.credentialSecretRef 引用)DCS Cloud Credential 是 DCS 平台 administrator 签发的 user/key 对。它作为 Kubernetes Secret 传递给 provider,包含 authUserauthKeyendpointsite keys。

下表中的概念不会与任何 Cluster API resource 冲突,但由于包含 “cluster” 一词,因此在内部容易混淆:

DCS 平台概念容易混淆的对象为什么它们不是同一个概念
DCS Datastore ClusterDCS ClusterDCS Datastore Cluster 是 DCS Datastores(存储)的分组。DCS Cluster 是 DCS Hosts(计算)的主机池。二者都包含 “cluster” 一词,但属于 DCS 平台的不同层。

存储概念:Datastore、Datastore Cluster 和 Volume

DCS 平台暴露了三个与存储相关、且由 provider 分别引用的概念:

  • DCS Datastore 是单个存储容器。虚拟机磁盘固定在某一个 DCS Datastore 上。
  • DCS Datastore Cluster 是 DCS Datastores 的分组。当虚拟机磁盘引用 DCS Datastore Cluster 时,磁盘会被放置到一个具有可用容量的成员 datastore 上;DCS scheduler 负责选择该成员。
  • DCS Volume 是一种持久化磁盘对象,存在于某个 DCS Datastore 上(或 DCS Datastore Cluster 的某个成员 datastore 上)。当 DCSIpHostnamePool 声明持久化磁盘时,provider 会创建并将其挂载到虚拟机;它们会在虚拟机替换后继续存在。

三者之间的关系如下:

  • DCSMachineTemplatevmConfig.dcsMachineDiskSpec[] 下声明一个或多个磁盘。每个磁盘要么绑定到特定的 datastoreName,要么绑定到 datastoreClusterName。这些模板级磁盘会与虚拟机一起创建和销毁。
  • DCSIpHostnamePool 条目可以声明一个或多个 persistentDisk[] 项。每一项都绑定到特定的 datastoreNamedatastoreClusterName,并由 provider 创建一个对应的 DCS Volume,在虚拟机替换后仍然保留。

跨集群可见性由底层存储后端决定。SAN、IPSAN、NAS 和 FusionStorage datastores 通常对多个 DCS Clusters 可见;本地磁盘 datastores 仅对单个 DCS Cluster 可见。正是这种可见性决定了同一个 DCS VM Template 是否可以克隆到多个 DCS Clusters 中。

网络概念:DVS、Port Group 和 IP 标识

DCS 支持的 Kubernetes 集群网络配置分为两个层面:

  • DCS 侧网络基础设施(Layer 2):虚拟机 NIC 必须连接到某个 DCS Port Group,而该 Port Group 隶属于某个 DCS Distributed Virtual Switch。DVS 和 Port Group 是 DCS 平台对象,在 DCS 侧创建和管理。provider 通过名称(dvSwitchNameportGroupName)或 URN(portGroupUrn)引用它们。
  • 集群侧网络标识(Layer 3):分配给虚拟机的 IP 地址、子网掩码、网关、DNS server 和 hostname 不是 DCS 平台对象。它们在 DCSIpHostnamePool.spec.pool[] 条目中声明(由集群 operator 拥有的 Cluster API resource),并在启动过程中通过 cloud-init 或 Ignition 写入虚拟机。

这种拆分带来两个实际后果:

  • DCS 平台团队负责 DVS 和 Port Group 定义。集群 operator 负责 IP 和 hostname 规划。二者通过 DCSIpHostnamePool resource 协调:该资源一方面引用 DCS 侧的 port group,另一方面声明集群侧的 IP 标识。
  • provider 不会调用任何 DCS API 来分配或预留 IP 地址。编写 DCSIpHostnamePool 条目时,必须由集群 operator 避免地址冲突。

Cluster API resource DCSIpHostnamePool 与 DCS 平台的 port group 是不同对象。DCS 平台本身没有原生的 “IP pool” 概念;DCSIpHostnamePool resource 是唯一记录单个虚拟机网络标识的地方。

字段到概念的引用

下表将最常用的 custom resource 字段映射到其引用的 DCS 平台概念,以及该值的来源。

DCSCluster 字段

字段DCS 平台概念值来源
spec.siteDCS Site由 DCS 平台 administrator 提供的 site ID。
spec.credentialSecretRefDCS Cloud Credential同一 namespace 中保存 DCS user、key、endpoint 和 site 的 Kubernetes Secret 名称。

DCSMachineTemplate / DCSMachine 字段

字段DCS 平台概念值来源
spec.template.spec.vmTemplateNameDCS VM TemplateDCS 平台上已注册模板的名称(在 DCS portal 中可见)。
spec.template.spec.location(使用 type: folderDCS VM FolderDCS 平台上现有 VM Folder 的名称。必须先在 DCS 侧创建该 folder。
spec.template.spec.location(使用 type: clusterDCS Cluster现有 DCS Cluster 的名称。仅在模板所属 cluster 与目标 cluster 不同时使用。参见 Infrastructure → Advanced: Multi-Cluster Deployment
spec.template.spec.vmConfig.dvSwitchNameDCS DVS现有 DCS Distributed Virtual Switch 的名称。
spec.template.spec.vmConfig.portGroupNameDCS Port Group所引用 DCS DVS 所属 port group 的名称。
spec.template.spec.vmConfig.portGroupUrnDCS Port Group现有 DCS Port Group 的 URN。与 portGroupName 互斥。
spec.template.spec.vmConfig.dcsMachineDiskSpec[].datastoreNameDCS Datastore特定 DCS Datastore 的名称。
spec.template.spec.vmConfig.dcsMachineDiskSpec[].datastoreClusterNameDCS Datastore Cluster包含一个或多个 datastore 的 DCS Datastore Cluster 名称。与 datastoreName 互斥。
spec.template.spec.vmConfig.dcsMachineDiskSpec[].datastoreUrnDCS Datastore现有 DCS Datastore 的 URN。由 datastoreName 在内部解析得到。
spec.template.spec.vmConfig.cdRomDatastoreNameDCS Datastore用于存放 Ignition ISO 的 DCS Datastore 名称。
spec.template.spec.vmConfig.cdRomDatastoreClusterNameDCS Datastore Cluster用于选择 Ignition ISO datastore 的 DCS Datastore Cluster 名称。

DCSIpHostnamePool 字段

字段DCS 平台概念值来源
spec.pool[].ip / mask / gateway / dns / hostname集群侧网络标识(不是 DCS 平台概念)由集群 operator 声明;通过 cloud-init 或 Ignition 写入虚拟机。
spec.pool[].dvSwitchNameDCS DVS为额外 NIC 提供的 DVS,按 IP 覆盖配置。若省略,则回退到模板级 DVS。
spec.pool[].portGroupName / portGroupUrnDCS Port Group为额外 NIC 提供的 port group,按 IP 覆盖配置。
spec.pool[].persistentDisk[].datastoreNameDCS Datastore将承载持久化磁盘的 DCS Datastore 名称。
spec.pool[].persistentDisk[].datastoreClusterNameDCS Datastore Cluster创建持久化磁盘所用的 DCS Datastore Cluster 名称。与 datastoreName 互斥。
spec.pool[].persistentDisk[](该条目本身)创建 DCS VolumeDCS Volume 由 provider 通过 POST /service/sites/{siteId}/volumes 创建,并通过 attachvol action 挂载到虚拟机。

要求

  • 具有 API 访问权限的 DCS 平台

  • 拥有 DCS administrator 角色的用户,且满足以下任一条件:

    • Interface interconnection user(默认),或
    • Domain user(基于 LDAP/AD;需要由 DCS administrator 配置 DCS domain authentication)。

    有关选择标准和 DCS 侧要求,请参见 Credential User Types

  • 采用 Alauda OS 镜像的虚拟机模板

  • 当使用池管理型持久化磁盘时,DCS VM templates 需为 4.2.1 或更高版本,因为安全关机和磁盘分离依赖 guest tools

  • 具备跨 host 访问能力的共享存储

文档

有关如何使用 DCS Provider 的详细说明,请参见: