目前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