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
问题:这是
造成的吗
- 尾巴
- 节点磁盘IO速度慢
- Kubernetes 卷同步逻辑
- 还有别的吗?
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 速度慢”也可能导致此类问题,但基于复制和更改图像(似乎可以解决问题)可能会被排除在外。
为了测试 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
问题:这是
造成的吗- 尾巴
- 节点磁盘IO速度慢
- Kubernetes 卷同步逻辑
- 还有别的吗?
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 速度慢”也可能导致此类问题,但基于复制和更改图像(似乎可以解决问题)可能会被排除在外。