元毅
2021-02-26
153浏览量
在 Knative 可以基于流量比例进行灰度发布,但有时候我们需要将确切的请求灰度到指定的版本上进行验证,通常的做法是在请求的 Header 中设置参数,然后根据Header灰度到指定的版本。那么在Knative 除了基于流量比例灰度,是否还支持基于Header指定版本灰度呢? 答案是可以的。在 Knative 0.18 版本并结合Kourier网关可以实现基于Header的灰度验证。
在 Knative 中创建完成Knative Service 之后会默认生成该服务的访问域名(如:`helloworld.default.example.com`),通过该域名并依据每个Revision版本的流量比例,可以访问到不同的版本。那么如果我们想单独访问某个特定的版本,是否可以呢?Knative 提供了指定某个版本访问的能力,就是对这个版本配置一个Tag。
被打上Tag的Revision版本, 会为这个版本单独生成一个域名(如:test-helloworld.default.example.com),这样我们访问这个域名的话就可以直接访问特定的版本。
一般使用Tag的情况是对未进行线上引流的版本进行功能测试。但这个特性还满足不了实际指定版本灰度验证,因为线上提供服务访问的域名是固定的。因此Knative社区在Tag设置之上提供了设置Header路由策略。
在 Knative v0.18 版本中可以在请求的Header中加上 Knative-Serving-Tag: {revision-tag}
来指定请求到Tag对应的版本上。
当前 Istio, Contour 以及 Kourier 都已经支持了该特性。开启特性:
kubectl patch cm config-features -n knative-serving -p '{"data":{"tag-header-based-routing":"enabled"}}'
阿里云 Knative 部署完成之后,当前默认使用Kourier网关。
首先我们创建一个helloworld-go的服务,注意这里需要开启tag特性,在Service 的注释中设置:route.serving.knative.aliyun.com/revision-tag: "on"
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go annotations: route.serving.knative.aliyun.com/revision-tag: "on" spec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
执行部署命令:
kubectl apply -f helloworld.yaml
查看版本信息:
kubectl get revision NAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON helloworld-go-k77jq helloworld-go helloworld-go-k77jq 1 True
访问服务:
richard@B-N3TEMD6P-1650 tag-route % curl -H "host: helloworld-go.default.example.com" http://39.106.114.214 Hello World!
这里我们通过修改环境变量TARGET,打印不同的输出。同时设置新版本的流量为0,这样请求还是会100%到原版本。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go annotations: route.serving.knative.aliyun.com/revision-tag: "on" spec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 env: - name: TARGET value: "Knative" traffic: - latestRevision: true percent: 0 - latestRevision: false percent: 100 revisionName: helloworld-go-k77jq
执行部署命令:
kubectl apply -f helloworld.yaml
查看新版本已经创建出来:
kubectl get revision NAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON helloworld-go-k77jq helloworld-go helloworld-go-k77jq 1 True helloworld-go-zgklc helloworld-go helloworld-go-zgklc 2 True
访问服务:
curl -H "host: helloworld-go.default.example.com" http://39.106.114.214 Hello World!
还是原版本信息输出,符合预期。
执行修改 Service 命令:
kubectl edit ksvc helloworld-go
在新版本上设置Tag (tag: demo)
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go annotations: route.serving.knative.aliyun.com/revision-tag: "on" spec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 env: - name: TARGET value: "Knative" traffic: - latestRevision: false percent: 0 revisionName: helloworld-go-zgklc tag: demo - latestRevision: false percent: 100 revisionName: helloworld-go-k77jq
访问指定版本(helloworld-go-zgklc):
curl -H "host: demo-helloworld-go.default.example.com" http://39.106.114.214 Hello Knative!
接下来我们看一下基于Header如何灰度验证,很简单只需要在访问helloworld-go.default.example.com域名的时候加上Knative-Serving-Tag即可:
curl -H "host: helloworld-go.default.example.com" -H "Knative-Serving-Tag:demo" http://39.106.114.214 Hello Knative!
本文介绍了如何在 Knative 中通过在Header中设置Knative-Serving-Tag来实现灰度验证,有兴趣的同学可以体验一下,也欢迎加入 Knative 交流群一起交流:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
云端最佳容器应用运行环境,安全、稳定、极致弹性