我有一个带有以下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吗?
答案 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功能:
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*
属性。它们对于在运行时重新加载日志配置至关重要。
使用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正确解析。
将您的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
目录既不能由容器本身也不能由其映像创建。此外,如果存在这样的目录,则在安装过程中将删除其所有内容 。
Apply the ConfigMap和run 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.
现在您可以编辑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传播。有关此主题的更多信息: