簡體   English   中英

Kubernetes 中 /var/logs/ 中缺少的 pod 日志

[英]Logs of pods missing from /var/logs/ in Kubernetes

我有一個集群,它有許多作為 pod 運行的服務,我想用 fluentd 從中提取日志。 所有服務在執行kubectl logs service時都會顯示日志。 但是,某些日志不會顯示在這些文件夾中:

  • /var/日志
  • /var/log/容器
  • /var/log/pods

盡管其他容器在那里。 那里的容器被創建為 Cronjob 或 Helm 圖表,如 MongoDB 安裝。

未記錄的容器是由我使用 Deployment 文件創建的,如下所示:

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 }}

和一個 Dockerfile CMD 像這樣: CMD ["node", "./bin/www"]

一種假設可能是 CMD 不會 pipe 到 STDOUT,但是為什么日志會出現在kubectl logs中呢?

這就是我將如何繼續找出容器正在記錄的位置:

  1. 識別運行 Pod 的節點:

     kubectl get pod pod-name -owide
  2. SSH 在該節點上,您可以檢查該節點正在使用哪個日志記錄驅動程序:

     docker info | grep -i logging

    如果 output 是json-file ,那么日志將按預期寫入文件。 如果有什么不同,那么它可能取決於驅動程序做什么(有很多驅動程序,他們可以寫入journald ,例如,或其他選項)

  3. 如果日志記錄驅動程序寫入文件,您可以通過了解特定 Pod 的容器 id 來檢查特定 Pod 的當前 output,在控制平面節點上執行此操作:

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

    (如果同一個 pod 中有多個容器,使用的索引可能會有所不同,具體取決於您要檢查的容器)

  4. With the id extracted, which will be something like docker://f834508490bd2b248a2bbc1efc4c395d0b8086aac4b6ff03b3cc8fd16d10ce2c , you can inspect the container with docker, on the node on which the container is running. 只需在您之前確定的節點上再次從 id SSH 中刪除docker://部分,然后執行以下操作:

     docker inspect container-id | grep -i logpath

output 應該是容器主動將其日志寫入文件的位置。


就我而言,我嘗試此過程的特定容器當前正在登錄:

/var/lib/docker/containers/289271086d977dc4e2e0b80cc28a7a6aca32c888b7ea5e1b5f24b28f7601ff63/289271086d977dc4e2e0b80cc28a7a6aca32c888b7ea5e1b5f24b28f7601ff63-json.log

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM