Kubernetes Service定义中targetPort和port的区别?

识趣 发表于: 2021-11-19   最后更新时间: 2021-11-19 13:59:48   2,695 游览

一个Kubernetes Service定义里可以有一个targetPort和port。

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

porttargetPort之间的区别是什么?

发表于 2021-11-19

Service:将流量引向一个pod。

TargetPort:你的应用程序在容器内运行的真实的端口。

Port:有些时候,你在容器内的应用程序在不同的端口上提供了不同的服务。

例子:实际的应用程序运行在8080,而这个应用程序的健康检查可以在容器的8089端口上进行。

因此,如果你在没有端口的情况下访问Service,它不知道应该把请求重定向到容器的哪个端口。所以Service需要有一个映射,以便它能定位到容器的指定端口上。

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      nodePort: 30475
      port: 8089
      protocol: TCP
      targetPort: 8080
    - name: metrics
      nodePort: 31261
      port: 5555
      protocol: TCP
      targetPort: 5555
    - name: health
      nodePort: 30013
      port: 8443
      protocol: TCP
      targetPort: 8085 

如果你访问my-service:8089,流量会被路由到容器(目标端口)的8080上。同样,如果你访问my-service:8443,那么它将被重定向到容器的8085(目标端口)。但是这个myservice:8089是kubernetes集群内部的,当一个应用程序想与另一个应用程序通信时可以使用。因此,要从集群外部访问该服务,需要在运行kubernetes的主机上公开暴露该端口,这样,流量就会被重定向到容器的一个端口。这就是"node port"(在物理主机暴露的端口)。

上面的例子中,你可以通过host_ip:nodePort从集群外部访问服务。

假设你的主机ip是10.10.20.20,你可以通过10.10.20.20:3047510.10.20.20:3126110.10.20.20:30013来访问http、metrics、health服务。

Service(服务)角度来考虑问题:

  • nodePort:物理节点上的端口,外部流量将通过该端口进入。
  • port::服务的端口。
  • targetPort:要转发流量到pod上容器的真实目标端口。

流量从nodePort进入,转发到服务的port,然后转发到pod上的targetPort

值得强调的是,nodePort是为外部流量服务的。集群中的其他pod可能需要访问该服务,将只使用port,而不是nodePort,因为这只是对服务的内部访问。

另外值得注意的是,如果没有设置targetPort,它将默认为与port相同的值。例如,80:80代表服务端口80,目标是容器端口80

识趣 -> 绽放吧 3年前

谢谢补充!

你的答案

查看kubernetes相关的其他问题或提一个您自己的问题