Huawei Cloud Stack 的基础设施资源

概述

在为 Huawei Cloud Stack (HCS) 集群编写 YAML 之前,请先准备好所有必需的 HCS 输入。本页列出了填写任何 Secret、HCSMachineConfigPool、HCSMachineTemplate、KubeadmControlPlane 或 HCSCluster 清单前必须准备好的值、来源和约束。

请将本页用作准备清单。完成准备后,请继续阅读在 Huawei Cloud Stack 上创建集群和在 Huawei Cloud Stack 上管理节点,了解清单工作流。

INFO

命名空间要求

所有 HCS 基础设施资源都必须部署在 cpaas-system 命名空间中,以确保它们能够作为工作负载集群与平台正确集成。

编写 YAML 之前

创建或编辑任何集群清单之前,请准备以下输入:

输入项用途来源编写 YAML 前必需备注
集群名称Cluster、KubeadmControlPlane、HCSCluster、模板、池集群命名计划是在所有相关资源中一致使用相同的集群名称
Kubernetes 版本和组件基线Cluster、KubeadmControlPlane已批准的版本基线;OS 支持矩阵仅适用于其中列出的组件版本是准备经过验证的 Kubernetes 版本、镜像仓库、DNS 镜像仓库和标签、etcd 镜像标签、Kube-OVN 版本、Pod CIDR、Service CIDR 和 Kube-OVN join CIDR
accessKey 和 secretKeyHCS 凭证 SecretHCS 我的设置 > 访问密钥是应用 Secret 前,请对这些值进行 Base64 编码
projectIDHCS 凭证 SecretHCS 我的设置 > 资源空间是使用资源空间 ID,而不是显示名称
externalGlobalDomainHCS 凭证 SecretHCS 平台访问域名是使用 Provider 应调用的 HCS 平台域名
schemaHCS 凭证 SecretHCS 管理员否HCS IAM endpoint 的可选 API scheme。若省略,Provider 将使用 https
regionHCS 凭证 SecretHCS 管理员是租户管理员无法从 HCS UI 获取此值
imageNameHCSMachineTemplateHCS 镜像清单是对所选 Alauda OS 镜像使用经过验证的 HCS 镜像名称
flavorNameHCSMachineTemplateHCS 管理员是使用与 Flavor.Name 匹配、且 Provider 可识别的 HCS API 值,而不是租户 UI 中显示的名称
availabilityZoneHCSMachineTemplateHCS 管理员或 ACP Web UI建议选择明确且 Provider 可识别的 HCS API 值,以便进行可预测的放置。若省略,Provider 会选择 HCS 报告为可用的可用区
根磁盘、临时数据卷和持久磁盘布局HCSMachineTemplate、HCSMachineConfigPool集群存储计划是在编写模板和池之前规划磁盘大小和挂载点。可随 VM 一起重新创建的磁盘放入 HCSMachineTemplate.spec.template.spec.dataVolumes[]。必须在 VM 替换后保留的磁盘(例如 /var/cpaas)放入 HCSMachineConfigPool.spec.configs[].persistentDisks[]
VPC 名称和安全组名称HCSClusterHCS 网络清单是确认引用的 VPC 和安全组已存在且可用
集群子网清单HCSCluster、HCSMachineConfigPool、控制平面 ELBHCS 网络清单是为集群使用的每个子网准备子网名称、子网 ID、与 ELB 相关的子网元数据、CIDR、网关、DNS 值以及规划的空闲 IP 范围
控制平面和工作节点主机名及静态 IPHCSMachineConfigPoolHCS 子网规划静态 IP 工作流必需每个规划的从节点至少准备一个条目
vipAddress 和 vipSubnetNameHCSCluster.spec.controlPlaneLoadBalancerHCS ELB 地址计划是vipAddress 必须属于 vipSubnetName
elbVirsubnetL4Ips 和 elbVirsubnetL7IpsHCSCluster.spec.controlPlaneLoadBalancerHCS ELB 地址计划是每个 L4 或 L7 条目必须恰好包含两个 IP
vipDomainNameHCSCluster.spec.controlPlaneLoadBalancerHCS Cloud DNS Private Zones不建议保持未设置。Provider 仅使用此字段回填派生字段 controlPlaneEndpoint;不支持通过域名访问集群——API server 证书由集群自己的 CA 签发,因此无法承载客户签发的证书
控制平面 HA 放置策略HCSCluster.spec.controlPlaneHAHCS 调度策略计划否仅在启用 Provider 管理的控制平面服务器组时才需要。选择 anti-affinity 或 soft-anti-affinity
controlPlaneEndpointCluster.status / 派生的集群 endpoint控制器管理否不要在创建清单中准备或填写此字段;ELB 就绪后,控制器会填入该字段

凭证 Secret 输入

收集所有必需值后,再创建 HCS 凭证 Secret。

Secret 密钥含义获取位置
accessKeyHCS 访问密钥 IDHCS 我的设置 > 访问密钥
secretKeyHCS 秘密访问密钥HCS 我的设置 > 访问密钥
projectID资源空间 IDHCS 我的设置 > 资源空间
externalGlobalDomainHCS 平台访问域名HCS 为 API 访问提供的平台域名
regionProvider 使用的 HCS region API 值HCS 管理员
schemaHCS IAM endpoint 的可选 API scheme。若省略,Provider 将使用 httpsHCS 管理员

在未设置 schema 的情况下创建的现有凭证 Secret 将继续正常工作。仅当 HCS IAM endpoint 使用 http 而不是默认值 https 时,才设置 schema。

注意:租户管理员无法从 HCS UI 获取 region。在对 Secret 进行编码之前,请从 HCS 管理员处获取 Provider 可识别的准确值。

Compute 值

在编写 HCSMachineTemplate 和 HCSMachineConfigPool 之前,准备好 VM 镜像、flavor、可用区、临时数据卷布局和持久磁盘布局。

输入指导
imageName对于要部署的 Alauda OS 镜像,使用经过验证的 HCS 镜像名称
flavorName使用与 Flavor.Name 匹配、且 Provider 可识别的 HCS API 值。不要使用租户 UI 中显示的名称
availabilityZone使用与 ZoneName 匹配、且 Provider 可识别的 HCS API 值。不要使用租户 UI 中显示的名称
根磁盘和临时数据卷提前规划系统磁盘和临时数据磁盘。控制平面模板通常使用临时数据卷存储 /var/lib/etcd、/var/lib/kubelet 和 /var/lib/containerd。工作节点模板通常使用临时数据卷存储 /var/lib/kubelet 和 /var/lib/containerd。
池管理的持久磁盘提前规划必须在 VM 替换后保留的磁盘。对于 /var/cpaas 以及滚动替换期间必须保留的其他节点本地状态,使用此模型。

注意:ACP Web UI 通过所选 HCS 凭证加载 flavor 和可用区。编写 YAML 时,请从 HCS 管理员处获取准确的、Provider 可识别的 Flavor.Name 和 ZoneName 值,因为原生 HCS 租户控制台可能不会显示这些值。

可用区放置

HCSMachineTemplate 会为从该模板创建的每台机器选择一个可用区。ACP Web UI 会为控制平面节点池创建一个模板,并为每个工作节点池创建一个模板。因此:

  • 所有控制平面节点使用同一个可用区。
  • 一个工作节点池中的所有从节点使用同一个可用区。
  • 不同的工作节点池可以选择不同的可用区。
  • 单个节点池不会自动将从节点分散到多个可用区。

为实现可预测的放置,请明确选择可用区。如果省略 HCSMachineTemplate.spec.template.spec.availabilityZone,Provider 会查询 HCS,并选择 HCS 报告为可用的第一个可用区。该列表的顺序由 HCS 控制。

使用 ACP Web UI 时,可用区下拉列表通过所选 HCS 凭证加载,使用 HCS API ZoneName,并禁用 HCS 报告为不可用的可用区。编写 YAML 时,请使用 Provider 可识别的 ZoneName,而不是原生 HCS 租户控制台中的显示名称。Provider 会拒绝 HCS 未返回的名称。对于已存在但当前不可用的指定可用区,ECS 配置仍可能访问 HCS 并在那里失败,因此在应用清单之前,请确认该可用区可用。

WARNING

池管理的持久磁盘和控制平面高可用会增加放置约束:

  • 现有池管理的持久磁盘会将其替换后的 ECS 实例锁定到该磁盘所在的可用区。如果模板明确选择了不同的可用区,替换操作将因可用区冲突而失败。
  • 控制平面高可用通过使用 HCS 服务器组,将控制平面 ECS 实例分散到物理主机上。它不会将控制平面分散到多个可用区;所有控制平面节点仍位于控制平面 HCSMachineTemplate 所选择的可用区中。

版本和组件基线

仅将 OS Support Matrix 用于其中明确列出的组件版本,例如受支持 Alauda OS 镜像的 Kubernetes、coredns、etcd 和 pause 版本。

OS Support Matrix 并不是所有 HCS 清单值的完整来源。在编写 YAML 之前,还应获取已批准的发布基线,用于确定容器镜像仓库、DNS 镜像仓库、Kube-OVN 版本、Kube-OVN 加入 CIDR、Pod CIDR 和 Service CIDR 等值。如果你的发布版本尚未提供完整的基线来源,请使用平台或发布负责人针对你的环境验证过的值。

通过 Web UI 而不是 YAML 创建集群时,无需手动输入这些组件版本。向导会从你为 OS 镜像注册的 OS-release ConfigMap 中读取这些版本。有关注册步骤和字段来源,请参阅 OS Release Registration。

网络清单

在编写 HCSCluster 或 HCSMachineConfigPool 资源之前,准备完整的集群网络清单。

网络规划必须包括:

  • 目标 VPC 名称
  • 目标安全组名称
  • 集群将使用的每个子网名称
  • 每个子网的子网 ID 和与 ELB 相关的子网元数据
  • 每个子网的 CIDR
  • 每个子网的网关和 DNS 值
  • 控制平面节点、工作节点、ELB VIP 以及 ELB L4/L7 虚拟子网 IP 的计划可用 IP 范围

如果单个集群使用多个子网,这些子网必须属于同一个 VPC,并且必须允许集群节点彼此通信。

重要:HCSCluster.spec.network.subnets 是集群子网清单。HCSMachineConfigPool、vipSubnetName、elbVirsubnetL4Ips[].subnetName 和 elbVirsubnetL7Ips[].subnetName 引用的每个 subnetName 都必须已存在于该列表中。

对于初始集群创建流程,控制器可以在集群变为 Ready 之前按名称解析现有子网。对于现有的 Ready 集群,请勿仅追加子网名称。添加完整的子网对象,至少包括 name、id,以及在子网供控制平面 ELB 使用时包括 neutronSubnetId。同时保留清单中的 cidr、gatewayIp、primaryDNS 和 secondaryDNS,以确保集群子网列表保持完整。

多 NIC 约束

在 HCSMachineConfigPool.spec.configs[].networks[] 中声明多个 NIC。每个 networks[] 条目只为一个 NIC 选择一个子网和一个静态 IP。

当前 Provider 不允许声明:

  • 每个 NIC 的角色或用途,例如管理、服务或存储流量
  • 特定 NIC 的默认网关
  • 静态路由或路由度量值
  • 每个 NIC 的 DNS 设置

将当前的多 NIC 功能视为 NIC 附加,以及子网和静态 IP 的选择。

控制平面 ELB 地址规划

HCS Provider 会自动创建控制平面 Elastic Load Balance(ELB)。请在编写 HCSCluster 之前规划 ELB 输入。

本文档使用固定地址 ELB 工作流。请在编写 HCSCluster 之前准备所有与 ELB 相关的地址:

  • vipSubnetName
  • vipAddress
  • elbVirsubnetL4Ips,恰好包含两个 L4 IP
  • elbVirsubnetL7Ips,恰好包含两个 L7 IP

保持 vipDomainName 未设置:不支持通过域名访问集群(API server 证书只能由集群自身的 CA 签发),并且 Provider 仅使用该字段回填派生的 controlPlaneEndpoint。

运行约束

  • Provider 会创建 ELB 并启用 Hybrid Load Balancing,使集群节点可以通过 ELB 地址访问 API server。
  • 集群创建后,请勿在 HCS ELB 上禁用 Hybrid Load Balancing。
  • 请勿在创建清单中填写 spec.controlPlaneEndpoint。ELB 就绪后,控制器会填充该字段。

控制平面高可用放置规划

对于多从节点控制平面,可以将 HCS Provider 配置为创建并维护一个由 Provider 管理的服务器组,用于控制平面 ECS 放置。在编写集群清单时,通过 HCSCluster.spec.controlPlaneHA 启用此功能。

启用此功能前,请规划放置策略:

策略行为运行影响
anti-affinity强反亲和性。HCS 必须将控制平面 ECS 实例放置在不同的主机上。需要严格主机隔离时使用此策略。如果 HCS 找不到满足规则的足够容量,ECS 创建可能会失败。
soft-anti-affinity尽力反亲和性。HCS 尝试将控制平面 ECS 实例放置在不同的主机上。如果倾向于分散放置,但不希望该规则阻止 ECS 创建,请使用此策略。最终放置仍可能共享同一主机。

此功能作用于集群范围,仅适用于控制平面计算机。它不会配置工作节点池。Provider 会创建服务器组,将控制平面 ECS 创建请求关联到该组,在 HCSCluster.status.controlPlaneHA 中记录服务器组,并通过 ControlPlaneHAReady 条件报告进度。

对于现有集群,启用 HCSCluster.spec.controlPlaneHA 会创建并记录由 Provider 管理的服务器组,但不会将已在运行的控制平面 ECS 实例追溯添加到该组。服务器组放置会在使用 os:scheduler_hints.group 创建控制平面 ECS 时应用。要使现有集群达到目标状态,请启用 controlPlaneHA,等待 HCSCluster.status.controlPlaneHA.id,然后触发控制平面滚动替换,以便使用该服务器组创建替换 ECS 实例。在当前控制平面 ECS 成员完成替换并在该组中被观测到之前,ControlPlaneHAReady 可能仍为 False,原因是 ControlPlaneHAPending。

有关清单示例和验证命令,请参阅配置 HCSCluster和验证控制平面高可用。

静态 IP 池规划

本页重点介绍规划的静态 IP 工作流。

创建 HCSMachineConfigPool 资源前,请准备以下内容:

  • 控制平面主机名和静态 IP
  • 工作节点主机名和静态 IP(如果创建工作节点)
  • 足够覆盖初始从节点数的条目
  • 必须绑定到每个固定主机名的池管理持久磁盘

对于至少包含三个从节点的静态 IP 控制平面,推荐使用 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0 升级路径。这种先缩容再扩容的方法通常不需要额外的控制平面 IP。如果计划采用单控制平面、仅创建拓扑(replicas: 1),请勿将该滚动更新设置复制到创建清单中。对于使用持久磁盘的池,请保留 maxSurge: 0,因为每个磁盘都绑定到一个固定主机名和槽位。

池管理持久磁盘

在 HCSMachineConfigPool.spec.configs[].persistentDisks[] 中声明必须在 VM 删除并重新创建替换过程中保留的 HCS 磁盘。

对于 /var/cpaas、监控数据、日志数据或其他必须在滚动替换期间保留的节点本地状态,请使用此模型。对于可以随每个新 ECS 重新创建的临时磁盘,请保留 HCSMachineTemplate.spec.template.spec.dataVolumes[]。

hcs-machine-config-pool-with-persistent-disk.yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: HCSMachineConfigPool
metadata:
  name: <cluster-name>-cp-pool
  namespace: cpaas-system
  labels:
    cluster.x-k8s.io/cluster-name: <cluster-name>
spec:
  configs:
    - hostname: <node-hostname>
      networks:
        - subnetName: <subnet-name>
          ipAddress: <node-ip>
      persistentDisks:
        - slot: 0
          size: 100
          type: SSD
          mountPath: /var/cpaas
          format: xfs
          mountOptions:
            - defaults
            - noatime

持久磁盘字段说明:

字段说明
slot单个机器配置中的磁盘位置。对于同一主机名,槽位必须从 0 开始保持唯一且连续。
sizeEVS 磁盘大小,单位为 GB。对于新创建的 EVS 数据磁盘,请使用 10 到 32768 GB。现有已声明磁盘必须与其当前大小匹配。
type目标可用区中可用的 EVS 磁盘类型名称。
mountPath客户机 OS 内的挂载路径。对于必须在 VM 替换后保留的平台状态,请使用 /var/cpaas。磁盘大小应足以存储平台监控、日志和插件数据。
format初始化新磁盘时使用的文件系统。如果省略,Provider 将使用 xfs。重新挂载期间不会重新格式化现有文件系统。
mountOptions替换 VM 挂载磁盘时应用的挂载选项。如果省略,Provider 将使用 defaults,noatime。

更新规则:

  • 不要在 HCSMachineConfigPool.spec.configs[].persistentDisks[] 和 HCSMachineTemplate.spec.template.spec.dataVolumes[] 中同时声明相同的 mountPath。
  • 可以向现有机器配置追加新的 persistentDisks[] 条目。Provider 会创建或声明 EVS 磁盘,但不会将磁盘热挂载到正在运行的 ECS 中。在期望新磁盘于客户机 OS 内完成格式化和挂载之前,请使用 maxSurge: 0 触发滚动替换。
  • Provider 接受持久磁盘条目后,不要移除或更改 slot、size、type、format 或 mountPath。这些字段定义磁盘身份和声明契约。
  • 可以更新 mountOptions。更改会在节点替换且替换 VM 渲染其磁盘挂载时生效。
  • 对于使用持久磁盘的池,请保留 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0 和 MachineDeployment.spec.strategy.rollingUpdate.maxSurge: 0。

值到 YAML 的映射

完成准备检查清单后,使用以下映射:

准备好的输入YAML 字段
accessKey、secretKey、projectID、externalGlobalDomain、region、可选的 schemaSecret.data.*
imageName、flavorName、availabilityZone、根卷以及临时数据卷布局HCSMachineTemplate.spec.template.spec.*
控制平面和工作节点主机名、静态 IP 以及池管理的持久磁盘HCSMachineConfigPool.spec.configs[]
VPC 名称、子网清单、安全组名称HCSCluster.spec.network.*
vipAddress、vipSubnetName、vipDomainName、elbVirsubnetL4Ips、elbVirsubnetL7IpsHCSCluster.spec.controlPlaneLoadBalancer.*
控制平面 HA 放置策略HCSCluster.spec.controlPlaneHA.*
Kubernetes 版本和组件基线KubeadmControlPlane.spec.version、Cluster.spec.clusterNetwork.*、集群注解以及相关引导设置

后续步骤

完成准备检查清单后: