【问题标题】:Prevent logging from Kubernetes pods being stopped防止停止来自 Kubernetes pod 的日志记录
【发布时间】:2019-01-31 02:20:30
【问题描述】:

考虑升级 Kubernetes 部署,同时停止旧 pod 并启动新 pod。我们有运行 tomcat 的 pod,连接到 MySQL 数据库。

一旦tomcat收到停止命令,它就会开始停止应用程序。但是,仍然有任务在运行并且失去与数据库的连接会导致抛出大量异常。没关系,因为应用程序不再执行任何操作。我的问题是,这会向我们的日志“垃圾邮件”发送致命错误,并且很难区分哪些异常是相关的,哪些是由应用程序停止引起的。

其中一个例外是:

java.lang.IllegalStateException:非法访问:此 Web 应用程序 实例已经停止。不能加载 [sun.reflect.NativeMethodAccessorImpl]。以下堆栈跟踪是 抛出用于调试目的以及尝试终止 导致非法访问的线程。

有没有办法防止记录此类异常?是否可以在发出停止信号后立即停止记录?

【问题讨论】:

    标签: kubernetes google-kubernetes-engine stackdriver google-cloud-stackdriver


    【解决方案1】:

    您应该使用 fluentd 之类的工具来管理您的日志记录,然后使用 exclude filter 来记录您的异常日志。 Kubernetes 或容器引擎无法过滤标准输出上显示的内容。

    【讨论】:

    • 但是如何将排除过滤器设置为“忽略停止信号后记录的日志”?我认为这行不通。
    【解决方案2】:

    kubernetes 为 pod 提供生命周期回调来处理此类场景,您可以在 pod 关闭时执行自定义脚本以删除日志,例如 PreStop 回调

    apiVersion: v1
    kind: Pod
    metadata:
      name: lifecycle-demo
    spec:
      containers:
      - name: lifecycle-demo-container
        image: nginx
        lifecycle:
          preStop:
            exec:
              command: [" your custom command to delete log entries"]
    

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2020-02-21
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多