在 Huawei Cloud Stack 上创建集群
本文介绍如何在 Huawei Cloud Stack 平台上创建 Kubernetes 集群。基于 YAML 的集群创建可通过 Cluster API manifest 在任何受支持的 provider 版本上使用。如果已安装 Fleet Essentials 1.0.2 或更高版本,且 Alauda Container Platform HCS Infrastructure Provider 为 v1.0.3 或更高版本,还可以通过引导式 Web UI 创建集群。
Web UI 提供了包含内置验证的引导式工作流,而 YAML 则提供了更灵活的自动化能力。
目录
前提条件1. 安装所需插件2. 准备 HCS 基础设施输入3. 注册 OS Release4. 业务集群镜像仓库5. 节点标签和污点使用 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 和组件版本,而是从你注册的 OS-release ConfigMap 中读取这些信息。每个 Alauda OS 镜像只需注册一次。向导从 global 集群解析平台 Distribution 版本,查找其 supportedACPVersions 包含该 Distribution 的已注册 OS 镜像,并从中获取节点镜像和控制平面组件版本。
如果没有已注册的 OS 镜像与当前 Distribution 匹配,向导会阻止创建并显示类似以下错误:
No OS registered for the current platform Distribution v4.3.2. Register an OS-release ConfigMap first.
打开向导前,请在 global 集群上注册 OS 镜像:
使用 kubectl apply -f os-release.yaml 应用它。
字段来源:
不要向此 ConfigMap 添加 Kube-OVN 版本。向导从 global 集群的 Kube-OVN 配置中读取 Kube-OVN 版本,而不是从 OS 镜像中读取。
osImageVersion 必须指定 HCS 平台上已存在的镜像。要读取已有集群环境中使用的确切名称,请列出现有 machine template:
4. 业务集群镜像仓库
确定此集群从哪个 registry 拉取其平台组件 — Kube-OVN 以及 Alauda Container Platform 在集群上安装的平台模块。此选择不会影响 kubeadm 管理的镜像,这些镜像来自 KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.imageRepository。
无论采用哪种方式,registry 中都必须已包含目标版本的 Alauda Container Platform Core,以及你计划在此集群上安装的每个平台插件所需的软件包,并且每个业务集群节点都必须能够访问其地址。
有关专用 registry 的操作步骤及其限制,请参阅为业务集群选择镜像仓库。
专用 registry 只能通过 YAML 配置。Web UI 向导始终使用 global 集群的 registry:它从 global 集群读取该地址,并代你将其写入新集群,而且不提供可供选择的 registry 凭证。当此集群需要使用自己的 registry 时,请使用使用 YAML。
该绑定也仅在首次创建集群时读取。在现有 Cluster 上更改或删除 cpaas.io/registry-reference,不会将该集群迁移到其他 registry。
5. 节点标签和污点
如果要为某个节点池的节点设置专属标签、注解或污点 — 例如为监控、日志记录或 ingress 预留专用池 — 请按照在节点上配置注解、标签和污点 中的说明,在该节点池的资源上声明这些内容。请在创建节点池之前进行规划:只有在 capi-controller-manager 上启用标签同步后,Machine 标签才会传递到其 Node,该页面也介绍了相关内容。无论通过 Web UI 还是 YAML 创建集群,这一要求都适用于每个节点池;Web UI 的节点池步骤不会设置标签或污点。
使用 Web UI
版本要求:此操作流程要求 Fleet Essentials 1.0.2 或更高版本,以及 Alauda Container Platform HCS Infrastructure Provider v1.0.3 或更高版本。如果 provider 版本早于 v1.0.3,请使用使用 YAML中所述的 YAML 清单创建集群。
Web UI 使用你选择的 Infrastructure Credential,从 HCS 平台加载 VPC、子网、安全组、flavor 和可分配的 IP 地址。开始之前,请确保已满足上述先决条件,并且 cpaas-system 命名空间中存在 HCS 凭证 Secret。
创建流程
集群创建遵循一个包含 6 个步骤的向导:
导航:集群 → 集群 → 创建集群 → 选择 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。混合负载均衡要求固定的 L4 和 L7 虚拟子网 IP。
第 4 步:控制平面节点池
为实现高可用性,控制平面节点池固定为 3 个副本。
Machine Config 条目
Machine Configs 中的每个条目描述一个节点:
- Hostname (必填):小写字母、数字、连字符和点,最多 253 个字符(例如
master-1或master-1.example.org)。点号主机名如何影响节点,请参阅节点上的主机名行为。 - Networks (必填):每个 NIC 对应一行。每行包含一个 IP Address 选择器和一个 Subnet Name。对于多 NIC 节点,请添加多个行。
- Persistent Disks:平台要求的
/var/cpaas磁盘会预先填充;可以调整其大小,但不能删除该行。只有对于必须在节点重建后保留的其他主机绑定数据,才应添加行。
第 5 步:工作节点池
点击添加工作节点池以打开节点池对话框。你可以添加多个节点池。
第 6 步:审核
审核 Basic Info、Infrastructure、Control Plane Load Balancer、Control Plane Node Pool、Worker Node Pools 和 Networking 部分。点击查看 YAML以检查将要创建的确切资源。点击创建以开始集群创建流程。
使用 YAML
集群创建概述
总体而言,你将在 的 global 集群中创建以下 Cluster API 资源,以预配基础设施并引导一个正常运行的 Kubernetes 集群。
在本页编写任何 YAML 之前,请完成华为云 Stack 基础设施资源中的准备清单。此清单涵盖 provider 所需的值、这些值的获取方式,以及在填写清单前必须规划的值。
重要的命名空间要求
为确保与 作为业务集群正确集成,所有资源都必须部署在 cpaas-system 命名空间中。在其他命名空间中部署资源可能会导致集成问题。
业务集群命名
业务 cluster-name 不得为 global。此名称保留给 global 集群,重复使用该名称会导致业务集群的资源与 global 集群在 cpaas-system 中的资源发生冲突。global- 前缀保留给 global 集群的 DR 工作流所拥有的资源;请参阅通用前提条件。不要将 global- 用于业务集群资源,因为故障转移操作可能会将这些资源选为属于 global 集群的资源。
作为约定,请将 CAPI Cluster 和 provider 集群资源(HCSCluster)的名称均严格设置为 <cluster-name>,并为非根 CAPI 和 provider 资源(KubeadmControlPlane、KubeadmConfigTemplate、MachineDeployment、machine template、machine config pool 等)添加 <cluster-name>- 前缀——例如,示例清单使用 <cluster-name>-kcp。这是一项建议,并非由控制器强制执行的规则,但它可以避免多个业务集群位于 cpaas-system 时发生同一命名空间内的冲突,并使操作期间的资源归属更加清晰。
集群创建流程按以下顺序进行:
- 配置 HCS 身份验证(Secret)
- 创建 machine configuration pool(HCSMachineConfigPool)
- 配置 machine template(HCSMachineTemplate)
- 配置 KubeadmControlPlane
- 配置 HCSCluster
- 创建 Cluster
控制平面配置
控制平面负责管理集群状态、调度和 Kubernetes API。本节介绍如何配置高可用控制平面。
配置参数指南
配置资源时,修改参数需要谨慎:
- 仅替换
<>中包含的值,将其替换为特定于你环境的值 - 保留所有其他参数,因为它们代表经过优化或必需的配置
- 修改非占位符参数可能导致集群不稳定或集成问题
配置 HCS 身份验证
HCS 身份验证信息存储在 cpaas-system 中的 Secret 资源内。
请使用编辑器编写凭证文件,而不要在 shell 提示符中输入这些值。shell 会将包含 Secret 密钥在内的完整命令记录到历史记录中;使用编辑器写入的文件不会留下此类副本。
限制文件权限,从文件创建 Secret,然后将其删除:
以纯文本形式写入这些值——kubectl 会在创建 Secret 时对其进行 base64 编码,因此无需单独执行编码步骤。每行均为 key=value。不要为值添加引号:kubectl 会将引号字符按字面值处理。值中可以包含 =;每行中只有第一个 = 用于分隔键和值。
客户端 apply 会将其应用的清单(包括 HCS Secret 密钥)存储在 Secret 自身的 kubectl.kubernetes.io/last-applied-configuration 注解中。kubectl create 不会写入此类注解。无论值是以 stringData 形式还是以 base64 data 形式写入,这一规则都适用;base64 是编码方式,而不是保护措施。
未包含 schema 创建的现有凭证 Secret 仍可照常工作,无需进行任何更改。仅当你的 HCS IAM endpoint 使用 http 而非默认的 https 时,才设置 schema。
你可以重复使用现有的 HCS 凭证 Secret。其名称无需与集群名称匹配,但 HCSCluster.spec.identityRef.name 必须引用此 Secret。
配置 Machine Configuration Pool
HCSMachineConfigPool 定义预配置的主机名、静态 IP 地址以及由池管理的 VM 持久磁盘。
池大小要求
配置池必须至少包含与你计划部署的控制平面节点数量相等的条目。
每个 networks[] 条目使用一个子网选择器。对于新清单,请设置 subnetName 或 subnetId,但不能同时设置两者。现有清单可以保留已弃用的 subenetName 字段;如果在更新该清单时同时添加 subnetName,其值必须与 subenetName 完全一致。不要在 subenetName、subnetName 和 subnetId 之间提供冲突的值。
如果在 machine configuration pool 中使用 subnetName,请在 HCSCluster.spec.network.subnets 中包含相同的子网名称。
对于初始集群创建流程,只需按名称列出现有子网即可,因为控制器会在集群变为 Ready 之前解析子网元数据。如果稍后向现有的 Ready HCSCluster 添加另一个子网,请不要只追加 name。请使用完整的子网对象修补父级 HCSCluster.spec.network.subnets 条目,以便后续 machine 或 ELB 操作可以重复使用已解析的子网元数据。
*对于新清单,请设置 subnetName 或 subnetId。现有清单可以继续使用 subenetName,并且只有在两个字段的值相同时,才可以添加 subnetName。请勿提供相互冲突的子网选择器值。
指定 persistentDisks 时,必须填写持久磁盘字段。
对于 VM 替换后必须保留的节点本地状态,请使用 persistentDisks[]。请勿在 HCSMachineTemplate.spec.template.spec.dataVolumes[] 中声明相同的挂载路径。
注意: CRD 架构将 subnetName、subenetName 和 subnetId 列为可选字段,且未规定它们允许的组合。编写清单时,请遵循上述 provider 级规则。
注意: 若要为一个节点挂载多个 NIC,请添加多个 networks[] 条目。provider 仅使用这些条目来挂载 NIC、指定子网选择器和静态 IP。它不支持声明每个 NIC 的角色、默认网关、静态路由或每个 NIC 的 DNS 设置。
节点上的主机名行为
provider 根据 hostname 推导节点的 POSIX 主机名和 FQDN,具体如下:
含点格式适用于配置依赖 FQDN 解析的应用程序(hostname -f、包含 SAN 条目的证书、日志标签)。仅当提供了含点的主机名时,provider 才会设置 prefer_fqdn_over_hostname: false 并启用 cloud-init manage_etc_hosts,因此 POSIX 工具仍会看到短名称,而 hostname -f 会返回完整 FQDN。
无效主机名(开头为点、结尾为点、仅包含点的字符串、大写字母或任何违反字段约束的值)会在 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- 容器运行时数据(100GB+)
/var/cpaas 路径用于存储平台状态和日志。若该路径必须在 VM 替换后保留,请在 HCSMachineConfigPool.spec.configs[].persistentDisks[] 中声明。
*指定 dataVolumes 时必填。
dataVolumes[] 会随 ECS 一起重新创建。不要将它们用于 /var/cpaas 或任何必须在滚动替换后保留的其他路径。请将这些路径放入 HCSMachineConfigPool.spec.configs[].persistentDisks[]。
注意:不要在 HCSMachineTemplate 清单中设置 providerID 或 serverId 等运行时身份字段。Provider 会在创建 HCS 实例时分配这些值。
注意:ACP Web UI 会通过所选 HCS 凭证加载规格和可用区。编写 YAML 时,请向 HCS 管理员获取 Provider 可识别的确切 Flavor.Name 和 ZoneName 值,因为原生 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 会生成加密 Provider 配置。控制平面初始化后,它会尝试重新使用现有的 kube-apiserver 加密 Provider 配置。如果在 /etc/kubernetes/encryption-provider.conf 中包含引导文件,请将其视为占位符,因为 controller 生成或同步的文件优先级更高。
注意:请同时配置 apiServer.extraArgs 和 apiServer.extraVolumes。如果未挂载该卷,kube-apiserver 将无法读取写入 /etc/kubernetes 下的文件。
注意:上面的 rolloutStrategy.rollingUpdate.maxSurge: 0 示例适用于高可用静态 IP 控制平面。对于至少包含三个副本的固定大小控制平面池,请保留此设置,以便替换按先缩容后扩容的顺序进行。如果创建单控制平面 HCS 集群(spec.replicas: 1),请勿将 rolloutStrategy 块复制到创建清单中。KubeadmControlPlane 验证会拒绝单副本使用这种缩容式发布配置。
注意:HCS 还支持通过设置 spec.replicas: 1,并在所引用的 HCSMachineConfigPool 中准备一个控制平面配置条目来创建单控制平面集群。请将其视为仅用于创建的拓扑,并在该创建清单中不设置发布策略。本文档中的升级流程不支持单控制平面 HCS 集群。
仅将OS 支持矩阵用于其中明确列出的组件版本,例如受支持 Alauda OS 镜像的 coredns 和 etcd 镜像标签。它不是所有 HCS 清单值的完整来源。在应用此 YAML 前,还应使用已批准的版本基线来确定 imageRepository、DNS 镜像仓库、Kube-OVN 版本、Kube-OVN 加入 CIDR、Pod CIDR 和 Service CIDR 等值。
配置 HCSCluster
HCSCluster 资源定义 HCS 基础设施配置。
HCS Provider 会在 HCS 平台上为 Kubernetes API 服务器创建弹性负载均衡(ELB)。必须保持启用 Hybrid Load Balancing,以便集群节点也可以通过 ELB 地址访问 API 服务器。
对于文档所述的 HCS 流程,请提供 vipAddress、elbVirsubnetL4Ips 和 elbVirsubnetL7Ips。每个 elbVirsubnetL4Ips[].ips 和 elbVirsubnetL7Ips[].ips 条目必须包含两个 IP。
请将 vipDomainName 保持未设置状态——不支持通过域名访问集群;请参阅下面的字段表。
在其他任何位置引用集群子网之前,请先在 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 服务器。
请勿在创建清单中包含 spec.controlPlaneEndpoint。在 HCS 创建流程中,controller 会在创建 HCSCluster 后,根据 spec.controlPlaneLoadBalancer 派生并填充此字段。请勿手动设置 controlPlaneEndpoint,也不要添加空的 controlPlaneEndpoint 对象。如果清单中显式包含 controlPlaneEndpoint,则必须同时包含 host 和 port。
controlPlaneHA 是可选的。包含该字段时,必须同时设置 enabled 和 policy。需要严格隔离主机时,请使用 anti-affinity。如果希望分散主机、但不希望 ECS 创建仅因 HCS 无法满足硬性放置规则而失败,请使用 soft-anti-affinity。有关规划指导(包括在现有集群中启用此功能时的滚动替换要求),请参阅控制平面 HA 放置计划。
配置 Cluster
Cluster API 中的 Cluster 资源声明集群,并引用控制平面资源和基础设施资源。
集群验证
部署所有集群资源后,验证集群是否已成功创建。
使用 kubectl
验证控制平面 HA
如果启用了 HCSCluster.spec.controlPlaneHA,请先检查 HCSCluster 条件:
请按以下方式解读该条件:
检查已观测到的服务器组及成员关系快照:
对于 anti-affinity,HCS 将服务器组策略视为硬性调度约束。如果容量不足,ECS 创建可能会失败,此时应首先根据条件消息进行诊断。对于 soft-anti-affinity,HCS 会尝试分散成员,但仍可能将多个 ECS 实例放置在同一主机上。
预期结果
成功创建的集群应显示:
- 集群状态:Running 或 Provisioned
- 所有控制平面计算机:Running
- Kubernetes 节点:Ready
- Cluster Module 状态:Completed
添加工作节点
有关向集群添加工作节点的说明,请参阅管理节点。
升级集群
有关升级集群组件的说明,请参阅升级集群。
故障排除
如果集群达到 Provisioned,但始终未变为 Ready(例如,由于未部署 CNI,业务节点一直处于 NotReady),请先参阅适用于所有 provider 的排查卡在 Provisioned 状态的业务集群。
有关 HCS 特有的故障模式(例如,带点号的 HCSMachineConfigPool 主机名生成了包含点号的 POSIX 主机名,导致 kubeadm init 始终无法完成),请参阅排查 Huawei Cloud Stack 业务集群问题。