体验Keda + Redis 实现副本自动扩/缩容
关于KEDA
KEDA是一个Kubernetes基于事件驱动的自动缩放器。 KEDA可以根据需要处理的事件数量来推动 Kubernetes 中任何容器的扩展。
KEDA是一个单一用途的轻量级组件,可以添加到任何 Kubernetes 集群中。KEDA 与Horizontal Pod Autoscaler等标准 Kubernetes 组件一起工作,同时可以在不覆盖的情况下扩展功能。 KEDA可以明确映射想要使用事件驱动规模的应用程序,而其他应用程序继续运行。这使得 KEDA 成为与任意数量的任何其他 Kubernetes 应用程序或框架一起运行的灵活且安全的选择。
KEDA 安装
参照官网安装向导,使用以下命令快速安装KEDA。
# helm repo add kedacore https://kedacore.github.io/charts
# helm repo update
# helm install keda kedacore/keda --namespace keda --create-namespace
使用以下验证:
# kubectl get po -n keda
NAME READY STATUS RESTARTS AGE
keda-operator-54885bb7b5-dztmx 1/1 Running 0 3d21h
keda-operator-metrics-apiserver-746d5d6bdb-x9xlb 1/1 Running 0 3d21h
# kubectl get apiservices v1beta1.external.metrics.k8s.io
NAME SERVICE AVAILABLE AGE
v1beta1.external.metrics.k8s.io keda/keda-operator-metrics-apiserver True 7d23h
部署测试应用
本例使用nginx来作为keda测试。
# kubectl create ns keda-demo
# cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: keda-demo
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:stable-alpine
ports:
- containerPort: 80
EOF
检查Pod部署的应用状态
# kubectl -n keda-demo get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-69c78cd8c6-fkwcz 1/1 Running 0 70s
nginx-deployment-69c78cd8c6-lhwbq 1/1 Running 0 70s
nginx-deployment-69c78cd8c6-sj5q5 1/1 Running 0 70s
部署了 3 个 pod,与我们预期是一样的。
我们通过 Redis 来(通过List数量)控制Pod副本的扩缩容。
目前,KEDA 支持36 种不同的缩放器,示例基于 redis。
部署redis
使用yum安装`redis`
# hostname -i
172.30.109.5
# yum -y install redis
注意:仅提供测试,实例还需要添加凭证。
启动服务
systemctl enable redis.service --now
创建KEDA触发器
创建ScaleObject
资源
cat <<EOF | kubectl -n keda-demo apply -f -
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: redis-scaledobject
namespace: keda-demo
spec:
scaleTargetRef:
kind: Deployment
name: nginx-deployment
minReplicaCount: 1
maxReplicaCount: 10
pollingInterval: 30
cooldownPeriod: 120
triggers:
- type: redis
metadata:
address: 172.30.109.5:6379
enableTLS: "false"
listName: vqiu
listLength: "3"
databaseIndex: "0"
EOF
测试
副本扩容
往redis中写入6条数据 :
127.0.0.1:6379> LPUSH vqiu pod1 pod1 pod1 pod2 pod2 pod2
127.0.0.1:6379> LLEN vqiu
(integer) 6
此时Pod数量如下:
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-69c78cd8c6-87mzx 1/1 Running 0 3m43s
nginx-deployment-69c78cd8c6-z7hhw 1/1 Running 0 2m43s
副本缩容
删除redis中写入的数据 :
127.0.0.1:6379> LREM vqiu 3 pod1
(integer) 3
127.0.0.1:6379> LREM vqiu 3 pod2
(integer) 3
127.0.0.1:6379> LLEN vqiu
(integer) 0
此时的Pod数量
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-69c78cd8c6-dc5rp 1/1 Running 0 2h
注意:副本缩容间隔时间参数--cooldownPeriod:
,默认为300
(5分钟)
查看KEDA 日志
[root@kube-master-0 keda]# kubectl -n keda logs keda-operator-54885bb7b5-dztmx
<省略若干行>
2022-01-29T03:13:00.388Z INFO controller.scaledobject Initializing Scaling logic according to ScaledObject Specification {"reconciler group": "keda.sh", "reconciler kind": "ScaledObject", "name": "redis-scaledobject", "namespace": "keda-demo"}
2022-01-29T03:13:56.979Z INFO controller.scaledobject Reconciling ScaledObject {"reconciler group": "keda.sh", "reconciler kind": "ScaledObject", "name": "redis-scaledobject", "namespace": "keda-demo"}
2022-01-29T03:14:11.998Z INFO controller.scaledobject Reconciling ScaledObject {"reconciler group": "keda.sh", "reconciler kind": "ScaledObject", "name": "redis-scaledobject", "namespace": "keda-demo"}
2022-01-29T03:14:43.163Z INFO controller.scaledobject Reconciling ScaledObject {"reconciler group": "keda.sh", "reconciler kind": "ScaledObject", "name": "redis-scaledobject", "namespace": "keda-demo"}