背景
Knative是一款基于Kubernetes的 Serverless 框架。其目标是制定云原生、跨平台的 Serverless 容器编排标准。Knative通过整合容器构建(或者函数)、工作负载管理(动态扩缩)以及事件驱动这三者来实现的这一Serverless标准。
Knative 提供了简单的应用模型,并且支持流量管理能力可以根据百分比进行灰度发布。那么如何在 Knative 提供产品化的方式持续交付部署,灰度发布呢?
解决方案
首先 Knative 提供了比较简单的应用模型:Knative Service。通过该模型可以快速实现应用部署、基于流量的灰度发布以及自动弹性能力,可以简单的这样理解:
Knative Service=Ingress + Service + Deployment + 弹性(HPA)
也就是说如果要在K8s中实现七层服务访问能力,需要创建 Ingress、Service、Deployment这些资源,而这是提供了基本服务访问能力,想要弹性的话还需要结合 HPA。而通过 Knative 只需要部署一个 Knative Service 资源即可。
此外在k8s中基于流量对灰度过程,我们需要对这些资源进行细粒度的控制,包括新版本对应资源的创建以及灰度完成之后旧版本资源的清理,对于用户来说还是比较复杂的。
在 Knative 中对于新变更只需要更新一下Knative Service信息(如镜像),就会自动创建一个新版本,灰度的规程只需要在Knative Service中调整对应版本的流量比例即可。如下图:
阿里云云效,云原生时代新 DevOps 平台,当前已经与容器服务ACK做了深度集成。通过云效持续交付流水线和阿里云容器服务 Knative 结合在一起,可以进一步简化用户应用部署、灰度发布等操作,为应用的持续交付提供很好的基础保障,让用户专注于业务开发,降低发布成本。
场景案例
本文通过一个 Springboot 项目来具体演示,如何通过云效快速实现 Knative 的部署发布。
云效操作实践
接下来讲解如何将示例代码库进行构建并将 Knative Service 部署到阿里云 ACK。
准备工作
-
注册阿里云账号或RAM账号。
-
准备Knative。创建方式参考 部署Knative
-
准备阿里云镜像仓库ACR。为了能够快速的拉取镜像,建议将ACK集群与ACR放在同一区域,如本例中的华东1:杭州,这样后续在进行Kubernetes部署的时候,我们可以选择镜像VPC地址。若不再同一区域,请选择VPC公网地址。创建方式请参考 创建ACR个人版实例 。
创建流水线
-
进入云效点击页面左上角的dock,选择流水线进入Flow.点击页面中的【新建流水线】按钮,进入流水线创建向导页面。在弹出页面中选择如下模板,并点击【创建】按钮
配置代码库
创建流水线之后会自动弹出添加代码源的窗口,这里选择Flow提供的示例代码源,并进行添加
配置镜像构建任务
-
进入“镜像构建并推送至阿里云镜像仓库”的任务进行编辑。如下图所示,点击”新建服务授权”,进行阿里云授权。同意授权之后,Flow会将创建好的服务授权自动回填写到表单中。
接下来完成区域、仓库的选取。标签填入“${DATETIME}”,表示以流水线触发时的时间戳作为镜像的标签,很多企业习惯将分支名或者tag作为镜像的标签,云效也是支持的,如下图所示,详情参考链接环境变量。
Dockerfile路径填入”Dockerfile”,如下图所示。
配置好之后再“镜像构建并推送至阿里云镜像仓库”任务的下方可以看到该任务输出的变量,这些变量可以在后续的任务中引用。关注其中的第二个和第三个变量即可,其中第二个是该镜像地址的公网地址,第三个是该镜像地址的VPC地址。这里推荐将镜像仓库和ACK集群放在同一个region,然后在后续的部署任务中选择VPC地址,以加速部署过程。
配置部署任务
点击“Kubernetes发布”任务,进入配置。点击”新建连接”,进行集群授权,完成阿里云授权及集群选取。点击确认之后,集群信息会自动填到任务配置中。
配置YAML路径,本示例中YAML路径地址为:app-configs/knative。
配置变量,本演示案例中,需配置1个变量: 镜像地址image。
-
配置变量 image 。点击【添加参数】按钮,变量类型选择上游输出,变量名填入 image ,选择镜像的VPC地址作为变量值。如下图所示
这样在运行时,Flow会把YAML路径下的所有文件中的${image}都替换成镜像的地址,然后再进行kubectl发布。示例代码内容如下,所以其中的${image}就会被替换成实际的镜像地址。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: spring-boot-knative
spec:
template:
spec:
containers:
- image: ${image}
运行流水线
配置完毕,点击”保存并运行”触发流水线:
由部署完成之后,可以在Knative 产品页面看到服务已经部署成功
可以通过下面的方式进行验证。
$ curl -H "Host: spring-boot-knative.default.example.com" http://123.56.101.6
Greetings from Spring Boot! V4
小结
当前已经在云效的示例代码中支持 Knative 示例代码(这里感谢云效 @木烟 同学的支持),用户可以很方便的通过云效部署 Knative, 接下来期待与云效进一步集成,通过云效支持 Knative 灰度发布 等能力。