docker - k8s如何知道Pod内部进程的目标端口?

标签 docker kubernetes portforwarding kubernetes-pod

假设我们有一个运行在Docker容器中并在端口3000上监听的Node应用程序。我们希望将此应用程序公开以在浏览器(也可以在端口3000)中访问。因此,我们进行如下端口转发:

docker run -p <port>:<targetPort> my-image // for example: 3000:3000
因此docker知道在哪个端口上侦听以及在容器内哪个进程转发网络。
但是在k8s NodePort服务中,它足以提供NodePort服务端口和Pod的目标端口,但不能提供Pod内部的目标端口,因此我们有随机的外部端口30,000-32,000(大约)来监听外部流量,将其转发到NodePort服务的端口,然后再转发到Pod的目标端口,但是..嘿,我们在Pod 中没有提到目标端口
那么Pod对象如何知道向其内部的哪个进程转发流量呢?我们通常假定Pod中只有一个容器,但是如果有多个容器呢?
还要注意,在Docker中公开图像的示例中-如果我们不提及端口转发,则整个博览会将无法工作,因此无法通过浏览器(容器外部)进行访问。

最佳答案

Pod规范中的containerPort仅是信息性的,非强制性的。提及并不能使Pod内部的应用程序在该端口上进行侦听。通常,您将在源代码或dockerfile中指定应用程序应侦听的端口。服务中的targetPort需要与该端口匹配。例如,将流量转发到Pod内运行的nginx容器的服务的targetPort应该是80,因为nginx进程监听端口80。
服务中的 targetPort`通知kubernetes服务在pod内运行的容器的哪个端口转发流量。
如果Pod中有多个容器在不同的端口上侦听,则可以在服务中指定多个targetPort,如下所示。

apiVersion: v1
kind: Service
metadata:
  name: service-name
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443
  - name: something
    port: 6001
    targetPort: 6001
  selector:
    app: app-label
  type: NodePort

关于docker - k8s如何知道Pod内部进程的目标端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63957305/

相关文章:

tcp - 通过 HTTP/s 传输任何类型的 TCP 流量

gateway - 如何让 netcat 接受来自 LAN 外部的连接?

spring-boot - 如何在运行Spring Boot应用程序的kubernetes中使用在localhost上运行的服务器的端口

networking - Docker 容器和主机网络 VPN

kubernetes - Fluxcd 未应用任何错误 ="running kubectl: error: unable to recognize\"STDIN\": ..."

docker - 在运行的微服务上隔离多个已安装的用户空间文件系统

kubernetes - 从 minikube 中的 yaml 文件创建部署

kubernetes - 使用服务发现而不是 Kubernetes 内部 dns 的原因是什么

docker - 即使提供了dnsPolicy: “Default”,Kubernetes pod也不接受主机DNS设置

docker - CoreDNS 无法在 Kubernetes 集群中运行