使用 Kubernetes 上的卷的挂载路径问题

问题描述

我有一个 3 节点集群(1 个主节点和 2 个工作节点) 我在其中一个工作节点上有一个使用 pod 映像作为 Nginx 运行的部署。以下是其清单定义:-

apiVersion: apps/v1
kind: Deployment
Metadata:
  creationTimestamp: null
  labels:
    run: Nginx
  name: Nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: Nginx
  strategy: {}
  template:
    Metadata:
      creationTimestamp: null
      labels:
        run: Nginx
    spec:
      volumes:
      - name: logs
        emptyDir: {}
      containers:
      - image: Nginx
        name: Nginx
        resources: {}
        volumeMounts:
          - name: logs
            mountPath: /var/log/Nginx

如果我跟踪 Nginx 日志,我可以看到在 /var/log/Nginx 位置生成日志:-

vagrant@mykubemaster:~/my-k8s/sidecar$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
Nginx-5bb7d5c6dd-hjxnr   1/1     Running   0          8m8s
vagrant@mykubemaster:~/my-k8s/sidecar$ kubectl exec Nginx-5bb7d5c6dd-hjxnr -- tail -f /var/log/Nginx/access.log
10.32.0.1 - - [06/Jan/2021:02:43:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:43:56 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:46:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:46:17 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:48:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"

但是,问题是如果我 ssh 进入工作节点(两个)甚至主节点,我没有看到任何文件夹作为 Nginx 在 /var/log 下创建然后这个文件( access.log) 正在被存储,我可以使用 -f 和 --tail 命令很好地流式传输?

我的理解是,当我们执行卷挂载时,Pod 会使用配置 Pod 的 VM 存储位置。如果在 node02 上,则在 Node02 上的清单中指定的某个位置。

如果您能帮助我理解这一点并找到文件路径,我将不胜感激。

解决方法

您将日志存储在 emptyDir volume 中。这不是持久化的,也不是从 pod 外部访问的;它在宿主机系统上没有固定的位置,一旦删除pod,里面的内容就会丢失。

image: nginx 的特定情况下,Docker Hub nginx 映像默认配置为将其访问日志写入容器的标准输出。如果您删除 volumes:volumeMounts:,则 kubectl logs deployment/nginx 将显示访问日志。然后,集群管理员可以部署日志收集器将这些日志转发到其他地方;请参阅 Kubernetes 文档中的例如 Using a node logging agent

同样的建议适用于大多数其他进程:设置日志记录到进程的标准输出而不是文件,Kubernetes 会收集它,如果需要查看,您可以部署转发器将日志发送到其他地方稍后他们。