当scale到0时,是怎样唤醒业务容器的?
activator就是负责做这个事情的组件。activator做两件事情,一个是负责把pod启动起来,另外一个是把启动中的请求转发给pod。
请求是怎么转发到activator的?
当业务pod scale到0的时候,会更新istio VirtualServer,把流量按权重分配给activator。在pod启动ready之后,流量权重又直接指向业务pod,所有revision都ready的情况下,activator不会分配到流量。
唤醒pod是通过更新 revision.Spec.ServingState = v1alpha1.RevisionServingStateActive 状态实现的,controller会根据状态,创建出业务pod和autoscaler。
这里要解决的一个问题是在pod没启动之前,可能会有很多个请求,这里做了限制每个revision只会触发一次。
还有个问题是在pod没ready前,把请求阻塞。
activator本身是个HTTP服务,在POD启动的期间,当pod ready之后,会把请求转发到到pod里(通过FQDN域名)
流量转发
这个图感觉没更新,目前没有看到有用ingress来路由,而是由istio ingress gateway来路由。
Istio Route Rules Configurations
Knative Serving 使用istio route rules来控制流量(根据Route对象指定的比例分配),如果某个revision因为不活跃变为Reserve状态,会把部分流量转向activator。
下面分三种情况
All revisions are active
如果所有revision都是活跃的,activator 不会收到任何流量。
One revision is in Reserve state
如果一个revision是Reserve状态,则会把原本给revision b的流量转发给activator,activator收到请求后,会启动revision b,revision b ready后会把流量导入revision b。后续的流量直接到revision b。
Multiple revisions are in Reserve state
如果有两个或两个以上revision是Reserve状态,所有到reserve状态的流量转向activator