3 min read

体验Keda + Redis 实现副本自动扩/缩容

体验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"}

参考引用