概述
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 环境, 比较简单地集成到自己项目开发中.
来源: https://yq.aliyun.com/articles/689208