Kubernetes emptyDir 卷中不同容器中同一文件的尾部输出不完整

Incomplete tail output from the same file in different containers in Kubernetes emptyDir volume

为了测试 emptyDir 卷中的文件是否在容器之间同步,我使用 tail 观察两个容器中的同一个文件,我偶然发现了以下行为:

广告连播定义:

apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers:
    - image: luksa/fortune
      name: html-generator
      volumeMounts:
        - name: html
          mountPath: /var/htdocs
    - image: nginx:alpine
      name: web-server
      volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
          readOnly: true
      ports:
        - containerPort: 80
          protocol: TCP
  volumes:
    - name: html
      emptyDir: {}

示例取自 Marko Luksa 的 Kubernetes in Action 一书。 luksa/fortune 图像只是将 fortune 文本写入 html-generator 容器内的文件 /var/htdocs/index.html。每 10 秒写入一个新文件,其中内容是 fortune.

的输出

在两个容器中拖尾相同的文件 有时 web-server 容器的响应不完整。

部分html-generator容器输出:

kubectl exec -c html-generator -it fortune -- tail -f /var/htdocs/index.html

The very ink with which all history is written is merely fluid prejudice.
                -- Mark Twain

部分web-server容器输出

kubectl exec -c web-server -it fortune -- tail -f /usr/share/nginx/html/index.html

h all history is written is merely fluid prejudice.
                -- Mark Twain

问题:这是

造成的吗
  1. 尾巴
  2. 节点磁盘IO速度慢
  3. Kubernetes 卷同步逻辑
  4. 还有别的吗?

PS.: 我还注意到,在写入 index.html 时卷曲 web-service pod 端口会导致 nginx return 一个空的响应主体。

容器输出不完整的问题是由 pod 定义中使用的 nginx alpine 引起的。 当您将图像从 nginx:alpine 更改为 nginx 时,问题就会消失,因为这些图像中使用了不同的尾部二进制文件。

Kubernetes 卷同步似乎不太可能导致问题 - 正如 emptyDir documentation

中所写

By default, emptyDir volumes are stored on whatever medium is backing the node - that might be disk or SSD or network storage, depending on your environment.

partition created by emptyDir 是短暂的,应用程序不能期望来自该分区的任何性能 SLA(例如磁盘 IOPS),因此“2. 节点磁盘的 IO 速度慢”也可能导致此类问题,但基于复制和更改图像(似乎可以解决问题)可能会被排除在外。