Kubernetes中容器到容器通信是怎样的

55次阅读
没有评论

共计 2534 个字符,预计需要花费 7 分钟才能阅读完成。

这篇文章主要介绍“Kubernetes 中容器到容器通信是怎样的”,在日常操作中,相信很多人在 Kubernetes 中容器到容器通信是怎样的问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Kubernetes 中容器到容器通信是怎样的”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

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 服务器将读取此文件并将其传回给用户。

你可以通过暴露 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/ch7_ipc command: [./ipc ,  -producer] - name: consumer image: allingeek/ch7_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

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

到此,关于“Kubernetes 中容器到容器通信是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计2534字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)