我在Kubernetes集群中的同一个Pod中运行了两个容器的部署。一个是NGINX,另一个是侧面(bash图像)。以下是定义文件:
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
(ref-> https://docs.docker.com/config/containers/logging/)的标准日志。
我使用的是emptyDir卷,这意味着所有容器都将在主机上的吊舱中共享相同的存储位置。
当我在服务或Nginx上做curl时,我从NGINX服务器获得成功的响应,它的日志可以使用控制台上的kubectl logs <pod name> sidecar -f
命令看到。
我不完全理解的是,命令( bash/sidecar容器中)中的文件路径是/var/log/sidecar/access.log,而不是/var/log/nginx/ able .log,那么为什么我能够获得这些日志,因为目录/var/log/sidecar中不存在文件access.log。
请告诉我,谢谢
发布于 2021-01-06 01:45:46
在进入您的问题之前,您需要了解Kubernetes Pod的工作原理。
在Kubernetes中,同一个Pod中的所有容器都调度在同一个节点上。在节点内部,它们与容器运行时一起编排。
为了简化对接运行时,Kubernetes将根据您的配置生成两个容器。一个是NGINX,另一个是bash。在容器编排中,您可以定义一个卷并在不同的容器运行时之间共享它们。但是在场景后面,他们使用的是来自主机的相同的文件夹/文件。
因此,回到您的问题,Kubernetes在您的主机中创建了两个容器。它还创建了一个码头体积,用于在这两个集装箱之间共享。在容器内部,卷被安装到不同的路径中,但仍然共享来自工作机器的相同的真理源。
如果您想知道它在工作机器上的运行情况,可以将ssh输入到worker中,然后运行以下命令。
# Get your container ID
> docker ps
# Inspect your container
> docker inspect <container>
并尝试在输出中找出音量部分。您应该能够看到他们正在共享卷。
发布于 2021-01-06 01:39:26
也许你做错了什么,当测试这个。我已将您的K8s清单安装到我的K8s集群中,并发现所有内容都正常工作:
/var/log/nginx
并向其写入几个文件.sidecar容器将相同的卷装入到/var/log/sidecar
.中,从而访问nginx在下编写的日志。
/var/log/nginx
.容器不能直接访问
https://stackoverflow.com/questions/65591810
复制