华为云云容器引擎CCE实战:从集群创建到HPA弹性伸缩
一、背景:为什么选择托管 Kubernetes
容器化已经成为应用交付的事实标准,但自建 Kubernetes 集群需要自己维护控制面(etcd、apiserver、调度器)、处理证书轮换、升级版本、排查网络插件问题,运维成本很高。对于大多数业务团队来说,真正关心的是“把应用稳定地跑起来、能弹性伸缩、出了问题能快速定位”,而不是维护集群本身。
华为云 云容器引擎 CCE(Cloud Container Engine) 提供高可用的托管 Kubernetes 控制面,用户只需管理工作节点和业务负载,同时与镜像仓库、负载均衡、云监控等服务深度集成。本文以“部署一个无状态 Web 服务并让它随流量自动伸缩”为主线,介绍创建集群与节点池、从镜像仓库拉取镜像、创建 Deployment 与 LoadBalancer 类型 Service、配置 HPA 弹性伸缩以及日常运维建议的完整过程。
二、核心概念
| 概念 | 说明 |
|---|---|
| 集群 | 一组控制面 + 工作节点的集合,CCE 负责托管控制面,可选单控制节点或多控制节点(高可用) |
| 节点 / 节点池 | 节点是运行容器的云服务器;节点池是一组规格、镜像、标签一致的节点,便于统一扩缩容与升级 |
| 工作负载 | 即 Kubernetes 中的 Deployment、StatefulSet、DaemonSet、Job 等,本文使用无状态的 Deployment |
| Service | 为一组 Pod 提供稳定的访问入口,类型有 ClusterIP、NodePort、LoadBalancer |
| 容器网络模型 | 常见有容器隧道网络、VPC 网络,以及 Turbo 集群使用的云原生网络 2.0,创建后不可更改 |
| HPA | Horizontal Pod Autoscaler,根据 CPU、内存等指标自动调整 Pod 副本数 |
三、准备工作
在开始之前,建议先确认以下几点:
- 网络规划:准备一个 VPC 和子网,集群节点将部署在该子网中。提前规划容器网段和服务网段,确保与 VPC 网段以及将来可能互通的其他网络不冲突;
- 镜像准备:将业务镜像推送到华为云容器镜像服务的组织(命名空间)中,记录完整的镜像地址;
- 权限:确保当前账号具备 CCE 及相关服务的操作权限,首次使用 CCE 时控制台会提示进行服务授权,按提示同意即可;
- 本地工具:安装 kubectl,后续用于通过命令行管理集群。
四、创建集群与节点池
4.1 创建集群
登录华为云控制台,进入“云容器引擎 CCE”,点击“购买集群”,主要配置项如下:
- 集群类型:一般业务选择 CCE Standard 集群;对网络性能要求较高的场景可以考虑 CCE Turbo 集群;
- 集群版本:选择控制台推荐的较新稳定版本,避免选择即将停止维护的版本;
- 控制节点数:生产环境建议选择多控制节点(高可用),测试环境可用单控制节点降低成本;
- 网络配置:选择 VPC、子网和容器网络模型,并填写容器网段。注意网络模型和网段在创建后通常无法修改,务必提前规划;
- 服务网段:用于 ClusterIP,保持默认或按规划填写即可。
确认配置后提交,集群创建一般需要若干分钟。
4.2 创建节点池
集群就绪后,进入集群详情,在“节点管理”中创建节点池,而不是零散地添加单个节点:
- 节点规格:根据业务资源需求选择通用型规格,测试可选较小规格;
- 操作系统:选择控制台支持的 EulerOS / HCE 等镜像;
- 数据盘:容器运行时和镜像会占用数据盘空间,适当预留容量;
- 节点数量:初始至少 2 个节点,并尽量分布在不同可用区,提升容灾能力;
- K8s 标签与污点:可以为节点池打上如
pool=web的标签,便于后续通过节点亲和性调度; - 弹性伸缩:如已安装集群弹性伸缩插件,可为节点池开启自动扩缩,配合 HPA 实现“Pod + 节点”两级弹性。
4.3 配置 kubectl
在集群详情页的“连接信息”中下载 kubeconfig 文件,放到本地 ~/.kube/config,然后验证:
kubectl get nodes -o wide
kubectl get pods -n kube-system
如果本地机器不在 VPC 内,需要为集群 API Server 绑定公网地址,并注意控制访问来源。
五、从镜像仓库拉取镜像
CCE 集群与华为云容器镜像服务在同一区域时,节点可以直接拉取该区域私有镜像,Kubernetes 中通常会自动创建一个名为 default-secret 的镜像拉取密钥。在 Deployment 中通过 imagePullSecrets 引用即可。
如果需要从其他仓库(例如自建 Harbor)拉取镜像,可以手动创建密钥:
kubectl create secret docker-registry my-registry \
--docker-server=<仓库地址> \
--docker-username=<用户名> \
--docker-password=<密码> \
-n default
建议镜像使用明确的版本标签(如 v1.2.0),不要依赖 latest,否则回滚和问题排查都会变得困难。
六、部署无状态工作负载
下面是一个完整的 Deployment + Service 示例,其中镜像地址请替换为自己的实际地址:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
labels:
app: web-demo
spec:
replicas: 2
selector:
matchLabels:
app: web-demo
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: web
image: <区域镜像仓库地址>/<组织名>/web-demo:v1.0.0
ports:
- containerPort: 8080
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
imagePullSecrets:
- name: default-secret
---
apiVersion: v1
kind: Service
metadata:
name: web-demo-svc
annotations:
kubernetes.io/elb.id: <已有负载均衡实例ID>
spec:
type: LoadBalancer
selector:
app: web-demo
ports:
- port: 80
targetPort: 8080
protocol: TCP
执行部署并查看状态:
kubectl apply -f web-demo.yaml
kubectl get deploy,pods,svc -l app=web-demo
kubectl describe svc web-demo-svc
几点说明:
- requests/limits 必须设置:HPA 按 CPU 使用率计算时依赖
requests,不设置会导致 HPA 无法工作; - 探针:readinessProbe 决定 Pod 何时接收流量,livenessProbe 决定何时重启容器,二者路径和时延要根据应用启动时间调整;
- 负载均衡对接:Service 的注解用于关联已有的负载均衡实例,具体注解名称和可选参数以 CCE 官方文档为准;也可以在控制台创建工作负载时通过“访问方式”页面图形化配置,降低出错概率;
- 若只需集群内部访问,Service 使用 ClusterIP 即可;七层路由需求可以使用 Ingress。
七、使用 HPA 实现弹性伸缩
HPA 依赖集群中的指标采集组件,在 CCE 中一般需要先在“插件中心”安装指标相关插件(如 metrics-server 或云原生监控插件)。安装完成后,创建 HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-demo-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-demo
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
behavior:
scaleDown:
stabilizationWindowSeconds: 300
验证伸缩效果:
kubectl apply -f web-demo-hpa.yaml
kubectl get hpa web-demo-hpa -w
# 另开终端施加压力,例如使用 hey / ab 等压测工具访问负载均衡地址
当平均 CPU 使用率超过 60% 时,副本数会逐步增加;压力消失后,经过稳定窗口再缓慢缩容。stabilizationWindowSeconds 可以避免副本数频繁抖动。若 Pod 扩容后因节点资源不足而处于 Pending 状态,就需要节点池的自动扩缩来补充节点。
八、滚动升级与回滚
更新镜像版本时,Deployment 默认采用滚动升级:
kubectl set image deployment/web-demo web=<镜像地址>/web-demo:v1.1.0
kubectl rollout status deployment/web-demo
# 出现问题时回滚
kubectl rollout undo deployment/web-demo
可以通过 maxSurge 与 maxUnavailable 控制升级节奏,配合就绪探针,确保新版本 Pod 就绪后才摘除旧 Pod,做到无感发布。
九、运维建议
- 多可用区部署:节点池跨可用区,并为 Deployment 配置 Pod 反亲和或拓扑分布约束,避免副本集中在同一节点;
- 资源配额:按团队或环境划分命名空间,为命名空间设置 ResourceQuota 和 LimitRange,防止单个业务挤占全部资源;
- 监控与日志:安装云原生监控与日志相关插件,关注节点 CPU/内存、Pod 重启次数、Pending 数量,并对关键指标配置告警;
- 版本升级:关注集群版本的生命周期,在测试集群先行验证后再升级生产集群,节点池可分批升级;
- 安全:API Server 公网访问限制来源,敏感配置使用 Secret 管理,镜像定期进行漏洞扫描;
- 成本控制:测试环境可在非工作时间缩小节点池,HPA 的
minReplicas根据真实基线设置,不要盲目调大。
十、总结
CCE 把 Kubernetes 控制面的复杂度托管给云平台,让团队把精力放在应用本身。实践主线是:提前规划网络与网段后创建集群;以节点池方式管理节点并跨可用区分布;从同区域镜像仓库拉取带版本号的镜像;使用设置了资源请求和探针的 Deployment 承载应用,通过 LoadBalancer Service 对外暴露;借助 HPA 与节点自动扩缩实现两级弹性;最后用滚动升级、监控告警和资源配额保障日常稳定运行。掌握这些,就能在华为云上搭建一套可靠、可伸缩的容器化应用平台。
- 点赞
- 收藏
- 关注作者
评论(0)