Kubernetes中Sidecar容器日志文件共享路径的问题

范姐 发表于: 2021-01-06   最后更新时间: 2021-01-06 23:13:01   2,390 游览

我在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文件。

请教,谢谢

发表于 2021-01-06

在进入你的问题之前,你需要知道Kubernetes Pod的工作原理。

在Kubernetes中,同一个Pod中的所有容器都被安排在同一个node中。在node里面,它们是用容器运行时来协调的。

以docker运行时为例,Kubernetes会根据你的配置生成两个容器。一个是NGINX,一个是bash。在容器编排中,你可以定义一个卷,并在不同的容器运行时共享它们。但在幕后,它们使用的是来自主机的相同文件夹/文件。

所以,绕回你的问题,Kubernetes这里在你的主机中创建了两个容器。而且它还创建了一个docker卷来共享这两个容器。在容器内部,卷被挂载到不同的路径中,但仍然共享相同的源,它来自于worker机器。

如果你想知道你的worker机器上的情况,你可以通过ssh进入你的worker,然后运行以下命令。

# 获取你的容器ID
> docker ps
# 检查你的容器
> docker inspect <container>。

并尝试发现输出中的volume部分。你应该可以看到它们是共享volume的。

范姐 -> 半兽人 4年前

明白了,谢谢大佬。

你的答案

查看kubernetes相关的其他问题或提一个您自己的问题