Kubernetes dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口之间的关系是什么?
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
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规范中端口的目标端口:
)名称:
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我相信服务端第二节的第一段已经回答了这一点