使用 Kubernetes 上的卷的挂载路径问题
Problem with mount path using the volumes on 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 进入工作节点(两个)甚至主节点,我看不到在 [=27= 下创建的 nginx 任何文件夹] 然后这个文件 (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 将收集它,如果需要,您可以部署转发器将日志发送到其他地方稍后查看。
我有一个 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 进入工作节点(两个)甚至主节点,我看不到在 [=27= 下创建的 nginx 任何文件夹] 然后这个文件 (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 将收集它,如果需要,您可以部署转发器将日志发送到其他地方稍后查看。