在 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、内存和存储等资源。