概述
Knative Serving是一种可缩放至零、请求驱动的计算运行环境,构建在 Kubernetes 和 Istio 之上,支持为 serverless 应用、函数提供部署与服务。Knative Serving的目标是为Kubernetes提供扩展功能,用于部署和运行无服务器工作负载。
下面讲述一下在阿里云Kubernetes容器服务基础之上,如何快速搭建一套Knative Serving环境并进行自动扩容的体验。
搭建Knative Serving
1.准备Kubernetes环境
阿里云容器服务Kubernetes 1.11.5目前已经上线,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。具体过程可以参考创建Kubernetes集群
2.部署Istio
Knative serving运行需要基于Istio,目前阿里云容器服务Kubernetes已提供了快速一键部署的方式来安装配置Istio。具体过程可以参考部署Istio
登录 容器服务管理控制台
,单击左侧导航栏中的集群,进入集群列表页面。选择所需的集群并单击操作列更多 > 部署Istio。
根据需要进行配置,然后点击部署按钮。稍等几十秒钟之后,Istio环境就可以部署完毕,可以通过查看Pod运行状态进行确认,如下所示。
3.部署Istio IngressGateway
登录容器服务管理控制台
,点击左侧的应用目录
,在右侧选中ack-istio-ingressgateway
,如下:
点击参数
, 可以通过修改参数配置进行定制化,默认参数提供了Istio IngressGateway的配置项,然后点击创建
按钮。
查看命令空间 istio-system
下的Pod列表,确认运行状态,如下所示。
4.部署Knative CRD
登录容器服务管理控制台
,点击左侧的应用目录
,在右侧选中ack-knative-init
,如下:
点击创建
按钮安装Knative初始化所需的内容,包括安装CRD等。
5.部署Knative Serving
登录容器服务管理控制台
,点击左侧的应用目录
,在右侧选中ack-knative-serving
,如下:
点击参数
, 可以通过修改参数配置进行定制化,默认参数提供了使用Istio IngressGateway的配置项,然后点击创建
按钮。
至此,安装Knative Serving所需的4个Helm chart都已经安装完毕,如下所示:
体验Knative
安装autoscale示例
通过执行如下命令部署示例自动伸缩应用程序的 Knative Service:
kubectl create -f autoscale.yaml
其中autoscale.yaml文件内容如下所示:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: autoscale-go
namespace: default
spec:
runLatest:
configuration:
revisionTemplate:
metadata:
annotations:
# Target 10 in-flight-requests per pod.
autoscaling.knative.dev/target: "10"
autoscaling.knative.dev/class: kpa.autoscaling.knative.dev
spec:
container:
image: registry.cn-beijing.aliyuncs.com/wangxining/autoscale-go:0.1
访问autoscale示例
找到入口主机名和IP并导出为环境变量:
export IP_ADDRESS=`kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*].ip}"`
向自动伸缩应用程序发出请求,并检查消耗资源情况:
curl --header "Host: autoscale-go.default.{domain.name}" "http://${IP_ADDRESS?}?sleep=100&prime=10000&bloat=5"
注意,替换你的域名后缀替换{domain.name}。默认示例中为 aliyun.com
。
curl --header "Host: autoscale-go.default.aliyun.com" "http://${IP_ADDRESS?}?sleep=100&prime=10000&bloat=5"
Allocated 5 Mb of memory.
The largest prime less than 10000 is 9973.
Slept for 100.16 milliseconds.
通过以下命令安装负载生成器:
go get -u github.com/rakyll/hey
维持50个并发请求,发送30秒的流量:
hey -z 30s -c 50 \
-host "autoscale-go.default.aliyun.com" \
"http://${IP_ADDRESS?}?sleep=100&prime=10000&bloat=5" \
&& kubectl get pods
可以看到运行30秒的流量请求状态,Knative服务随着请求数量的增大也自动扩容:
Summary:
Total: 30.1126 secs
Slowest: 2.8528 secs
Fastest: 0.1066 secs
Average: 0.1216 secs
Requests/sec: 410.3270
Total data: 1235134 bytes
Size/request: 99 bytes
Response time histogram:
0.107 [1] |
0.381 [12305] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.656 [0] |
0.930 [0] |
1.205 [0] |
1.480 [0] |
1.754 [0] |
2.029 [0] |
2.304 [0] |
2.578 [27] |
2.853 [23] |
Latency distribution:
10% in 0.1089 secs
25% in 0.1096 secs
50% in 0.1107 secs
75% in 0.1122 secs
90% in 0.1148 secs
95% in 0.1178 secs
99% in 0.1318 secs
Details (average, fastest, slowest):
DNS+dialup: 0.0001 secs, 0.1066 secs, 2.8528 secs
DNS-lookup: 0.0000 secs, 0.0000 secs, 0.0000 secs
req write: 0.0000 secs, 0.0000 secs, 0.0023 secs
resp wait: 0.1214 secs, 0.1065 secs, 2.8356 secs
resp read: 0.0001 secs, 0.0000 secs, 0.0012 secs
Status code distribution:
[200] 12356 responses
NAME READY STATUS RESTARTS AGE
autoscale-go-00001-deployment-5fb497488b-2r76v 2/2 Running 0 29s
autoscale-go-00001-deployment-5fb497488b-6bshv 2/2 Running 0 2m
autoscale-go-00001-deployment-5fb497488b-fb2vb 2/2 Running 0 29s
autoscale-go-00001-deployment-5fb497488b-kbmmk 2/2 Running 0 29s
autoscale-go-00001-deployment-5fb497488b-l4j9q 1/2 Terminating 0 4m
autoscale-go-00001-deployment-5fb497488b-xfv8v 2/2 Running 0 29s
总结
在阿里云Kubernetes容器服务基础之上,可以快速搭建一套Knative Serving环境并进行自动扩容的体验。欢迎大家使用阿里云上的容器服务,快速搭建Knative环境,比较简单地集成到自己项目开发中。