我在Kubernetes集群的同一个Pod中部署了2个运行在其中的容器。 一个是NGINX,另一个是sidecar(bash镜像)。 以下是定义的yaml文件:
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
- image: bash
name: sidecar
command: ["/bin/sh","-c","tail -f /var/log/sidecar/access.log"]
volumeMounts:
- name: logs
mountPath: /var/log/sidecar
我知道Docker镜像(NGINX)会将标准日志生成到/var/log/nginx/access.log
位置。
我使用emptyDir
卷,这意味着所有容器将在主机上的pod内共享相同的存储位置。
当我在服务或Nginx pod上进行curl
时,我会从NGINX服务器获得成功的响应,并且可以使用控制台上的kubectl logs <pod name> sidecar -f
命令查看其日志。
我不太明白的是,命令中的文件路径(在bash/sidecar
容器内)是/var/log/sidecar/access.log
,而不是/var/log/nginx/access.log
,那么为什么我能够得到这些日志,因为/var/log/sidecar
目录下不存在access.log
文件。
请教,谢谢
在进入你的问题之前,你需要知道Kubernetes Pod的工作原理。
在Kubernetes中,同一个Pod中的所有容器都被安排在同一个node中。在node里面,它们是用容器运行时来协调的。
以docker运行时为例,Kubernetes会根据你的配置生成两个容器。一个是NGINX,一个是bash。在容器编排中,你可以定义一个卷,并在不同的容器运行时共享它们。但在幕后,它们使用的是来自主机的相同文件夹/文件。
所以,绕回你的问题,Kubernetes这里在你的主机中创建了两个容器。而且它还创建了一个docker卷来共享这两个容器。在容器内部,卷被挂载到不同的路径中,但仍然共享相同的源,它来自于worker机器。
如果你想知道你的worker机器上的情况,你可以通过ssh进入你的worker,然后运行以下命令。
# 获取你的容器ID > docker ps # 检查你的容器 > docker inspect <container>。
并尝试发现输出中的volume部分。你应该可以看到它们是共享volume的。
明白了,谢谢大佬。
你的答案