Kubernetes dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口之间的关系是什么?

Kubernetes dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口之间的关系是什么?,kubernetes,Kubernetes,dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口之间的关系是什么 在我的档案里 expose 8080 在我的部署中 ports: - containerPort: 8080 为我效劳 apiVersion: v1 kind: Service metadata: name: xtys-web-admin spec: type: NodePort ports: - port: 8080 targetPort: 8080

dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口之间的关系是什么

在我的档案里

expose 8080
在我的部署中

ports:
  - containerPort: 8080
为我效劳

apiVersion: v1
kind: Service
metadata:
 name: xtys-web-admin
spec:
 type: NodePort
 ports:
  - port: 8080
    targetPort: 8080
 selector:
  app: xtys-web-admin
在我的吊舱里

kubectl exec xtys-web-admin-7b79647c8d-n6rhk -- ss -tnl
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port 
LISTEN     0      100                       *:8332                     *:*     
因此,在pod中实际运行8332(从一些配置文件)。
我的问题是它如何仍然有效?它可以工作,但我怀疑,有人可以澄清吗?

由于明显的安全原因,Docker默认不公开任何端口。因此,默认情况下,您无法访问docker容器中运行的任何应用程序

通过在Docker中公开端口,用户(无论谁将使用您的映像)都可以通过公开端口访问您的应用程序

比方说,您构建docker映像时,应用程序运行在端口8080上,MySQL数据库运行在端口3306上。您不希望任何用户直接访问MySQL数据库。因此,您将只公开端口8080

然后,用户可以通过
docker run-p 80:8080 your image:tag

这将把本地端口80映射到容器的端口8080(应用程序正在其上运行)。因此,向localhost:80(localhost)发出的任何请求都将提供来自应用程序的数据

当您在deployment.yaml文件中使用port和targetport时,它会执行与上述命令相同的操作(docker run)

当您使用port和targetPort时,它会将
服务:port
转发到
容器:targetPort

请检查以了解端口转发

这可能是一个很好的阅读资源

PS:我认为,当您使用
type:NodePort
时,端口值必须大于30000


HTH.

所有这些内容必须一致,并引用同一端口:

  • 容器中的服务器进程正在侦听的实际端口
  • pod规范中的
    容器端口:
  • pod规范中准备就绪和活动探测器的端口号(可以使用端口的
    名称:
  • 服务规范中的
    目标端口:
    (可以使用pod规范中端口的
    名称:
Dockerfile的
EXPOSE
行也应该命名相同的端口,但这不是严格要求的

在服务规范中,
端口:
是其他POD可以用来访问此服务的端口号。(我喜欢为所有HTTP类型的服务设置
端口:80
,即使pod使用端口8000或8080或3000或其他任何端口。)对于a,有第三个
节点端口:
编号,通常在30000-32767范围内,在集群中也到达服务的每个节点上都可见


在您展示的示例中,如果容器内的进程正在侦听端口8332,但pod规范列出了
containerPort:8080
,我预计通过服务的调用会失败,但可能直到您实际进行网络调用(Kubernetes级别的设置会起作用)。如果你有一个目标端口,pod将永远不会显示为“就绪”;如果您有一个liveness probe,它将重新启动,并最终达到
CrashLoopBackOff
状态。

在Dockerfile中,
EXPOSE
是图像创建者向运行图像的人提供的关于如何配置图像的文档。它在映像中设置元数据,您可以对其进行检查,但不影响docker在容器之间配置网络的方式。(许多人会将此混淆为在主机上发布端口,这与公开端口非常不同。在docker中发布端口实际上会创建一个映射,以允许外部访问容器。)

containerPort
的值相当于
EXPOSE
的运行时值,用于公开图像中未指定的端口。这同样只是文档,但也可以被其他检查运行图像以进行自我配置的工具使用。我经常看到反向代理使用这种方法,如果不指定要连接的端口,则默认为公开端口

有人可以将映像配置为在与其
EXPOSE
中记录的映像创建者不同的端口号上侦听。例如,nginx映像将记录它使用默认配置在端口80上侦听,但您可以提供自己的
nginx.conf
文件,并将其重新配置为在容器内的端口8080上侦听(例如,如果您不想以root用户身份运行nginx)


现在,关于服务方:

Kubernetes服务中的
targetPort
值需要引用正在运行的容器实际侦听的端口。通常,这与公开端口相同,但如果您像上面的示例中那样重新配置应用程序,则会将
targetPort
设置为8080,而不是80

Kubernetes服务中的
port
值是服务本身侦听的端口。对于集装箱间通信,您需要在该端口上进行连接,它通常与
targetPort
相同,以减少混淆


最后,Kubernetes服务中
nodePort
的值是在节点上发布的端口,供您从外部访问容器。默认情况下,这是从30000开始的短暂端口范围。

但我们要明确的是,不要将应用程序和MySQL放在同一个容器中构建docker映像。我同意@switcher-op。为了简化解释,我将应用程序和MySQL放在同一个映像中。thx,例如,您说“需要参考”“通常与您设置的”“相同”“常常和”。。。关于containerPort和targetPort以减少混淆的原因?实际上,我想知道如果我不将targetPort(8080)设置为pod中运行的port(8332)应用程序,会发生什么情况?@adrianding我相信服务端第二节的第一段已经回答了这一点