Kubernetes相同服务的多个POD实例的日志配置

时间:2018-10-11 10:15:52

标签: azure spring-boot kubernetes logback pod

我们最近已转向针对企业应用程序的基于微服务的体系结构。我们正在使用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" />

2 个答案:

答案 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

这将创建一个符号链接,第三方库可以在其中编写而不更改任何代码。