华为云 Stack 基础设施资源

概览

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

请将本页作为准备检查清单。完成后,请继续阅读 在华为云 Stack 上创建集群管理华为云 Stack 上的节点,了解清单工作流。

INFO

命名空间要求

所有 HCS 基础设施资源必须部署在 cpaas-system 命名空间中,以确保它们能够像业务集群一样与平台正确集成。

编写 YAML 之前

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

输入由谁使用来源YAML 之前是否必需说明
集群名称ClusterKubeadmControlPlaneHCSCluster、模板、池你的集群命名方案在所有相关资源中始终使用相同的集群名称
Kubernetes 版本和组件基线ClusterKubeadmControlPlane已批准的发布基线;仅对其列出的组件版本使用 OS Support Matrix准备已验证的 Kubernetes 版本、镜像仓库、DNS 镜像仓库和 tag、etcd 镜像 tag、Kube-OVN 版本、Pod CIDR、Service CIDR 以及 Kube-OVN join CIDR
accessKeysecretKeyHCS 凭证 SecretHCS My Settings > Access Keys在应用 Secret 之前,请先对这些值进行 Base64 编码
projectIDHCS 凭证 SecretHCS My Settings > Resource Spaces使用 Resource Space ID,而不是显示名称
externalGlobalDomainHCS 凭证 SecretHCS platform access domain使用提供程序应调用的 HCS 平台域名
schemaHCS 凭证 SecretHCS administratorHCS IAM 端点的可选 API scheme。如果省略,提供程序将使用 https
regionHCS 凭证 SecretHCS administrator租户管理员无法从 HCS UI 中检索该值
imageNameHCSMachineTemplateHCS 镜像库存使用所选 Alauda OS 镜像对应的已验证 HCS 镜像名称
flavorNameHCSMachineTemplateHCS administrator使用与 Flavor.Name 匹配、且可被提供程序识别的 HCS API 值,而不是租户 UI 中的显示名称
availabilityZoneHCSMachineTemplateHCS administrator使用与 ZoneName 匹配、且可被提供程序识别的 HCS API 值,而不是租户 UI 中的显示名称
根盘、临时数据卷和持久盘布局HCSMachineTemplateHCSMachineConfigPool集群存储方案在编写模板和池之前,请先规划磁盘大小和挂载点。将可随虚拟机一起重建的磁盘放入 HCSMachineTemplate.spec.template.spec.dataVolumes[]。将必须在虚拟机替换后仍然保留的磁盘(例如 /var/cpaas)放入 HCSMachineConfigPool.spec.configs[].persistentDisks[]
VPC 名称和安全组名称HCSClusterHCS 网络库存确认引用的 VPC 和安全组已存在且可用
集群子网库存HCSClusterHCSMachineConfigPool、控制平面 ELBHCS 网络库存为集群将使用的每个子网准备子网名称、子网 ID、ELB 相关子网元数据、CIDR、网关、DNS 值,以及规划中的可用 IP 范围
控制平面和 worker 主机名及静态 IPHCSMachineConfigPoolHCS 子网规划静态 IP 工作流必须至少为每个规划中的 replica 准备一条记录
vipAddressvipSubnetNameHCSCluster.spec.controlPlaneLoadBalancerHCS ELB 地址方案vipAddress 必须属于 vipSubnetName
elbVirsubnetL4IpselbVirsubnetL7IpsHCSCluster.spec.controlPlaneLoadBalancerHCS ELB 地址方案每个 L4 或 L7 条目必须恰好包含两个 IP
vipDomainNameHCSCluster.spec.controlPlaneLoadBalancerHCS Cloud DNS Private Zones推荐配置该域名,使其已解析到 vipAddress
控制平面 HA 放置策略HCSCluster.spec.controlPlaneHAHCS 调度策略方案仅在启用提供程序管理的控制平面 server group 时需要。请选择 anti-affinitysoft-anti-affinity
controlPlaneEndpointCluster.status / 派生的集群端点控制器托管在创建清单中不要准备或写入此字段;控制器会在 ELB 就绪后填充它

凭证 Secret 输入

只有在收集到所有必需值之后,才创建 HCS 凭证 Secret

Secret 键含义获取位置
accessKeyHCS access key IDHCS My Settings > Access Keys
secretKeyHCS secret access keyHCS My Settings > Access Keys
projectIDResource Space IDHCS My Settings > Resource Spaces
externalGlobalDomainHCS 平台访问域名用于 API 访问的 HCS 平台域名
region提供程序使用的 HCS region API 值HCS administrator
schemaHCS IAM 端点的可选 API scheme。如果省略,提供程序将使用 httpsHCS administrator

未包含 schema 的现有凭证 Secret 仍可继续正常工作。仅当你的 HCS IAM 端点使用 http 而不是默认的 https 时,才需要设置 schema

注意: 租户管理员无法从 HCS UI 中检索 region。在对 Secret 进行编码之前,请先从 HCS administrator 处获取提供程序可识别的准确值。

计算值

在编写 HCSMachineTemplateHCSMachineConfigPool 之前,请准备虚拟机镜像、flavor、可用区、临时数据卷布局以及持久盘布局。

输入指引
imageName使用你要部署的 Alauda OS 镜像对应的已验证 HCS 镜像名称
flavorName使用与 Flavor.Name 匹配、且可被提供程序识别的 HCS API 值。不要使用租户 UI 中的显示名称
availabilityZone使用与 ZoneName 匹配、且可被提供程序识别的 HCS API 值。不要使用租户 UI 中的显示名称
根盘和临时数据卷提前规划系统盘和临时数据盘。控制平面模板通常会将临时数据卷用于 /var/lib/etcd/var/lib/kubelet/var/lib/containerd。worker 模板通常会将临时数据卷用于 /var/lib/kubelet/var/lib/containerd
池托管的持久盘提前规划必须在虚拟机替换后仍然保留的磁盘。对于 /var/cpaas 和其他在滚动替换期间必须保留的节点本地状态,请使用此模型。

注意: 租户管理员无法从 HCS UI 中检索提供程序可识别的 flavorNameavailabilityZone 值。在编写清单之前,请先从 HCS administrator 处获取准确的 API 值。

版本和组件基线

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

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

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

网络库存

在编写 HCSClusterHCSMachineConfigPool 资源之前,请先准备完整的集群网络库存。

你的网络方案必须包括:

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

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

重要: HCSCluster.spec.network.subnets 是集群子网库存。HCSMachineConfigPoolvipSubnetNameelbVirsubnetL4Ips[].subnetNameelbVirsubnetL7Ips[].subnetName 中引用的每个 subnetName 都必须已经存在于该列表中。

对于初始集群创建流程,在集群变为 Ready 之前,控制器可以按名称解析现有子网。对于已处于 Ready 状态的现有集群,不要只追加一个子网名称。请添加完整的子网对象,至少包括 nameid,以及当该子网被控制平面 ELB 使用时的 neutronSubnetId。同时保留库存中的 cidrgatewayIpprimaryDNSsecondaryDNS,以确保集群子网列表保持完整。

多 NIC 约束

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

当前提供程序不允许你声明以下内容:

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

请将当前的多 NIC 能力视为 NIC 连接加上子网和静态 IP 选择。

控制平面 ELB 地址方案

HCS 提供程序会自动创建控制平面的 Elastic Load Balance(ELB)。在编写 HCSCluster 之前,请先规划 ELB 输入。

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

  • vipSubnetName
  • vipAddress
  • elbVirsubnetL4Ips,且恰好包含两个 L4 IP
  • elbVirsubnetL7Ips,且恰好包含两个 L7 IP
  • 可选的 vipDomainName

如果设置了 vipDomainName,请配置 HCS Cloud DNS Private Zones,使该域名已解析到 vipAddress

操作约束

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

控制平面 HA 放置方案

对于多副本控制平面,你可以配置 HCS 提供程序创建并维护一个由提供程序拥有的 server group,用于控制平面 ECS 的放置。请在编写集群清单时通过 HCSCluster.spec.controlPlaneHA 启用此功能。

在启用该功能之前,请先规划放置策略:

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

该功能以集群为作用域,仅适用于控制平面机器,不会配置 worker 节点池。提供程序会创建 server group,将控制平面 ECS 创建请求附加到该 group,记录 HCSCluster.status.controlPlaneHA 中的 server group,并通过 ControlPlaneHAReady 条件报告进度。

对于现有集群,启用 HCSCluster.spec.controlPlaneHA 会创建并记录由提供程序拥有的 server group,但不会将已经运行中的控制平面 ECS 实例追溯加入该 group。只有在通过 os:scheduler_hints.group 创建控制平面 ECS 时,才会应用 server group 放置策略。要收敛现有集群,请启用 controlPlaneHA,等待 HCSCluster.status.controlPlaneHA.id,然后触发一次控制平面滚动替换,使替换后的 ECS 实例以该 server group 创建。在当前控制平面 ECS 成员被替换并在 group 中被观测到之前,ControlPlaneHAReady 可能保持为 False,原因是 ControlPlaneHAPending

有关清单示例和验证命令,请参见 配置 HCSCluster验证控制平面 HA

静态 IP 池方案

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

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

  • 控制平面主机名和静态 IP
  • worker 主机名和静态 IP(如果会创建 worker)
  • 足够覆盖初始 replica 数量的条目
  • 必须绑定到每个固定主机名的池托管持久盘

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

池托管的持久盘

HCSMachineConfigPool.spec.configs[].persistentDisks[] 中声明必须在虚拟机删除后重新创建时仍然保留的 HCS 磁盘。

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

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 数据盘,请使用 1032768 GB。已存在并被声明的磁盘必须与其当前大小匹配。
type目标可用区中可用的 EVS 磁盘类型名称。
mountPathguest OS 内的挂载路径。对于必须在虚拟机替换后仍然存在的平台状态,请使用 /var/cpaas。请根据平台监控、日志和插件数据大小为该磁盘规划容量。
format初始化新磁盘时使用的文件系统。如果省略,提供程序将使用 xfs。重新挂载时不会重新格式化现有文件系统。
mountOptions替换后的虚拟机挂载该磁盘时应用的挂载选项。如果省略,提供程序将使用 defaults,noatime

更新规则:

  • 不要在 HCSMachineConfigPool.spec.configs[].persistentDisks[]HCSMachineTemplate.spec.template.spec.dataVolumes[] 中声明相同的 mountPath
  • 你可以向现有机器配置中追加新的 persistentDisks[] 条目。提供程序会创建或认领 EVS 磁盘,但不会将磁盘热挂载到运行中的 ECS 中。请先触发一次 maxSurge: 0 的滚动替换,再期待新磁盘在 guest OS 内被格式化并挂载。
  • 在提供程序接受持久盘条目后,不要删除或更改 slotsizetypeformatmountPath。这些字段定义了磁盘标识和认领契约。
  • 你可以更新 mountOptions。该变更会在节点被替换并且替换后的虚拟机渲染其磁盘挂载时生效。
  • 对于使用持久盘的池,请保持 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0MachineDeployment.spec.strategy.rollingUpdate.maxSurge: 0

值到 YAML 的映射

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

已准备输入YAML 字段
accessKeysecretKeyprojectIDexternalGlobalDomainregion、可选的 schemaSecret.data.*
imageNameflavorNameavailabilityZone、根盘和临时数据卷布局HCSMachineTemplate.spec.template.spec.*
控制平面和 worker 主机名、静态 IP 以及池托管的持久盘HCSMachineConfigPool.spec.configs[]
VPC 名称、子网库存、安全组名称HCSCluster.spec.network.*
vipAddressvipSubnetNamevipDomainNameelbVirsubnetL4IpselbVirsubnetL7IpsHCSCluster.spec.controlPlaneLoadBalancer.*
控制平面 HA 放置策略HCSCluster.spec.controlPlaneHA.*
Kubernetes 版本和组件基线KubeadmControlPlane.spec.versionCluster.spec.clusterNetwork.*、集群注解以及相关引导设置

后续步骤

完成准备检查清单后: