开发者学堂课程【如何通过 Knative 轻松实现应用 Serverless 化交付: Knative 灰度发布和自动(二)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/291/detail/3434
Knative 灰度发布和自动(二)
六、自动弹性 HPA
HPA 能够通过监测到 CPUmemory 版本的使用率,修改相应的 pod 数量,并扩容。在 connect 中集成了 HPA 的能力,通过 outset 的 class 可以选择 HPA 的相应的类型,然后可以设置相应的 CPU 以及 memory 的指标信息。
七、如何自定义扩缩容插件。
除了 KPA 和 HPA 在实际运用中,会经常遇到不同的一些指标收集或者扩充策略,这时候就需要自定义一个扩缩容插件,只需要进行一个指标的采集,然后调整采集到指标之后,计算中相应的 pod 实例数,然后修改相应的信息,最终实现一个自定义扩缩容的能力。
八、实例演示
分别介绍一下灰度发布以及自动扩缩容的一个实例。
进入一个终端模式。
首先演示一下灰度发布,这里会创建两个coffee的一个实例,分别对应v1和v2版本。v1版本中打一个 hello coffee v1
,然后在v2版本中打一个v2。
首先创建v1版本的一个 coffee。
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]#ls coffee-v1.yaml coffee-v2.yaml test.sh
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]# kubectl apply-f coffee-v1.yaml
service,serving.knative.dev/coffee created[root@iZbp1djyqnxhjfv9h9s0edZ serverles5]#
创建完成,观察一个 pod 的启动情况:[root@iZbp1djyqnxhjfv9h9s0edZ ~]# watch "kubectl get pod"
然后可以看到 pod 已经在启动中了。这里启动完服务之后,会做一次访问,访问一下当前的服务是否是v1。
可以看到当前是一v1版本的打印:
[root@iZbpldjyqnxhjfv9h950edZ ~]# cd serverless/[root@iZbp1djyqnxhjfv9h9s0edZ serverless]#ls coffee-v1.yaml coffee-v2.yaml test.sh
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]#
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]#ls coffee-v1.yaml coffee-v2.yaml test.sh
Troot@iZbpldiyqnxhifv9h9s0edZ serverless]# curl -H"hast: coffeedefault.example com"http://60.205.218.122 chtml>
<head><title>503 Service Temporarily Unavailable</title></head><body bgcolor="white">
<center><h1>503 Service Temporarily Unavailable</h1></center><hr><center>nginx</center></body></html>
Troot@iZbp1diyqnxhifv9h9s0edZ serverless]# curl -H"host:coffee.default.example com"http://60.205.218.122 Hello coffee v1!
[root@iZbp1djyqnxhifv9h9s0edZ serverless7# curl -H "host: coffee.default.example. comhttp://60.205.218.122 Hello coffee v1!
[root@iZbpldiyqnxhjfv9h9s0edZ serverless]# curl -H"host:coffee.default.example com"http://60.205.218.122 Hello coffee v1!
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]#
做一次版本的一个变更,换到v2版本。复制一下当前revision,进行v2版本的一个创建,同时会将v2版本和v1版本设置不同的流量比例,这里为了方便区分,可以分别设置50%即可。
[root@iZbp1djygnxhify9h9s0edZ serverles5]#l5 coffee-v1.yaml coffee-v2.yaml test.sh
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]# kubectl apply-fcoffee-v1yaml service.serving.knative.dev/coffee created
[root@iZbp1djyqnxhjfv9h9s0edZserverless]#ls
coffee-v1.yomlcoffee-v2yaml test.sh
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]# kubectl get revision
coffee-9hng7 coffee coffee-9hng7 1 True
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]#ls coffee-v1yaml coffee-v2.yaml test.sh
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]#vicoffee v2.yaml
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]# kubectl apply-fcoffee-v2.yaml
service.serving.knative.dev/coffee configured[root@iZbp1diyqnxhjfy9h9s0edZ serverless]#
因为到时候可以看到50%的一个流量是v2版本,都会一个随机的出现。终端上有一个显示就是一个多了一个波段,这是因为这个时间阶段没有访问,送入了一个保留实例。
把新的版本做出一次变更,更新的v2版本创建了,可以看到v版本的pod开始启动,会访问到v1版本上,并且访问的过程中,可以对之前的一个做一次算是复习。访问之后,会通过线索保留实例,介绍到请求之后,同时会创建一个正常的实例出来。
v2版本起来后,看一下是否可以访问到v2版本, 灰度50%,发现打印v2版本没有问题.
将当前的比例调整一个100%,也就是把新的VR版本调分调成100%,再观察一下流量的一个分配情况。改traffic的值,新的版本改成100%,原来版本是让它设置为0,接着访问,会发现都会到v2版本上去,这就是实现了一个从通过流量比例进行一个灰度发布的流程。
现在已经是v2版本了,接下来会做一个压测,当前默认的是使用基于流量的KPA的一个策略。
[root@iZbp1djyqnxhjfv9h9s0edZ serverless]# hey-z 30s -c 90 --host"coffee,defoult example.com”"http://60.205.218.122/?sleep=100"
可以看到新的一个 VR版本。
NAME READY STATUS RESTARTS AGE 78s
coffee-9hng7-deployment-reserve-64954c7476-b4jwm 2/2 Running
coffee-new-deployment-7fd9ffffd7-2km6l 0/2 Pending 15s
coffee-new-deployment-7fd9ffffd7-2nd29 0/2 Pending 15s
coffee-new-deployment-7fd9ffffd7-4zvrr 2/2 Running 3m35s
coffee-new-deployment-7fd9ffffd7-9ct51 0/2 Pending 25s
caffee-new-deplayment-7fd9ffffd7-bg6x7 0/2 Pending 25s
caffee-new-deplayment-7fd9ffffd7-d4pfg 0/2 Pending 23s
coffee-new-deployment-7fd9ffffd7-qdgsh 0/2 Pending 25s
coffee-new-deployment-7fd9ffffd7-t7l5 0/2 Pending 25s
coffee-new-deployment-7fd9ffffd7-td4xb 0/2 Pending 15s
这个场景其实相当于有新的一个业务过来,根据流量做了一个自动弹性的能力。
九、总结
主要内容是基于流量的灰度发布以及增弹性,自动弹性包括平台中基于流量请求的 KPA,以及基于 CPU memory 的一致 KPI 和 HPA,同时也介绍了如何自动扩缩容的一个插件。