Kubernetes服务使用的“端口”是什么

时间:2019-04-22 16:04:21

标签: kubernetes

考虑一个非常简单的 service.yaml 文件:

kind: Service
apiVersion: v1
metadata:
  name: gateway-service
spec:
  type: NodePort
  selector:
    app: gateway-app
  ports:
  - name: gateway-service
    protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080

我们知道服务将在端口app=gateway-app(也称为8080)处将所有请求路由到带有此标签targetPort的Pod。服务定义中还有另一个port字段,在此情况下为80port用于什么用途?我们什么时候应该使用它?

在文档中,也有以下一行:

  

默认情况下,targetPort将被设置为与端口字段相同的值。

     

参考:https://kubernetes.io/docs/concepts/services-networking/service/

换句话说,我们什么时候应该保持targetPortport相同,什么时候不保持?

4 个答案:

答案 0 :(得分:4)

osascript -e 'tell application "VLC" to get name of current item' 服务中,您可以定义3种端口:

TargetPort

正如您在问题中提到的,这是您的pod的端口,实际上是您在副本清单中定义的nodePort的端口。

端口(servicePort)

这定义了其他本地资源可以引用的端口。引用Kubernetes文档:

  

此服务将在本地显示为.spec.clusterIP:spec.ports [*]。port

意思是,这不是公共可访问的,但是您可以通过具有此端口的其他资源(群集内)来引用您的服务端口。例如,当您为此服务创建入口时。在您的入口中,您需要在containerPort字段中显示此端口:

servicePort

NodePort

这是节点上公开公开服务的端口。再次引用文档:

  

此服务将在[公共]上显示为[NodeIP]:spec.ports [*]。nodePort

答案 1 :(得分:3)

客户端将连接到

PortTargetPort是容器正在侦听的内容。当它们不相等时,一种用例是在非root用户下运行容器并且通常无法绑定到1024以下的端口。在这种情况下,您可以侦听8080,但客户端仍将连接到80,这可能对他们来说更简单。 / p>

答案 2 :(得分:0)

服务:这会将流量定向到吊舱。

TargetPort:这是您的应用程序在容器上运行的实际端口。

端口:有时,容器中的应用程序在不同的端口上提供不同的服务。例如:-实际应用程序可以运行8080,并且此应用程序的运行状况检查可以在容器的8089端口上运行。 因此,如果您在没有端口的情况下访问该服务,它将不知道应将请求重定向到容器的哪个端口。服务需要有一个映射,以便它可以访问容器的特定端口。

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

如果您点击my-service:8089,则流量将路由到容器(targetPort)的8080。同样,如果您点击my-service:8443,则它将被重定向到容器(targetPort)的8085。

但是此myservice:8089是kubernetes集群的内部组件,可以在一个应用程序想要与另一个应用程序通信时使用。因此,要从集群外部访问服务,需要有人公开运行kubernetes的主机上的端口 以便将流量重定向到容器的端口。在那可以使用nodePort。

在上面的示例中,您可以通过host_ip:Nodeport从集群外部(邮递员或任何restclient)访问该服务

假设您的主机IP为10.10.20.20,则可以按10.10.20.20:32111,10.10.20.20:32353,10.10.20.20:31002来访问http,指标,健康服务

答案 3 :(得分:0)

让我们举个例子,并尝试借助图表来理解。 考虑一个具有2个节点和一个服务的群集。每个节点有2个容器,每个节点有2个容器,分别是应用容器和Web容器。

NodePort:3001(每个节点的群集级别公开端口)

端口:80(服务端口)

targetPort:8080(应用程序容器端口在docker暴露中应该提到)

targetPort:80(在docker公开中应该提到Web容器端口)

现在下图应该可以帮助我们更好地理解它。

enter image description here

参考:https://theithollow.com/2019/02/05/kubernetes-service-publishing/