Журналы модулей, отсутствующих в / var / logs / в Kubernetes

У меня есть кластер с многочисленными службами, работающими в виде модулей, из которых я хочу получать журналы с помощью fluentd. Все службы показывают журналы при выполнении kubectl logs service. Однако некоторые журналы не отображаются в этих папках:

  • / var / журнал
  • / вар / журнал / контейнеры
  • / var / log / pods

хотя другие контейнеры есть. Контейнеры, которые там есть, создаются как задание Cron или как диаграмма Helm, как установка MongoDB.

Контейнеры, которые не регистрируются, созданы мной с помощью файла развертывания, например:

kind: Deployment
metadata:
    namespace: {{.Values.global.namespace | quote}}
    name: {{.Values.serviceName}}-deployment
spec:
    replicas: {{.Values.replicaCount}}
    selector:
        matchLabels:
            app: {{.Values.serviceName}}
    template:
        metadata:
            labels:
                app: {{.Values.serviceName}}
            annotations:
                releaseTime: {{ dateInZone "2006-01-02 15:04:05Z" (now) "UTC"| quote }}
        spec:
            containers:
                  - name: {{.Values.serviceName}}
                    # local: use skaffold, dev: use passed tag, test: use released version
                    image: {{ .Values.image }}
                        {{- if (eq .Values.global.env "dev") }}:{{ .Values.imageConfig.tag}}{{ end }}
                    imagePullPolicy: {{ .Values.global.imagePullPolicy }}
                    envFrom:
                        - configMapRef:
                            name: {{.Values.serviceName}}-config
                    {{- if .Values.resources }}
                    resources:
                        {{- if .Values.resources.requests }}
                        requests:
                            memory: {{.Values.resources.requests.memory}}
                            cpu: {{.Values.resources.requests.cpu}}
                        {{- end }}
                        {{- if .Values.resources.limits }}
                        limits:
                            memory: {{.Values.resources.limits.memory}}
                            cpu: {{.Values.resources.limits.cpu}}
                        {{- end }}
                    {{- end }}
            imagePullSecrets:
                - name: {{ .Values.global.imagePullSecret }}  
            restartPolicy: {{ .Values.global.restartPolicy }}
{{- end }}

и CMD Dockerfile, например: CMD ["node", "./bin/www"]

Одно из предположений может заключаться в том, что CMD не передает канал в STDOUT, но почему тогда журналы отображаются в kubectl logs?


person rStorms    schedule 11.06.2021    source источник


Ответы (1)


Вот как я хотел бы узнать, где ведется журнал контейнера:

  1. Определите узел, на котором работает Pod:

    kubectl get pod pod-name -owide
    
  2. SSH на этом узле, вы можете проверить, какой драйвер ведения журнала используется узлом, с помощью:

    docker info | grep -i logging
    

    если вывод json-file, то журналы записываются в файл, как ожидалось. Если есть что-то другое, это может зависеть от того, что делает драйвер (есть много драйверов, они могут писать, например, в journald или другие параметры)

  3. Если драйвер ведения журнала записывает в файл, вы можете проверить текущий вывод для конкретного модуля, зная идентификатор контейнера этого модуля, для этого на узле плоскости управления:

    kubectl get pod pod-name -ojsonpath='{.status.containerStatuses[0].containerID}'
    

    (если в одном модуле больше контейнеров, используемый индекс может отличаться в зависимости от того, какой контейнер вы хотите проверить)

  4. С извлеченным идентификатором, который будет выглядеть примерно как docker://f834508490bd2b248a2bbc1efc4c395d0b8086aac4b6ff03b3cc8fd16d10ce2c, вы можете проверить контейнер с помощью docker на узле, на котором контейнер запущен. Просто удалите часть docker:// из идентификатора, снова SSH на узле, который вы указали ранее, затем выполните:

    docker inspect container-id | grep -i logpath
    

Что должно выводить, где контейнер активно записывает свои журналы в файл.


В моем случае конкретный контейнер, в котором я пробовал эту процедуру, в настоящее время входит в систему:

/var/lib/docker/containers/289271086d977dc4e2e0b80cc28a7a6aca32c888b7ea5e1b5f24b28f7601ff63/289271086d977dc4e2e0b80cc28a7a6aca32c888b7ea5e1b5f24b28f7601ff63-json.log
person AndD    schedule 11.06.2021