近期由于技术演进,对Openshift4.6的应用做了服务网格的新增,新增完以后发现原先程序通过log4j的syslog发送到Graylog的日志竟然消失了。
经过多次的抓包以及测试之后发现,原因是pod在启动的时候,log4j加载graylog域名时解析失败,因为pod的启动网络已经被istio托管,但是此时istio的sidecar并未启动完成,导致出集群的流量无法被识别。
确认原因之后,就是解决pod和sidecar启动顺序的问题了,有两种解决方式:
第一种,为pod添加postStart,监听sidecar的启动是否完成
lifecycle:
postStart:
httpGet:
path: /healthz/ready
port: 15020
这种方式需要侵入deployment的配置,不是很友好
第二种,从istio1.7开始,社区增加了
holdApplicationUntilProxyStarts特性,来解决此问题,这种方案侵入性更低,也更友好。
在mesh域上,即全局上设置,通过如下设置:
apiVersion: install.istio.io/v1alpha2
kind: IstioOperator
spec:
meshConfig:
defaultConfig:
holdApplicationUntilProxyStarts: true
在Pod级别上,通过如下设置:
annotations:
proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
启用该特性,可以在Pod的容器列表的开头注入 proxy 容器,并将其配置为阻止所有其他容器的开始启动,直到 proxy 容器 就绪为止。
一般的服务型pod不需要关注sidecar的启动顺序,有特殊要求的可以使用以上方式处理。