kubernetes:一个pod中的多个容器如何使用localhost



我看到kubernets使用pod,然后在每个pod中可以有多个容器。

示例I创建一个带有的吊舱

Container 1: Django server - running at port 8000
Container 2: Reactjs server - running at port 3000

既然里面的集装箱不可能有港口冲突,那么最好把所有的集装箱都放在一个集装箱里。因为我认为使用集装箱的好处是不必担心港口冲突。

Container 1: BOTH Django server - running at port 8000 and Reactjs server - running at port 3000

不需要容器2。

以及

当我在电脑上运行不同的docker容器时,我无法像本地主机那样访问它们

但是,在一个有多个容器的POD中,这怎么可能呢。

在PC上运行的docker容器和在POD内运行的DockerContainer之间有什么区别。

思考这种描绘的典型方式是"我的应用程序的哪些部分可以一起扩展">

因此,就你的例子而言,你可能甚至不会为它们选择一个通用的吊舱。您应该有一个Django pod和一个ReactJS服务器pod。因此,您可以独立缩放这些。

部署具有多个容器的pod的典型情况是称为"容器"的模式;侧车";,其中添加的容器增强了部署的工作负载的某些方面,并且始终与该工作负载容器一起进行扩展。例如:

  1. 将日志传送到中央日志服务器
  2. 安全审计
  3. 专门构建的代理-例如处理数据库连接详细信息
  4. Service Mesh(拦截所有网络流量并处理路由、断路、负载平衡等(

至于将软件部署到同一个容器中,只有当考虑将两个部分共同部署到同个容器中的两个部分由同一团队开发并解决了相同的问题时,这才是合适的(也就是说,当你考虑时,它们实际上只是一部分(。如果您可以想象它们由不同的团队拥有/维护,那么让这些团队发布一个干净的容器映像,并签订使用网络端口进行交互的合同。

(部分(详细信息如下:Pods是一个共享的Networking和IPC命名空间。因此,一个pod中的一个容器可以修改iptables,并且该修改适用于该pod中的所有其他容器。这可能有助于指导您的选择:哪些容器应该具有彼此亲密的关系?具体来说,我指的是Linux命名空间,这是内核的一个功能,它允许不同的进程共享资源,但不"共享";参见";彼此容器是正常的Linux进程,但有一些其他Linux功能可以阻止它们相互查看。这个视频很好地介绍了这些概念。(链接中的时间戳出现在简洁的幻灯片/瞬间(

编辑-我注意到这个问题被编辑成更简洁的关于网络。答案在我提到的Linux内核的命名空间功能中。每个进程都属于一个网络命名空间。如果不做任何特殊的操作,它将是默认的网络名称空间。容器通常启动到它们自己的网络命名空间中,这取决于用于启动它们的工具。然后,Linux包含了一个功能,您可以在其中虚拟连接两个命名空间,这被称为Veth Pair(虚拟以太网设备对,已连接(。在默认名称空间和容器名称空间之间设置Veth对后,两者都会获得一个新的eth设备,并且可以相互交谈。并不是所有的工具都会默认设置veth对(例如:Kubernetes默认不会这样做(。然而,您可以告诉Kubernetes在";主机";网络模式,它只使用系统的默认网络名称空间,因此甚至不需要veth对。

最新更新