在 Kubernetes 中,当单个 Pod 中定义了多个容器时,它们会共享相同的网络命名空间。这意味着它们可以使用 localhost 相互通信,就像在同一环境中运行一样。不过,它们可以拥有独立的存储卷,从而实现更灵活的数据管理。
考虑这样一种情况:Pod 中的两个容器需要相互通信,但其中一个容器需要访问特定卷进行数据存储,而另一个则不需要。我们将在 Pod 的规范中对此进行配置。
【代码清单】
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod-example
spec:
volumes:
- name: shared-storage
emptyDir: {}
containers:
- name: app-container
image: nginx
volumeMounts:
- name: shared-storage
mountPath: /usr/share/nginx/ - name: sidecar-container
image: busybox
command: ['sh', '-c', 'echo "Hello from sidecar" > /usr/share/nginx/html/index.html']
【执行结果】
部署 Pod 后,访问 nginx 服务将在浏览器中显示 “Hello from sidecar”(来自 sidecar)消息,该消息由 sidecar 容器写入共享卷。
在多容器 Pod 中,容器可以共享存储卷,以交换数据或管理共享状态。网络命名空间共享意味着 Pod 中的所有容器都可以通过不同端口的本地主机进行通信。例如,一个容器可以运行应用服务器,而另一个容器可以处理日志记录或监控,直接进行通信而不会将端口暴露在 Pod 之外。这就允许在同一个 Pod 中采用不同的存储策略,其中一个容器可以存储持久数据,而另一个容器可以生成临时文件。这种设计可灵活配置 Pod 以满足特定的应用需求。
【小知识】
Kubernetes 在多容器 Pod 中使用 “sidecar ”容器的概念,即辅助容器通过处理日志、监控或数据同步等任务来支持主应用容器。Pod 是 Kubernetes 中最小的可部署单元,可确保其中的所有容器紧密耦合并协同工作,共享 CPU、内存和存储等资源。