在 Huawei Cloud Stack 上创建集群
本文档介绍如何在 Huawei Cloud Stack 平台上创建 Kubernetes 集群。任何受支持的 provider 版本都可以通过 Cluster API manifests 使用基于 YAML 的方式创建集群。如果已安装 Fleet Essentials 1.0.2 或更高版本,并且 Alauda Container Platform HCS Infrastructure Provider 版本为 v1.0.3 或更高版本,也可以通过引导式 Web UI 创建集群。
Web UI 提供引导式工作流和内置校验,而 YAML 则提供更灵活的自动化能力。
目录
前提条件1. 安装所需插件2. 准备 HCS 基础设施输入3. OS Release 注册使用 Web UI创建工作流第 1 步:基本信息第 2 步:网络第 3 步:基础设施第 4 步:控制平面节点池Machine Config 条目第 5 步:工作节点池第 6 步:审查使用 YAML集群创建概览控制平面配置配置 HCS 身份认证配置 Machine Configuration Pool配置 Machine Template配置 KubeadmControlPlane配置 HCSCluster配置 Cluster集群验证使用 kubectl验证控制平面 HA预期结果添加工作节点升级集群故障排查前提条件
在创建集群之前,请确保满足以下所有前提条件:
1. 安装所需插件
在 的 global 集群上安装以下插件:
- Alauda Container Platform Kubeadm Provider
- Alauda Container Platform HCS Infrastructure Provider
有关详细安装说明,请参阅 安装指南。
2. 准备 HCS 基础设施输入
在编写本文档中的任何 YAML 之前,请先准备所有 HCS 特定输入:
- HCS 凭证 Secret 值
- provider 可识别的计算值,例如
imageName、flavorName和availabilityZone - 集群网络清单,包括集群使用的子网和空闲 IP 范围
- 控制平面 ELB 地址规划,包括
vipAddress、vipSubnetName以及固定的 L4 和 L7 IP - 控制平面和工作节点的静态 IP 池规划
完整清单、来源信息和限制条件请参阅 Huawei Cloud Stack 的基础设施资源。
3. OS Release 注册
此前提条件仅适用于 Web UI 工作流。基于 YAML 的创建会直接设置 OS 镜像及其组件版本,因此不需要此步骤。
Web UI 不会要求你手动输入 OS 镜像及其 Kubernetes 和组件版本。它会从你为每个 Alauda OS 镜像注册一次的 OS-release ConfigMap 中读取这些信息。向导会从 global 集群解析平台 Distribution 版本,找到 supportedACPVersions 包含该 Distribution 的已注册 OS 镜像,并据此派生节点镜像和控制平面组件版本。
如果当前 Distribution 找不到匹配的已注册 OS 镜像,向导会阻止创建并报错,例如:
当前平台 Distribution v4.3.2 没有注册 OS。请先注册 OS-release ConfigMap。
在打开向导之前,请先在 global 集群上注册 OS 镜像:
使用 kubectl apply -f os-release.yaml 应用它。
字段来源:
不要在此 ConfigMap 中添加 Kube-OVN 版本。向导会从 global 集群的 Kube-OVN 配置中读取 Kube-OVN 版本,而不是从 OS 镜像中读取。
osImageVersion 必须指定一个已存在于 HCS 平台上的镜像。若要读取已有集群环境中使用的准确名称,请列出现有 machine template:
使用 Web UI
版本要求:此工作流需要 Fleet Essentials 1.0.2 或更高版本,以及 Alauda Container Platform HCS Infrastructure Provider v1.0.3 或更高版本。如果 provider 版本早于 v1.0.3,请使用 使用 YAML 中描述的 YAML manifests 创建集群。
Web UI 会使用你选择的 Infrastructure Credential,从 HCS 平台加载 VPC、子网、安全组、flavor 以及可分配 IP 地址。开始前请确保已满足上述前提条件,并且在 cpaas-system 命名空间中已存在 HCS 凭证 Secret。
创建工作流
集群创建流程遵循一个 6 步向导:
导航路径:Clusters → Clusters → Create Cluster → Select Huawei Cloud Stack
IP 选择方式
此向导中的每个 IP 字段——第 3 步中的控制平面 ELB 地址,以及第 4 步和第 5 步中的节点 IP 地址——都是选择器,而不是自由文本框。请先选择子网,选择器只会列出该子网中可分配的 IP 地址。HCS 集群使用静态 IP 地址,因此必须从列表中选择地址;不支持手动输入和 DHCP。更改子网会清除你已选择的地址。同一子网中已在其他位置选中的 IP 地址会从列表中移除,因此同一地址不会被分配两次。当某个子网有很多空闲地址时,列表只显示第一批;你可以输入内容来筛选特定地址。
第 1 步:基本信息
第 2 步:网络
第 3 步:基础设施
此步骤分为两部分:HCS 基础设施资源和控制平面负载均衡器。
基础设施资源:
控制平面负载均衡器:HCS provider 会为 Kubernetes API server 创建一个 Elastic Load Balance (ELB),并拥有其 VIP。Hybrid Load Balancing 需要固定的 L4 和 L7 虚拟子网 IP。
第 4 步:控制平面节点池
为保证高可用,控制平面节点池固定为 3 个副本。
Machine Config 条目
Machine Configs 中的每一条配置描述一个节点:
- Hostname(必需):小写字母、数字、连字符和点,最长 253 个字符(例如
master-1或master-1.example.org)。关于带点的 hostname 如何影响节点,请参阅 节点上的 hostname 行为。 - Networks(必需):每个 NIC 一行。每行包含一个 IP Address 选择器和一个 Subnet Name。多 NIC 节点请添加多行。
- Persistent Disks:平台要求的
/var/cpaas磁盘已预填;其大小可调整,但该行不能删除。仅在需要额外的、必须在节点重建后仍保留的宿主机绑定数据时添加条目。
第 5 步:工作节点池
点击 Add Worker Node Pool 打开节点池对话框。你可以添加多个节点池。
第 6 步:审查
检查 Basic Info、Infrastructure、Control Plane Load Balancer、Control Plane Node Pool、Worker Node Pools 和 Networking 各部分。点击 View YAML 查看将要创建的确切资源。点击 Create 开始创建集群。
使用 YAML
集群创建概览
从高层次来看,你需要在 的 global 集群中创建以下 Cluster API resources,以便配置基础设施并引导出一个可运行的 Kubernetes 集群。
在编写本页中的任何 YAML 之前,请先完成 Huawei Cloud Stack 的基础设施资源 中的准备清单。该清单涵盖了 provider 预期的值、这些值的获取方式,以及在填写 manifests 之前必须提前规划的值。
重要的命名空间要求
为确保与 以业务集群方式正确集成,所有资源都必须部署在 cpaas-system 命名空间中。将资源部署到其他命名空间可能会导致集成问题。
工作负载集群命名
工作负载 cluster-name 不能 为 global。该名称保留给 global 集群,重复使用会导致工作负载集群的资源与 cpaas-system 中的 global 集群资源冲突。global- 前缀保留给 global 集群的 DR 工作流所拥有的资源;请参阅 常见前提条件。不要将 global- 用于工作负载集群资源,因为故障切换操作可能会将这些资源当作属于 global 集群来选择。
作为约定,请将 CAPI Cluster 和 provider cluster resource(HCSCluster)名称保持为精确的 <cluster-name>,并将非根 CAPI 和 provider 资源(KubeadmControlPlane、KubeadmConfigTemplate、MachineDeployment、machine templates、machine config pools 等)以前缀 <cluster-name>- 命名——例如,示例 manifests 使用 <cluster-name>-kcp。这是一项建议,而不是 controller 强制的规则,但它可以避免多个工作负载集群共存于 cpaas-system 时发生同名冲突,并使运维过程中资源归属更加清晰。
集群创建过程按以下顺序进行:
- 配置 HCS 身份认证(Secret)
- 创建 machine configuration pool(HCSMachineConfigPool)
- 配置 machine template(HCSMachineTemplate)
- 配置 KubeadmControlPlane
- 配置 HCSCluster
- 创建 Cluster
控制平面配置
控制平面负责管理集群状态、调度以及 Kubernetes API。此部分说明如何配置高可用控制平面。
配置参数指南
在配置资源时,请谨慎修改参数:
- 仅替换用
<>包裹的值为你的环境特定值 - 保留所有其他参数,因为它们表示经过优化或必需的配置
- 修改非占位符参数可能导致集群不稳定或集成问题
配置 HCS 身份认证
HCS 身份认证信息存储在 Secret 资源中。
现有的、未设置 schema 的凭证 Secret 仍可正常使用。只有当你的 HCS IAM endpoint 使用 http 而不是默认的 https 时,才需要设置 schema。
你可以复用现有的 HCS 凭证 Secret。其名称不必与集群名称一致,但 HCSCluster.spec.identityRef.name 必须引用该 Secret。
配置 Machine Configuration Pool
HCSMachineConfigPool 定义了预配置的 hostname、静态 IP 地址,以及适用于 VM 的、由节点池管理的持久化磁盘。
节点池大小要求
配置池必须至少包含你计划部署的控制平面节点数量相同的条目数。
每个 networks[] 条目使用一个 subnet selector。对于新 manifests,请设置 subnetName 或 subnetId 其中之一,但不要同时设置两者。现有 manifests 可以保留已废弃的 subenetName 字段;如果你在更新该 manifest 时还添加了 subnetName,其值必须与 subenetName 完全一致。不要在 subenetName、subnetName 和 subnetId 之间提供冲突值。
如果你在 machine configuration pool 中使用 subnetName,请在 HCSCluster.spec.network.subnets 中包含相同的子网名称。
对于初始集群创建流程,仅按名称列出现有子网即可,因为 controller 会在集群变为 Ready 之前解析子网元数据。如果你之后要向一个已存在且处于 Ready 状态的 HCSCluster 添加另一个子网,不要只追加 name。请将完整的子网对象 patch 到父级 HCSCluster.spec.network.subnets 条目中,以便后续的 machine 或 ELB 操作可以复用已解析的子网元数据。
*对于新 manifests,请设置 subnetName 或 subnetId 其中之一。现有 manifests 可以继续使用 subenetName,并且只有在两个字段值相同的情况下才可以添加 subnetName。不要提供冲突的 subnet selector 值。
如果指定了 persistentDisks,则持久化磁盘字段为必需。
对于必须在 VM 替换后仍保留的节点本地状态,请使用 persistentDisks[]。不要在 HCSMachineTemplate.spec.template.spec.dataVolumes[] 中声明相同的挂载路径。
注意: CRD schema 将 subnetName、subenetName 和 subnetId 列为可选字段,但未表达它们允许的组合关系。编写 manifests 时,请遵循上述 provider 级规则。
注意: 若要为单个节点挂载多个 NIC,请添加多个 networks[] 条目。provider 仅使用这些条目来挂载 NIC,并分配 subnet selectors 和静态 IP。它不支持声明每个 NIC 的角色、默认网关、静态路由或每个 NIC 的 DNS 设置。
节点上的 hostname 行为
provider 会按如下方式从 hostname 派生节点的 POSIX hostname 和 FQDN:
带点格式适用于需要依赖 FQDN 解析的应用(hostname -f、带 SAN 条目的证书、日志标签)。当提供带点的 hostname 时,provider 会设置 prefer_fqdn_over_hostname: false 并启用 cloud-init manage_etc_hosts,因此 POSIX 工具仍然看到短名称,而 hostname -f 返回完整 FQDN。
无效 hostname(前导点、尾随点、全由点组成的字符串、大写字母,或任何违反字段约束的内容)会在 VM 启动前被拒绝。错误会设置在所属的 Machine.status 上,并在 Cluster.status.conditions 中显现,因此你可以通过 kubectl describe cluster <name> 和 kubectl get machines -n cpaas-system -o wide 查看。
配置 Machine Template
HCSMachineTemplate 定义了控制平面节点的 VM 规格。
存储要求
建议控制平面节点使用以下数据盘挂载点:
/var/lib/etcd- etcd 数据(10GB+)/var/lib/kubelet- kubelet 数据(100GB+)/var/lib/containerd- container runtime 数据(100GB+)
/var/cpaas 路径用于存储平台状态和日志。当它必须在 VM 替换后仍然保留时,请将其声明在 HCSMachineConfigPool.spec.configs[].persistentDisks[] 中。
*在指定 dataVolumes 时必需。
dataVolumes[] 会随 ECS 一起重新创建。不要将其用于 /var/cpaas 或任何其他必须在滚动替换后仍然保留的路径。请将这些路径放入 HCSMachineConfigPool.spec.configs[].persistentDisks[]。
注意: 不要在 HCSMachineTemplate manifests 中设置诸如 providerID 或 serverId 之类的运行时身份字段。provider 会在创建 HCS 实例时分配这些值。
注意: 租户管理员无法从 HCS UI 中获取 provider 可识别的 flavorName 和 availabilityZone 值。在应用 manifest 之前,请先从 HCS 管理员处获取准确值。
配置 KubeadmControlPlane
KubeadmControlPlane 定义了 Kubernetes 控制平面配置。
imagePullCredentialsVerificationPolicy: NeverVerify 仅从 Kubernetes 1.35 开始必需。使用 Kubernetes 1.34 或更早版本创建集群时,请省略此参数。
HCS controller 在解析 cloud-init 数据时还会注入文件。它会为控制平面机器写入 /etc/kubernetes/pki/kubelet.crt、/etc/kubernetes/pki/kubelet.key 和 /etc/kubernetes/encryption-provider.conf。对于第一台控制平面机器,controller 会生成 encryption provider 配置。在控制平面初始化之后,它会尝试复用现有的 kube-apiserver encryption provider 配置。如果你在 /etc/kubernetes/encryption-provider.conf 中包含了一个 bootstrap 文件,请将其视为占位符,因为 controller 生成或同步的文件具有更高优先级。
注意: 请同时配置 apiServer.extraArgs 和 apiServer.extraVolumes。如果该 volume 未挂载,kube-apiserver 将无法读取 /etc/kubernetes 下写入的文件。
注意: 上面的 rolloutStrategy.rollingUpdate.maxSurge: 0 示例适用于具有静态 IP 的高可用控制平面。对于至少有三个副本的固定规模控制平面池,请保留此设置,以便替换过程按先缩容再扩容的顺序进行。如果你创建的是单控制平面 HCS 集群(spec.replicas: 1),请不要把 rolloutStrategy 块复制到创建 manifest 中。KubeadmControlPlane 的校验会拒绝单副本场景下这种缩容式 rollout 配置。
注意: HCS 还支持通过设置 spec.replicas: 1 并在引用的 HCSMachineConfigPool 中准备一条控制平面配置来创建单控制平面集群。请将其视为仅用于创建的拓扑,并在该创建 manifest 中保持 rollout strategy 未设置。本文档中的升级流程不支持单控制平面 HCS 集群。
仅将 OS 支持矩阵 用于其明确列出的组件版本,例如受支持 Alauda OS 镜像的 coredns 和 etcd image tags。它并不是所有 HCS manifest 值的完整来源。在应用此 YAML 之前,还需要使用批准的 release baseline 获取诸如 imageRepository、DNS image repository、Kube-OVN version、Kube-OVN join CIDR、Pod CIDR 和 Service CIDR 等值。
配置 HCSCluster
HCSCluster resource 定义 HCS 基础设施配置。
HCS provider 会在 HCS 平台上为 Kubernetes API server 创建一个 Elastic Load Balance (ELB)。该 ELB 必须保持启用 Hybrid Load Balancing,这样集群节点才能通过 ELB 地址访问 API server。
对于本文档中的 HCS 工作流,请提供 vipAddress、elbVirsubnetL4Ips 和 elbVirsubnetL7Ips。每个 elbVirsubnetL4Ips[].ips 和 elbVirsubnetL7Ips[].ips 条目都必须包含两个 IP。
如果设置了 vipDomainName,请配置 HCS Cloud DNS Private Zones,使该域名解析到 vipAddress。
在任何地方引用子网之前,请先在 spec.network.subnets 中列出集群使用的每个子网。vipSubnetName、elbVirsubnetL4Ips[].subnetName、elbVirsubnetL7Ips[].subnetName 以及 HCSMachineConfigPool 中使用的 subnetName 值都必须存在于 spec.network.subnets 中。
对于初始集群创建流程,controller 可以从 name 解析现有子网元数据。对于已有的 Ready 集群,请追加完整的子网对象,而不是只追加 name。同时包含 id,并为控制平面 ELB 将使用的任何子网包含 neutronSubnetId。子网清单中还应保留 cidr、gatewayIp、primaryDNS 和 secondaryDNS。
在集群创建完成后,不要禁用 provider 创建的 ELB 上的 Hybrid Load Balancing。集群依赖该 ELB 模式,以便节点能够通过 ELB 地址访问 API server。
创建 manifest 中不要包含 spec.controlPlaneEndpoint。在 HCS 创建流程中,controller 会在创建 HCSCluster 后,从 spec.controlPlaneLoadBalancer 派生并填充此字段。不要手动设置 controlPlaneEndpoint,也不要添加空的 controlPlaneEndpoint 对象。如果 manifest 中显式存在 controlPlaneEndpoint,它必须同时包含 host 和 port。
controlPlaneHA 是可选项。包含它时,enabled 和 policy 都是必需的。使用 anti-affinity 实现严格的主机隔离。若你希望节点尽量分散在不同主机上,但又不希望因为 HCS 无法满足硬性放置规则而导致 ECS 创建失败,请使用 soft-anti-affinity。有关规划指导,包括在现有集群上启用该功能时所需的滚动替换要求,请参阅 控制平面 HA 放置计划。
配置 Cluster
Cluster API 中的 Cluster resource 用于声明集群,并引用控制平面和基础设施资源。
集群验证
部署完所有集群资源后,请验证集群是否已成功创建。
使用 kubectl
验证控制平面 HA
如果你启用了 HCSCluster.spec.controlPlaneHA,请先检查 HCSCluster condition:
按如下方式解释该 condition:
检查观察到的 server group 和成员快照:
对于 anti-affinity,HCS 会将 server group 策略视为硬性调度约束。如果容量不足,ECS 创建可能失败,此时应首先根据 condition 消息进行排查。对于 soft-anti-affinity,HCS 会尽量分散成员,但仍可能将多个 ECS 实例放置在同一主机上。
预期结果
成功创建的集群应显示:
- 集群状态:Running 或 Provisioned
- 所有控制平面机器:Running
- Kubernetes nodes:Ready
- Cluster Module Status:Completed
添加工作节点
有关向集群添加工作节点的说明,请参阅 管理节点。
升级集群
有关升级集群组件的说明,请参阅 升级集群。
故障排查
如果集群已达到 Provisioned 但始终未变为 Ready——例如,由于 CNI 未部署导致工作负载节点一直处于 NotReady——请先参考与 provider 无关的 排查工作负载集群卡在 Provisioned 状态。
对于 HCS 特有的失败模式(例如,由于带点的 HCSMachineConfigPool hostname 生成了包含点的 POSIX hostname,导致 kubeadm init 一直无法完成),请参阅 排查 Huawei Cloud Stack 工作负载集群故障。