Kubernetes服务中定时方式实现pod动态扩展

目前Kubernetes服务中主要通过HPA水平缩放和VPA垂直缩放来实现pod资源的动态扩展,有待考虑的是当触发条件达到时,业务是否真的需要去做扩缩容。本文讨论的是通过定时去触发扩缩容,我们根据已往业务的运行情况,大致知道什么阶段是高峰和低谷,此时我们可以设置定时任务对业务去扩缩容,从而满足业务需求,方法是粗糙的,但可控及稳定。缩放针对是Depoyment和Statefulset资源。

1、已有的方法

1.1、HPA水平缩放

实际生产中,广泛使用这四类指标:

  • Resource metrics – CPU核内存利用率指标
  • Pod metrics – 例如网络利用率和流量
  • Object metrics – 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
  • Custom metrics – 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自 HPA官方文档:HPA

1.2、VPA垂直缩放

需要结合metrics-server和vertical-pod-autoscaler一起使用,有点小复杂。 VPA官方文档:VPA

1.3、CA集群自动伸缩器

CA官方文档:CA

2、cronjob脚本方式实现

通过详细一个例子介绍,假设我们白天业务量比较大,服务扩容4个pod,晚上业务量小,一个pod。对应一个扩容的脚本up.sh,一个缩容脚本down.sh,两条定时任务指令,如下。

定时指令,直接crontab -e编辑
0 8 * * * sh /root/nginx/up.sh
0 20 * * * sh /root/nginx/down.sh

up.sh脚本
[root@lin nginx]# cat up.sh
#!/bin/bash

/usr/local/bin/kubectl scale deploy -n default nginx-deployment --replicas=4

down.sh脚本
#!/bin/bash

/usr/local/bin/kubectl scale deploy -n default nginx-deployment --replicas=1

注意:当定时任务没有生效时,可通过/var/log/cron和/var/spool/mail/root文件下查询日志。本调试时也出现了问题,显示没有kubectl指令,所以脚本里面kubectl前面加了绝对路径解决。

3、Operator 定时方式实现

3.1、对应的cr参考如下,可根据这个生成crd

apiVersion: **/v1 
kind: CronPA
metadata:
name: nginx-cronpa
spec:
scaleTargetRef: //找到对应的资源,包括Deployment和Sts
apiVersion: apps/v1
kind: Deployment
name: nginx
namespace: default
rules: //定义对应定时的规则
- name: "scale-up"
schedule: "0 8 * * *"
targetReplicas: 4
- name: "scale-down"
schedule: "0 20 * * *"
targetReplicas: 1

3.2、controller代码主要逻辑

  • 包括定时函数
  • 包括资源replicas变更
package main

import (
"fmt"
"github.com/robfig/cron"
)

func main() {
//todo 定时函数,需要引入cron包
c := cron.New()
specUp := "0 */1 * * *"
err := c.AddFunc(specUp, func() {
fmt.Println("定时任务执行")
})
if err != nil {
fmt.Println("定时任务失败")
return
}

c.Start()

//todo replicas变更
sts, err := kubeClient.AppsV1().StatefulSets(namespace).Get(ctx, name, newGetOptions())

var zero int32 = **
sts.Spec.Replicas = &zero

kubeClient.AppsV1().StatefulSets(namespace).Update(ctx, host.StatefulSet, newUpdateOptions())
}

3.3、operator操作资源权限添加

由于需要操作Deployment和Statefulset资源的get、update动作,所以需要创建role、rolebinding和sa。

apiVersion: v1
kind: ServiceAccount
metadata:
name: test-manager
namespace: test

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: test-role
namespace: test
rules:
- apiGroups:
- ""
resources:
- deployments
- statefulsets
verbs:
- get
- update

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rolebinding
namespace: test
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: test-role
subjects:
- kind: ServiceAccount
name: test-manager
namespace: test

4、结论

上面提供了一种相对比较可控的方式来对Deployment和Statefulset资源进行扩缩容,但需要提前知道业务大致运行情况。


原文始发于微信公众号(云原生内经):Kubernetes服务中定时方式实现pod动态扩展

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/167898.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!