当前位置:首页 > 问答 > 正文

【后浪云】聊聊K8s里Pod怎么用Cronhpa搞定弹性伸缩,实操也带你一起上手

【后浪云】聊聊K8s里Pod怎么用Cronhpa搞定弹性伸缩,实操也带你一起上手 来源:后浪云官方技术文章及社区分享)

行,咱们今天就来聊聊在Kubernetes(K8s)里头,怎么用一种叫CronHPA的工具,来给Pod做定时弹性伸缩,这玩意儿说白了,就是让你能像定闹钟一样,提前说好“几点几分把服务多开几个实例”或者“几点几分把服务减少几个实例”,特别适合那些流量有规律、能预估的业务场景。

先说说为啥可能需要这个,K8s自己本来就有个HPA(Horizontal Pod Autoscaler),它是根据CPU、内存这些指标自动伸缩的,实时反应,但有时候吧,光靠实时反应不够,你有个电商应用,你知道每天晚上8点到10点是促销高峰,流量肯定会暴涨;或者你有个数据分析任务,每天凌晨3点开始跑,需要大量计算资源,这种“明知山有虎”的情况,等着系统自己发现CPU高了再去扩容,可能就有点晚了,用户体验会受影响,这时候,CronHPA就派上用场了,它能让你“提前部署”,在流量上来之前就把Pod数量加上去,稳稳当当的。

CronHPA并不是K8s自带的原生组件,它是一个需要额外安装的自定义控制器,常见的实现有很多,比如阿里云开源的那个CronHPA Controller,它的工作原理其实不复杂:你创建一个CronHPA的资源对象,在这个对象里,你定义好时间表(用的就是咱们熟悉的cron表达式,0 20 * * * 表示每天20点整),然后告诉它在哪个时间点,把你指定的Deployment或者StatefulSet的Pod副本数缩放到几个。

下面咱们就上手实操一下,看看具体怎么用,假设你已经有一个正在运行的K8s集群了。

第一步:安装CronHPA控制器

你得先把这“大脑”装到集群里,以阿里云开源的版本为例,通常可以用Helm Chart来一键安装,比较省事。

# 添加Helm仓库(来源:阿里云容器服务文档)
helm repo add alibaba https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库
helm repo update
# 安装cronhpa-controller,给它起个名字叫cronhpa,安装在kube-system命名空间
helm install cronhpa alibaba/cronhpa-controller --namespace kube-system

安装完后,你用 kubectl get pods -n kube-system 命令看看,应该能看到一个名字里带cronhpa-controller的Pod在运行,这就说明安装成功了。

第二步:准备一个测试用的Deployment

光有控制器不行,我们得有个需要伸缩的对象,先创建一个非常简单的Nginx Deployment作为例子。

# 文件名叫 nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 2  # 一开始我们保持2个副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

用命令把它运行起来:

kubectl apply -f nginx-deployment.yaml

第三步:创建CronHPA规则,这才是核心

现在我们来创建CronHPA资源,告诉控制器我们想怎么伸缩,我们想实现:

  • 每周一到周五的早上9点,把Pod副本数扩展到10个,迎接早高峰。
  • 每天晚上18点,把Pod副本数减少到2个,进入夜间模式。

对应的CronHPA的YAML文件可以这么写:

# 文件名叫 nginx-cronhpa.yaml
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  name: nginx-cronhpa-demo
spec:
   scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: nginx-demo  # 指定我们要操作的是上面创建的nginx-demo这个Deployment
   jobs:
   - name: "scale-up-in-morning"
     schedule: "0 9 * * 1-5"  # Cron表达式:周一到周五的9点0分
     targetSize: 10           # 目标副本数设为10
   - name: "scale-down-in-evening"
     schedule: "0 18 * * *"   # Cron表达式:每天的18点0分
     targetSize: 2            # 目标副本数设为2

应用这个规则:

kubectl apply -f nginx-cronhpa.yaml

第四步:验证效果

创建完之后,怎么知道它生不生效呢?

  1. 你可以用 kubectl get cronhpa 命令查看你创建的CronHPA资源的状态。
  2. 更直接的是,在接近你设定的时间点时(比如8点59分),用 kubectl get pods 命令盯着Pod数量的变化,到了9点整,你应该能看到Pod数量从2个慢慢变成10个(K8s扩容需要一点时间),同样,晚上18点整,它会自动缩回2个。
  3. 你也可以查看CronHPA控制器的日志来排错或确认:kubectl logs -f [cronhpa-controller的pod名字] -n kube-system

需要注意的几个点

  • 时间准不准? CronHPA控制器是依据它自己所在Pod的时间来执行计划的,所以你得确保你集群节点的时间是准确的,最好都配置了NTP时间同步。
  • 和HPA一起用行不行? 可以!CronHPA和传统的HPA可以协同工作,CronHPA负责根据时间表设定一个副本数的“基线”,而HPA在这个基线副本数的基础上,再根据实时指标(比如CPU)进行小范围的微调,这样既能应对可预知的流量波动,又能处理不可预知的突发情况,具体配置时需要注意规则不要冲突。
  • cron表达式别写错:这是最容易出错的地方,写完了最好找个在线工具验证一下你的表达式是不是你想要的时刻。

CronHPA就是一个实现“预测性弹性伸缩”的利器,对于那些业务高峰低谷比较明显的应用来说,能让你从被动响应变为主动规划,提高资源利用率和系统稳定性,操作起来也不复杂,定义好时间点和目标副本数就行了,希望这个简单的实操能帮你理解它到底怎么用。

【后浪云】聊聊K8s里Pod怎么用Cronhpa搞定弹性伸缩,实操也带你一起上手