Kubernetes 部署 - 外部化日志文件

use*_*872 5 logback spring-boot kubernetes

我有一个带有以下 docker 文件的 Spring Boot 应用程序。

FROM docker.com/base/jdk1.8:latest

MAINTAINER Application Engineering [ https://docker.com/ ]

RUN mkdir -p /opt/docker/svc

COPY application/weather-service.war /opt/docker/svc/

CMD java -jar /opt/docker/svc/weather-service.war --spring.config.location=file:/conf/application.properties -Dlogging.config=/conf/logback.xml
Run Code Online (Sandbox Code Playgroud)

我可以将 kubernetes configMap 或 secrets 用于 application.properties,并使用如下所示的卷挂载选项。

"spec": {
        "volumes": [
          {
            "name": "svc-prop",
            "configMap": {
              "name": "svc-app-config",
              "items": [
                {
                  "key": "application.properties",
                  "path": "application.properties"
                }
              ]
            }
          }
         ],
        "containers": [
          "volumeMounts": [
              {
                "name": "svc-prop",
                "mountPath": "/conf"
              }
         ]
Run Code Online (Sandbox Code Playgroud)

我如何才能为 logback.xml 实现相同的目标。在这种情况下,我是否需要将机密用作文件?

我不想将 logback.xml 文件与图像捆绑在一起,因为我们可能会在运行时更改日志级别。

还有其他更好的方法可以在 Kubernetes 中为 Spring Boot 应用程序保留 logback.xml 吗?

Top*_*ion 8

通常您不想提供整个logback.xml文件,而是logger需要在运行时最频繁更新的列表。为了实现这一点,您可以使用Logback 的文件包含功能:

  1. logback.xml像往常一样写你的文件,除了logger列表。改用include元素:
    <configuration scan="true" scanPeriod="10 seconds" debug="true">
        <appender ...></appender>
        <root level="INFO">...</root>

        <!-- Import loggers configuration from external file -->
        <include file="config/mount/loggers-include.xml"/>
    </configuration>
Run Code Online (Sandbox Code Playgroud)

注意这些scan*属性。它们对于在运行时重新加载日志配置至关重要。

  1. 使用loggers-include.xmldata 部分定义 Kubernetes ConfigMap 中的所有记录器:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: microservice-loggers    # the name to refer to from deployment (see below)
      namespace: upc
    data:
      loggers-include.xml: |+
        <included>
          <logger name="org.springframework.cloud.netflix.zuul" level="INFO"/>
          <logger name="com.netflix.zuul" level="INFO"/>                              
          <logger name="com.netflix.hystrix" level="INFO"/>                          
          <logger name="com.netflix.ribbon" level="DEBUG"/>
          <logger name="com.netflix.loadbalancer" level="INFO"/>                     
        </included>
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,所有包含的内容都必须包含在included标签中才能被 Logback 正确解析。

  2. 将 ConfigMap 的数据作为config/mount/loggers-include.xml文件挂载到容器中:

    apiVersion: apps/v1
    kind: Deployment
    ...
    spec:
      ...
      template:
        ...
        spec:
          # declare the volume created from ConfigMap
          volumes:
            - name: config-volume             # used with this name below
              configMap:
                name: microservice-loggers    # declared in previous step
          containers:
          - name: microservice
            ...
            ports:
              ...
            # mount the volume declared above to container's file system
            volumeMounts:
              - mountPath: /microservice/config/mount
                name: config-volume       # declared above
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,mount目录不得由容器本身或其映像创建。此外,如果存在这样的目录,在挂载过程中将删除其所有内容。

  3. 应用 ConfigMap运行声明的部署。要检查 loggers 文件是否正确挂载,请执行以下命令:

    $ kubectl exec restorun-7d757b7c6-wcslx -- ls -l /microservice/config/mount
    total 0
    lrwxrwxrwx    1 root     root            26 Aug 14 05:52 loggers-include.xml -> ..data/loggers-include.xml
    
    Run Code Online (Sandbox Code Playgroud)

    此外,如果您debug=true在 Logback 的configuration元素中设置了 属性(请参阅步骤 1),那么您应该在应用程序启动期间在 STDOUT 中看到以下记录:

    05:52:17,031 |-INFO in ch.qos.logback.core.joran.util.ConfigurationWatchListUtil@6e06451e - Adding [file:/microservice/config/mount/loggers-include.xml] to configuration watch list.
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在您可以编辑您的 ConfigMap(例如设置com.netflix.hystrix为 level WARN),保存其文件并告诉 Kubernetes 将更改应用于应用程序:

    $ kubectl apply -f microservice-log-configmap.yaml
    configmap "microservice-loggers" configured
    
    Run Code Online (Sandbox Code Playgroud)

    同样,Logback 应该通过将以下消息记录到标准输出来反映更改:

        05:59:16,974 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.netflix.hystrix] to WARN
    
    Run Code Online (Sandbox Code Playgroud)

    您还可以通过直接从 Spring Boot Actuator 询问来检查有效的日志级别(如果您有权访问此端点):

    $ curl http://<k8s-external-ip>/actuator/loggers/com.netflix.hystrix
    {
      "configuredLevel" : "WARN",
      "effectiveLevel" : "WARN"
    }
    
    Run Code Online (Sandbox Code Playgroud)

如果级别保持不变,请等待一分钟并再次检查:更改通过 Kubernetes 和 Logback 传播需要一些时间。有关此主题的更多信息:


mon*_*mon 5

您已经完成了...使用 ConfigMap 并在需要更新 logback.xml 时使用“kubectl edit”来更新 ConfigMap。

当 ConfigMap 或 Secret 被更新时,它最终会反映在容器内,如果这样配置,例如通过scan,那么应用程序最终将获取更改。如果没有,则需要重新启动 pod 以获取更新的 logback.xml。

为 logback 创建一个配置映射。

apiVersion: v1
kind: ConfigMap
metadata:
  name: logback-configmap
data:
  logback.xml: |+
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <include resource="org/springframework/boot/logging/logback/base.xml"/>
      <logger name="org.springframework.web" level="DEBUG"/>
    </configuration>
Run Code Online (Sandbox Code Playgroud)

将 configmap 指定为部署中的卷。

  volumes:
  - configMap:
      name: logback-configmap
    name: logback
Run Code Online (Sandbox Code Playgroud)

在您的容器中安装 configmap 卷。

    volumeMounts:
    - mountPath: /path/to/logback.xml
      name: logback
Run Code Online (Sandbox Code Playgroud)