我们最近已转向针对企业应用程序的基于微服务的体系结构。我们正在使用Kubernetes集群托管我们的所有微服务。
当前,我们没有配置ELK来管理日志,只是将应用程序日志存储到Azure Blob存储中。
当一个服务正在运行多个POD实例时,我们面临一个问题,因为所有实例都使用相同的日志文件来更新内容。因此,实例被卡住并出现内存泄漏问题。
我已经在docker容器中配置了挂载路径,并且我的logback属性在下面的条目中可以写入日志。
<property name="DEV_HOME" value="/mnt/azure/<service-name>/logs" />
有没有一种方法可以在日志配置中获取pod实例的名称,以便我可以再添加一个级别,以便为不同的实例提供单独的日志。
或者有更好的方法来处理这种情况。
<property name="DEV_HOME" value="/mnt/azure/<service-name>/<instances>/logs" />
答案 0 :(得分:1)
应该有可能将Pod信息(包括名称)设置为环境变量,如here所述。在应用程序中,读取环境变量并正确记录。
答案 1 :(得分:0)
如@PraveenSripati所述,向下api是解决方案。但是,在某些情况下,人们被迫使用第三方库,而无法使用环境变量来覆盖位置。 过去,我们已将Pod配置为使用向下API和K8S命令以及args的组合,以在启动应用程序之前运行自定义脚本。
我们假设日志位置设置为/ opt / logs,在这种情况下,我们执行以下操作:在构建脚本时将其保存在容器中。例如,我们称此entrypoint.sh
#!/bin/bash
log_location="/opt/log-$MY_POD_NAME/$MY_POD_IP"
mkdir -p /opt/log-$MY_POD_NAME/$MY_POD_IP
rm -f /opt/log
ln -s /opt/log $log_location
exec <Application_start_command>
Kubernetes POD定义
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "sh", "-c"]
args:
- /opt/entrypoint.sh
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
restartPolicy: Never
这将创建一个符号链接,第三方库可以在其中编写而不更改任何代码。