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

How does Kubernetes map ports of multi-container Pods?

我正在尝试学习 Kubernetes。我不明白的一件事是以下情况:

鉴于我有一个包含 2 个容器的容器。一个容器运行一个侦听端口 80 的应用程序,另一个容器是一个 sidecar,它从 Web 资源进行一些轮询但不侦听任何端口。

现在,当我使用 TargetPort = 80 启动服务时,Kubernetes 如何知道 pod 中的哪个容器公开了这个端口?它是否检查所有容器以检查暴露的端口?或者它只是在 pod 中的 all 个容器上为端口 80 做一个映射?

此外,是否可以在 Kubernetes 中更改容器暴露的端口,以便容器暴露的端口 (=containerPort) 映射到 内的不同端口容器? 我的意思是类似于 -p 参数 Docker.

如果我很好地理解你的问题,关于你问题的解释将在 this article:

Containers are often intended to solve a single, narrowly defined problem, such as a microservice, but in the real world, problems require multiple containers for a complete solution. In this article, we’re going to talk about combining multiple containers into a single Kubernetes Pod, and what it means for inter-container communication.

单个 pod 中容器之间的通信有几种类型,文章中对它们进行了描述。

最重要的部分应该是Inter-container network communication

另请参阅 this guide about Multi-Container Pods in Kubernetes

您还可以找到带有示例的教程 - Extending applications on Kubernetes with multi-container pods

Pods 的 Kubernetes 概述文档注释:

Every container in a Pod shares the network namespace.... Within a Pod, containers share an IP address and port space....

因此,如果您在一个 Pod 中有多个容器,从该 Pod 外部看,它们看起来都“相同”,就像您可以在一台物理机器上拥有多个服务器进程一样 运行ning使用单一 IP 地址。您不能 运行 两个容器在同一个 Pod 中侦听同一个端口。入站请求将到达恰好侦听该端口(如果有)的容器中的任何一个。

Is it possible to change the containers exposed port in Kubernetes, so the port the container exposes (=containerPort) maps to a different port within the container?

你可以用你的服务做到这一点。请记住,您通常不会直接连接到 Pod;相反,您连接到一个服务并将请求转发到匹配的 Pods 之一。所以如果你的 Pod 规范说

containers:
  - name: sidecar
    # ...
  - name: server
    ports:
      - name: http
        containerPort: 8080

那么对应的Service就可以说

ports:
  - port: 80
    targetPort: http

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