容器间通信_Kubernetes中容器到容器通信

本文介绍了在Kubernetes中Pod内的容器如何进行通信,包括通过共享卷和进程间通信(IPC)的方式。共享卷允许容器之间共享数据,而IPC使得容器能使用SystemV信号量或POSIX共享内存进行交互。同时,文章提到了使用这些通信方式的实例和注意事项,揭示了Pod内多容器协同工作的原理。
摘要由CSDN通过智能技术生成

Kubernetes是一个容器化的解决方案。它提供了Pods的运行时环境,该环境可以容纳一个或多个容器。Kubernetes的一个重要方面是Pod内的容器通信。

此外,管理Kubernetes网络的一个重要领域是在内部和外部转发容器端口,以确保Pod中的容器之间能够正确通信。为了管理此类通信,Kubernetes提供以下四种联网模型:

  • 容器到容器通信
  • Pod到Pod通信
  • Pod到Service通信
  • 对外通信

在本文中,我们将向你展示容器中容器之间的联网和通信方式。

容器之间的通信

在单个Pod中拥有多个容器,要使它们彼此之间进行通信变得相对简单,可以使用几种不同的方法来做到这一点。在本文中,我们将详细讨论两种方法:共享卷和进程间通信。

1. Kubernetes Pod中的共享卷

在Kubernetes中,你可以使用共享的Kubernetes卷,作为在Pod中的容器之间共享数据的简单有效的方法。在大多数情况下,Pod中所有容器共享使用主机上的目录就足够了。

Kubernetes Volumes使数据能够在容器重启后幸免于难,但是这些卷具有与Pod相同的生存期。这意味着卷(及其存储的数据)与Pod存在的时间完全一样。如果出于任何原因删除了该Pod,即使创建了相同的替换,共享卷也将被破坏并从头开始创建。

具有共享卷的多容器Pod的标准用例是,一个容器将日志或其他文件写入共享目录,而另一个容器从共享目录读取。例如,我们可以像这样创建一个Pod:

apiVersion: v1kind: Podmetadata:  name: mc1spec:  volumes:  - name: html    emptyDir: {}  containers:  - name: 1st    image: nginx    volumeMounts:    - name: html      mountPath: /usr/share/nginx/html  - name: 2nd    image: debian    volumeMounts:    - name: html      mountPath: /html    command: ["/bin/sh", "-c"]    args:      - while true; do          date >> /html/index.html;          sleep 1;        done

在此示例中,我们定义了一个名为html的卷。它的类型为emptyDir,这意味着该卷是在将Pod分配给节点时首次创建的,并且只要该Pod在该节点上运行就存在。顾名思义,它最初是空的。第一个容器运行Nginx服务器,并将共享卷安装到目录/usr/share/nginx/html。第二个容器使用Debian镜像,并将共享卷安装到目录/ html。第二个容器每秒将当前日期和时间添加到共享卷中的index.html文件中。

当用户向Pod发出HTTP请求时,Nginx服务器将读取此文件并将其传回给用户。

b2ad18793bcfd04f35fd33ba30a2ac67.png

你可以通过暴露nginx端口并使用浏览器访问它,或通过直接在容器中检查共享目录来检查Pod是否正常工作:

$ kubectl exec mc1 -c 1st -- /bin/cat /usr/share/nginx/html/index.html ... $ kubectl exec mc1 -c 2nd -- /bin/cat /html/index.html ...

2. 进程间通信(Inter-Process Communications,IPC)

Pod中的容器共享相同的IPC名称空间,这意味着它们还可以使用标准的进程间通信,例如SystemV信号量或POSIX共享内存相互通信。容器使用本地主机名的策略在Pod中进行通信。

在下面的示例中,我们定义了具有两个容器的Pod。两者都使用相同的Docker镜像。第一个容器是生产者,它创建一个标准的Linux消息队列,写一些随机消息,然后写一个特殊的退出消息。第二个容器是使用者,它打开相同的消息队列以读取消息,直到接收到退出消息为止。我们还将重启策略设置为“从不”,因此在两个容器终止后,容器停止。

apiVersion: v1kind: Podmetadata:  name: mc2spec:  containers:  - name: producer    image: allingeek/ch6_ipc    command: ["./ipc", "-producer"]  - name: consumer    image: allingeek/ch6_ipc    command: ["./ipc", "-consumer"]  restartPolicy: Never

要检查这一点,请使用kubectl create创建pod并观察Pod的状态:

$ kubectl get pods --show-all -wNAME      READY     STATUS              RESTARTS  AGEmc2       0/2       Pending             0         0smc2       0/2       ContainerCreating   0         0smc2       0/2       Completed           0         29

现在,你可以检查每个容器的日志,并验证第二个容器是否收到了第一个容器的所有消息,包括退出消息:

$ kubectl logs mc2 -c producer...Produced: f4Produced: 1dProduced: 9eProduced: 27$ kubectl logs mc2 -c consumer...Consumed: f4Consumed: 1dConsumed: 9eConsumed: 27Consumed: done

fa74d55fe7201cd9b1ab2f41a5664ca3.png

但是,此Pod存在一个主要问题,它与容器的启动方式有关。

结论

Pods可以具有多个容器的主要原因是为了提供支持主应用程序的辅助应用程序。辅助应用程序的典型示例是数据提取器,数据推送器和代理。这种模式的示例是,带有帮助程序的Web服务器,该程序轮询git存储库以获取新更新。

在本文中,我们首先介绍了使用共享卷实现容器之间通信的方式,但如果删除并重新创建Pod,则共享卷中存储的所有数据都会丢失。后面,我们还讨论了Pod内容器之间的进程间通信的概念,它是共享卷的替代方法。

现在,你了解了Pod中的容器如何通信和交换数据,接下来可以继续学习其他Kubernetes网络模型,例如Pod到Pod或Pod到Service的通信。

译者:王延飞 译文链接: https://thenewstack.io/review-of-container-to-container-communications-in-kubernetes/ END
Kubernetes CKA实战培训班推荐:

北京:12月18-20日

cb41c87b1a661b4b90c4669f54d40bef.png

127f5beb6ee32a59b35ea90591e5cf31.gif

cdaf3418a32813f6a5e1711a25933071.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值