记一次Openshift Graylog UDP日志收集失败的排查经历

近期由于技术演进,对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的启动顺序,有特殊要求的可以使用以上方式处理。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容