在 Huawei Cloud Stack 上创建集群
本文档提供了使用 Cluster API 在 Huawei Cloud Stack 平台上创建 Kubernetes 集群的完整说明。
目录
前提条件1. 安装所需插件2. 准备 HCS 基础设施输入集群创建概览控制平面配置配置 HCS 身份认证配置 Machine Configuration Pool节点上的主机名行为配置 Machine Template配置 KubeadmControlPlane配置 HCSCluster配置 Cluster集群验证使用 kubectl预期结果添加 Worker 节点升级集群故障排查前提条件
在创建集群之前,请确保满足以下所有前提条件:
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 - 控制平面和 worker 节点的静态 IP 池规划
完整的检查清单、来源信息和约束条件请参见 Huawei Cloud Stack 的基础设施资源。
集群创建概览
从高层来看,你将在 的 global 集群中创建以下 Cluster API 资源,以便部署基础设施并引导一个可用的 Kubernetes 集群。
在编写本页中的任何 YAML 之前,请先完成 Huawei Cloud Stack 的基础设施资源 中的准备检查清单。该清单涵盖了 provider 期望的值、这些值的获取方式,以及在填写 manifest 之前必须提前规划的字段。
重要的命名空间要求
为确保与 作为业务集群正确集成,所有资源都必须部署在 cpaas-system 命名空间中。将资源部署到其他命名空间可能会导致集成问题。
Workload 集群命名
workload cluster-name 不能 为 global。该名称是为 global 集群保留的,重复使用会导致 workload 集群资源与 cpaas-system 中的 global 集群资源发生冲突。global- 前缀保留给 global 集群 DR 工作流所拥有的资源;请参见 通用前提条件。不要将 global- 用于 workload 集群资源,因为故障切换操作可能会将这些资源视为属于 global 集群。
作为约定,请将 CAPI Cluster 和 provider 集群资源(HCSCluster)命名为完全相同的 <cluster-name>,并将非根级 CAPI 和 provider 资源(KubeadmControlPlane、KubeadmConfigTemplate、MachineDeployment、machine 模板、machine config pool 等)统一以前缀 <cluster-name>- 命名——例如,示例 manifest 使用 <cluster-name>-kcp。这是一项建议,而非 controller 强制规则,但它可以防止多个 workload 集群同时存在于 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 定义了预配置的主机名、静态 IP 地址,以及由 pool 管理的 VM 持久化磁盘。
Pool 大小要求
该配置池至少必须包含与你计划部署的控制平面节点数量相同的条目。
为 networks[] 中的每个条目使用一个 subnet selector。对于新 manifest,请设置 subnetName 或 subnetId,但不要同时设置两者。现有 manifest 可以保留已弃用的 subenetName 字段;如果你在更新该 manifest 时同时添加 subnetName,则其值必须与 subenetName 完全一致。不要在 subenetName、subnetName 和 subnetId 之间提供冲突值。
如果你在 machine configuration pool 中使用 subnetName,请在 HCSCluster.spec.network.subnets 中包含相同的子网名称。
对于初始集群创建流程,仅按名称列出一个现有子网即可,因为 controller 会在集群变为 Ready 之前解析子网元数据。如果你之后向一个已处于 Ready 状态的 HCSCluster 中新增另一个子网,不要只追加 name。请用完整的子网对象补丁更新父级 HCSCluster.spec.network.subnets 条目,这样后续的 machine 或 ELB 操作就可以复用已解析的子网元数据。
*对于新 manifest,请设置 subnetName 或 subnetId 其中之一。现有 manifest 可以继续使用 subenetName,并且仅当两个字段使用相同值时才可添加 subnetName。不要提供冲突的 subnet selector 值。
如果指定了 persistentDisks,则持久化磁盘字段为必填。
对于必须在 VM 替换后仍然保留的节点本地状态,请使用 persistentDisks[]。不要在 HCSMachineTemplate.spec.template.spec.dataVolumes[] 中声明相同的挂载路径。
注意: CRD schema 将 subnetName、subenetName 和 subnetId 列为可选字段,但没有表达它们允许的组合关系。编写 manifest 时,请遵循上面的 provider 级规则。
注意: 若要为一个节点挂载多个 NIC,请添加多个 networks[] 条目。provider 只使用这些条目来挂载 NIC,并分配 subnet selector 以及静态 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 manifest 中设置诸如 providerID 或 serverId 之类的运行时身份字段。provider 会在创建 HCS 实例时分配这些值。
注意: 租户管理员无法从 HCS UI 中获取 provider 可识别的 flavorName 和 availabilityZone 值。在应用 manifest 之前,请从 HCS 管理员处获取准确值。
配置 KubeadmControlPlane
KubeadmControlPlane 定义了 Kubernetes 控制平面配置。
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 镜像 tag。它并不是所有 HCS manifest 值的完整来源。在应用此 YAML 之前,还请使用已批准的发布基线来获取诸如 imageRepository、DNS image repository、Kube-OVN version、Kube-OVN join CIDR、Pod CIDR 和 Service CIDR 等值。
配置 HCSCluster
HCSCluster 资源定义了 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。
配置 Cluster
Cluster API 中的 Cluster 资源用于声明集群,并引用控制平面和基础设施资源。
集群验证
部署完所有集群资源后,请验证集群是否已成功创建。
使用 kubectl
预期结果
成功创建的集群应显示:
- Cluster 状态:Running 或 Provisioned
- 所有控制平面机器:Running
- Kubernetes 节点:Ready
- Cluster Module 状态:Completed
添加 Worker 节点
有关向集群添加 worker 节点的说明,请参阅 管理节点。
升级集群
有关升级集群组件的说明,请参阅 升级集群。
故障排查
如果集群已经达到 Provisioned,但一直无法变为 Ready——例如,由于 CNI 未部署导致 workload 节点一直处于 NotReady——请先参考与 provider 无关的 Workload 集群卡在 Provisioned 状态的故障排查。
对于 HCS 特有的失败模式(例如,由于带点的 HCSMachineConfigPool 主机名生成了包含点的 POSIX 主机名,导致 kubeadm init 一直无法完成),请参阅 Huawei Cloud Stack Workload 集群故障排查。