17.4 就绪检查的实现

了解了sidecar的代理,以及管理代理生命周期的pilot-agent进程,我们可以稍微思考一下pilot-agent应该怎么去实现healthz/ready这个接口。显然,如果这个接口返回OK的话,那不仅意味着pilot-agent是就绪的,而且必须确保代理工作正常。

实际上pilot-agent就绪检查接口的实现正是如此,如图17-5所示。这个接口在收到请求之后,会去调用代理Envoy的server_info接口。调用所使用的IP地址是localhost。这非常好理解,因为这是同一个Pod内部进程通信。使用的端口是Envoy的proxyAdminPort,即15000。

图17-5 代理就绪检查机制的实现

有了以上的知识准备之后,我们来看一下istio-proxy这个容器的日志。实际上,在容器日志里,一直在重复输出一个报错。这个报错分为两部分,其中Envoy proxy is NOT ready部分是pilot agent在响应healthz/ready接口的时候输出的信息,即Envoy代理没有就绪;而剩下的config not received from Pilot (is Pilot running?):cds updates:0 successful, 0 rejected;lds updates:0 successful, 0 rejected这部分,是pilot-agent通过proxyAdminPort访问server_info的时候带回的信息,看来Envoy没有办法从Pilot获取配置。

到这里,建议大家回头看下上一节的图17-4,在上一节我们选择性忽略了从Pilot到Envoy这条虚线,即动态配置。这里的报错,实际上是Envoy从控制面Pilot获取动态配置失败。