Kubernetes部署 - 外化日志文件

时间:2018-03-29 22:47:44

标签: spring-boot kubernetes logback

我有一个带有以下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

我可以使用kubernetes configMap或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"
              }
         ]

我如何为logback.xml实现同样的功能。在这种情况下,我是否需要将秘密用作文件?

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

还有其他更好的方法可以在Kubernetes中保留spring boot app的logback.xml吗?

2 个答案:

答案 0 :(得分:2)

您已经完成...使用ConfigMap并使用" kubectl edit"更新ConfigMap。什么时候需要更新logback.xml。

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

为logback创建一个configmap。

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>

将configmap指定为部署中的卷。

  volumes:
  - configMap:
      name: logback-configmap
    name: logback

将configmap卷挂载到容器中。

    volumeMounts:
    - mountPath: /path/to/logback.xml
      name: logback

答案 1 :(得分:0)

通常,您不想提供整个logback.xml文件,而是logger列表,它需要在运行时最频繁地进行更新。 为此,您可以使用Logback's file inclusion功能:

  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>

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

  1. 使用loggers-include.xml数据部分定义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>
    

    请注意,所有包含的内容必须包含在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
    

    请注意,mount目录既不能由容器本身也不能由其映像创建。此外,如果存在这样的目录,则在安装过程中将删除其所有内容

  3. Apply the ConfigMaprun the declared deployment。要检查记录器文件是否正确安装,请执行以下命令:

    $ 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
    

    此外,如果您在Logback的debug=true元素中设置了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.
    
  4. 现在您可以编辑ConfigMap(例如,将com.netflix.hystrix设置为WARN级别),保存其文件并告诉Kubernetes将更改应用于应用程序:

    $ kubectl apply -f microservice-log-configmap.yaml
    configmap "microservice-loggers" configured
    

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

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

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

    $ curl http://<k8s-external-ip>/actuator/loggers/com.netflix.hystrix
    {
      "configuredLevel" : "WARN",
      "effectiveLevel" : "WARN"
    }
    

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