[英]Logs of pods missing from /var/logs/ in Kubernetes
我有一個集群,它有許多作為 pod 運行的服務,我想用 fluentd 從中提取日志。 所有服務在執行kubectl logs service
時都會顯示日志。 但是,某些日志不會顯示在這些文件夾中:
盡管其他容器在那里。 那里的容器被創建為 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
中呢?
這就是我將如何繼續找出容器正在記錄的位置:
識別運行 Pod 的節點:
kubectl get pod pod-name -owide
SSH 在該節點上,您可以檢查該節點正在使用哪個日志記錄驅動程序:
docker info | grep -i logging
如果 output 是json-file
,那么日志將按預期寫入文件。 如果有什么不同,那么它可能取決於驅動程序做什么(有很多驅動程序,他們可以寫入journald
,例如,或其他選項)
如果日志記錄驅動程序寫入文件,您可以通過了解特定 Pod 的容器 id 來檢查特定 Pod 的當前 output,在控制平面節點上執行此操作:
kubectl get pod pod-name -ojsonpath='{.status.containerStatuses[0].containerID}'
(如果同一個 pod 中有多個容器,使用的索引可能會有所不同,具體取決於您要檢查的容器)
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.