Kubernetes如何映射多容器Pod的端口?

3
我正在学习Kubernetes。有一件事我不太明白,就是以下的场景:
假设我有一个Pod,里面有两个容器。其中一个容器运行一个监听80端口的应用程序,另一个容器是一个边车,会从网络资源中进行一些轮询操作,但不会监听任何端口。
现在,当我启动一个 TargetPort 为80的服务时,Kubernetes如何知道该Pod中哪个容器暴露了这个端口?它是否检查所有容器以检查暴露的端口?还是只对Pod中所有容器的端口80进行映射?
此外,在Kubernetes中是否可以更改容器暴露的端口,以便容器暴露的端口(=containerPort)映射到容器内的不同端口?
我的意思是类似于Docker中的-p参数。
2个回答

6
Kubernetes的Pods概述文档指出:
每个Pod中的容器共享网络命名空间... 在一个Pod中,容器共享IP地址和端口空间...
因此,如果您在一个Pod中有多个容器,从该Pod外部看,它们都看起来“相同”。这就像在单个物理机上运行多个服务器进程并具有单个IP地址一样。您不能在同一Pod中运行监听相同端口的两个容器。入站请求将到达在该端口上监听(如果有)的任何一个容器。
在Kubernetes中,是否可以更改容器开放的端口,以便容器暴露的端口(=containerPort)映射到容器内的不同端口?
您可以使用Service来实现此操作。请记住,通常情况下,您不会直接连接到Pod,而是连接到Service,然后将请求转发到匹配的Pod之一。因此,如果您的Pod规范说明:
containers:
  - name: sidecar
    # ...
  - name: server
    ports:
      - name: http
        containerPort: 8080

那么相应的服务可以说

ports:
  - port: 80
    targetPort: http

当你连接到 http://service-name.namespace.svc.cluster.local 时,将使用默认的 HTTP 端口80进行连接,即使容器进程实际上正在侦听端口8080或3000或其他任何端口。


谢谢您的回答,但我的问题更多地涉及Kubernetes如何在Pod中有多个容器时内部知道要将流量委派给哪个容器。 Kubernetes本身如何知道容器正在侦听哪个端口? 因此,这更多是关于K8内部工作方式的问题,而不是从用户角度考虑。 - Tobias von Falkenhayn
由于这两个容器位于同一网络命名空间中,Kubernetes 无需知道。Pod 中任何容器中的任何进程侦听端口接收请求。这是由 Linux 内核进行管理的。(containers: [{ports:}] 实际上并不重要。) - David Maze
啊,现在我懂了。我忘记了“相同网络命名空间”的事情。因为我已经在使用Docker,我一直在考虑每个容器都有自己的命名空间。 :) - Tobias von Falkenhayn
作为一个旁注,据我所知,@TobiasvonFalkenhayn,这就是暂停容器的用途。 - Eugene

0

如果我理解您的问题正确,关于您的问题的解释将在本文中:

容器通常旨在解决单个、狭义定义的问题,例如微服务,但在现实世界中,问题需要多个容器才能得到完整的解决方案。在本文中,我们将讨论将多个容器组合成单个Kubernetes Pod以及对容器间通信的影响。

单个Pod中容器之间有几种通信方式,这些方式在文章中有所描述。

最重要的部分应该是容器间网络通信

还可以查看Kubernetes中多容器Pod的指南

你也可以找到带有示例的教程 - 使用多容器Pod在Kubernetes上扩展应用程序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接