事件驱动组件Eventing
Autoscaler计算Pod数的基本逻辑
指标收集周期与决策周期
? Autoscaler每2秒钟计算一次Revision上所需要Pod实例数量
? Autoscaler每2秒钟从Revision的Pod实例(Quueu-Proxy容器)上抓取一次指标数据,并将其(每秒的)平均值存储于单独的bucket中
◆实例较少时,则从每个实例抓取指标
◆实例较多时,则从实例的一个子集上抓取指标,因而计算出的Pod实例数量并非精准数值
决策过程
? Autoscaler在Revision中检索就绪状态的Pod实例数量
◆若就绪实例数量为0,则将其设定为1,即使用Activator作为实例
? Autoscaler检查累积收集的可用指标
◆若不存在任何可用指标,则将所需要的Pod实例数设置为0
◆若存在累积的指标,则计算出窗口期内的平均并发请求数
◆根据平均并发请求数和每实例的并发目标值计算出所需要的Pod实例数
? 窗口期内每实例的平均并发请求数 = Bucket中的样本值之和 / Bucket数量
? 每实例的目标并发请求数 = 单实例目标并发数 * 目标利用率
? 期望的Pod数 = 窗口期内每实例的并发请求数 / 每实例目标并发请求数
◆Panic的触发条件
? 期望的Pod数 / 现有的Pod数 ≥ 2
? 60秒之后返回至Stable
Knative支持的Autoscaler
Knative支持基于KPA与HPA的自动缩放机制,但二者的功能略有不同
? Knative Pod Autoscaler
◆Knative Serving的核心组件,且默认即为启用状态
◆支持缩容至0
◆不支持基于CPU的自动缩放机制
? Kubernetes Horizontal Pod Autoscaler
◆Kubernetes系统上的组件
◆不支持缩容至0
◆支持基于CPU的自动缩放机制
另外,二者支持的指标也不尽相同
Autoscaler的全局配置
全局配置参数定义在knative-serving名称空间中的configmap/auto-scaler之中
相关的参数
? container-concurrency-target-default:实例的目标并发数,即最大并发数,默认值为100;
? container-concurrency-target-percentage:实例的目标利用率,默认为“0.7”;
? enable-scale-to-zero:是否支持缩容至0,默认为true;仅KPA支持;
? max-scale-up-rate:最大扩容速率,默认为1000;
◆当前可最大扩容数 = 最大扩容速率 * Ready状态的Pod数量
? max-scale-down-rate:最大缩容速率,默认为2;
◆当前可最大缩容数 = Ready状态的Pod数量 / 最大缩容速率
? panic-window-percentage:Panic窗口期时长相当于Stable窗口期时长的百分比,默认为10,即百分之十;
? panic-threshold-percentage:因Pod数量偏差而触发Panic阈值百分比,默认为200,即2倍;
? scale-to-zero-grace-period:缩容至0的宽限期,即等待最后一个Pod删除的最大时长,默认为30s;
? scale-to-zero-pod-retention-period:决定缩容至0后,允许最后一个Pod处于活动状态的最小时长,默认为0s;
? stable-window:稳定窗口期的时长,默认为60s;
? target-burst-capacity:突发请求容量,默认为200;
? requests-per-second-target-default:每秒并发(RPS)的默认值,默认为200;使用rps指标时生效;
root@master01:/opt/knative-in-practise/serving/autoscaling# cat autoscaling-scale-to-zero.yaml apiVersion: serving.knative.dev/v1 kind: Service metadata: name: hello namespace: default spec: template: metadata: annotations: autoscaling.knative.dev/scale-to-zero-pod-retention-period: "1m5s" #决定缩容至0后,允许最后一个Pod处于活动状态的最小时长,默认0 spec: containers: - image: ikubernetes/helloworld-go ports: - containerPort: 8080 env: - name: TARGET value: "Knative Autoscaling Scale-to-Zero"并发案例
root@master01:/opt/knative-in-practise/serving/autoscaling# cat autoscaling-concurrency.yaml apiVersion: serving.knative.dev/v1 kind: Service metadata: name: hello namespace: default spec: template: metadata: annotations: autoscaling.knative.dev/target-utilization-percentage: "60" #目标利用率 autoscaling.knative.dev/target: "10" #单实例并发数,软限制,流量突发尖峰期允许超出 spec: containers: - image: ikubernetes/helloworld-go ports: - containerPort: 8080 env: - name: TARGET value: "Knative Autoscaling Concurrency"
apt install hey #测试工具
hey -z 60s -c 20 -host "hello.magedu.com" http://192.168.80.251?sleep=100&prime=10000&bloat=5 并发20,持续60秒root@master01:/opt/knative-in-practise/serving/autoscaling# kubectl get po -l serving.knative.dev/configuration=hello #60s NAME READY STATUS RESTARTS AGE hello-00003-deployment-57c8698c5f-cdqwj 3/3 Running 0 6m45s hello-00003-deployment-57c8698c5f-czlgh 3/3 Running 0 27s
hey -z 60s -c 60 -host "hello.magedu.com" http://192.168.80.251?sleep=100&prime=10000&bloat=5 #最大10个,每个pod
root@master01:/opt/knative-in-practise/serving/autoscaling# kubectl get po -l serving.knative.dev/configuration=hello |grep -v ImagePul NAME READY STATUS RESTARTS AGE hello-00003-deployment-57c8698c5f-8jtqk 3/3 Running 0 30s hello-00003-deployment-57c8698c5f-cdqwj 3/3 Running 0 8m32s hello-00003-deployment-57c8698c5f-h47qt 3/3 Running 0 36s hello-00003-deployment-57c8698c5f-q5pvd 3/3 Running 0 34s hello-00003-deployment-57c8698c5f-t5gzz 3/3 Running 0 33s
root@master01:/opt/knative-in-practise/serving/autoscaling# cat autoscaling-scale-bounds.yaml apiVersion: serving.knative.dev/v1 kind: Service metadata: name: hello namespace: default spec: template: metadata: annotations: autoscaling.knative.dev/target-utilization-percentage: "60" #目标利用率,达到6个并发就考虑扩容 autoscaling.knative.dev/target: "10" #并发数 autoscaling.knative.dev/max-scale: "3" #最大pod数 autoscaling.knative.dev/initial-scale: "1" #初始为1,默认 autoscaling.knative.dev/scale-down-delay: "1m" #超过一分钟才缩容 autoscaling.knative.dev/stable-window: "60s" #默认值 spec: containers: - image: ikubernetes/helloworld-go ports: - containerPort: 8080 env: - name: TARGET value: "Knative Autoscaling Scale Bounds"
hey -z 60s -c 100 -host "hello.magedu.com" http://192.168.80.251?sleep=100&prime=10000&bloat=5
root@master01:~# kubectl get po -l serving.knative.dev/configuration=hello |grep -v ImagePul NAME READY STATUS RESTARTS AGE hello-00004-deployment-55b5f84fd7-5zgsk 3/3 Running 0 39s hello-00004-deployment-55b5f84fd7-gcmn9 3/3 Running 0 5m33s
root@master01:/opt/knative-in-practise/serving/autoscaling# cat autoscaling-metrics-and-targets.yaml apiVersion: serving.knative.dev/v1 kind: Service metadata: name: hello namespace: default spec: template: metadata: annotations: autoscaling.knative.dev/target-utilization-percentage: "60" #目标使用率 autoscaling.knative.dev/metric: "rps" #每秒的平均请求数,一个长链接1秒请求数100个,并发100个链接,100*100=10000 autoscaling.knative.dev/target: "100" #单实例请求数100 autoscaling.knative.dev/max-scale: "10" #最大10个pod,需100个pod autoscaling.knative.dev/initial-scale: "1" #初始一个 autoscaling.knative.dev/stable-window: "2m" #稳定窗口 spec: containers: - image: ikubernetes/helloworld-go ports: - containerPort: 8080 env: - name: TARGET value: "Knative Autoscaling Metrics and Targets"
root@master01:~# kubectl get po -l serving.knative.dev/configuration=hello |grep -v ImagePul NAME READY STATUS RESTARTS AGE hello-00005-deployment-57846b99bf-5lr9r 0/3 PodInitializing 0 21s hello-00005-deployment-57846b99bf-q2psp 0/3 PodInitializing 0 21s hello-00005-deployment-57846b99bf-stscg 0/3 PodInitializing 0 21s hello-00005-deployment-57846b99bf-tl4ms 0/3 PodInitializing 0 21s hello-00005-deployment-85f6bcf686-6zhvc 3/3 Running 0 21s hello-00005-deployment-85f6bcf686-bzmhh 3/3 Running 0 21s hello-00005-deployment-85f6bcf686-c7z5q 3/3 Running 0 8m54s hello-00005-deployment-85f6bcf686-czv78 3/3 Running 0 19s hello-00005-deployment-85f6bcf686-f944s 3/3 Running 0 21s hello-00005-deployment-85f6bcf686-k5zk5 3/3 Running 0 21s hello-00005-deployment-85f6bcf686-p7xvw 3/3 Running 0 21s
root@master01:~# kubectl get po -l serving.knative.dev/configuration=hello |grep -v ImagePul #应该10个pod NAME READY STATUS RESTARTS AGE hello-00005-deployment-85f6bcf686-6zhvc 3/3 Running 0 75s hello-00005-deployment-85f6bcf686-bzmhh 3/3 Running 0 75s hello-00005-deployment-85f6bcf686-c7z5q 3/3 Running 0 9m48s hello-00005-deployment-85f6bcf686-czv78 3/3 Running 0 73s hello-00005-deployment-85f6bcf686-f944s 3/3 Running 0 75s hello-00005-deployment-85f6bcf686-k5zk5 3/3 Running 0 75s hello-00005-deployment-85f6bcf686-p7xvw 3/3 Running 0 75s