kubernetes服务定义中targetPort和端口之间的区别

时间:2018-04-23 12:52:07

标签: kubernetes

我正在尝试探索kubernetes服务。当我读取服务定义时,我发现有targetPort和port在服务定义中指定。

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

这里kubernetes服务定义中port和targetPort的区别是什么?有谁澄清了这种困惑?

10 个答案:

答案 0 :(得分:68)

端口:端口是使服务对同一K8群集中运行的其他服务可见的端口号。换句话说,如果服务想要调用在同一个Kubernetes集群中运行的另一个服务,它将能够使用服务规范文件中针对“port”指定的端口来执行此操作。

目标端口:目标端口是服务正在运行的POD上的端口。

Nodeport :节点端口是使用Kube-Proxy从外部用户访问服务的端口。 看一下定义示例服务的以下规范:

        apiVersion: v1
        kind: Service
        metadata:
          name: test-service
        spec:
          ports:
          - port: 8080
            targetPort: 8170
            nodePort: 33333
            protocol: TCP 
          selector:
            component: test-service-app

请注意上述规范中的以下部分内容:

端口为8080,表示群集中端口8080的其他服务可以访问测试服务。 targetPort是8170,表示测试服务实际上正在pod上的端口8170上运行 nodePort是33333,表示可以通过端口33333上的kube-proxy访问测试服务。

答案 1 :(得分:38)

这有助于我从服务的角度思考问题

  • nodePort:外部流量将进入的节点上的端口
  • port:此服务的端口
  • targetPort转接板上的目标端口,用于将流量转发至

流量来自nodePort,转发到服务上的port,然后路由到pod上的targetPort

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

还值得注意的是,如果未设置targetPort,它将默认为与port相同的值。例如。 80:80用于服务端口80,目标是容器端口80

答案 2 :(得分:12)

@Manikanta P在上面给出的答案是正确的。但是,对“端口”的解释在初读时可能不清楚。我将举例说明:

考虑一个Web应用程序,它的静态内容(首页,图像等)由httpd托管,而动态内容(例如对请求的响应等)则由tomcat托管。 Web服务器(或静态内容)由端口80上的httpd提供服务,而Appserver(或动态内容)由端口8080上的tomcat服务。

开发人员想要什么:用户应该能够从外部访问Web服务器,而不是从外部访问Appserver。

解决方案:Webserver的service.yml中的服务类型为NodePort,而Appserver的service.yml中的服务类型为ClusterIP。

网络服务器的service.yml代码:

spec:
  selector:
    app: Webserver
  type: NodePort        // written to make this service accessible from outside.
  ports:
    - nodePort: 30475   // To access from outside, type <host_IP>:30475 in browser.
      port: 5050        // (ignore for now, I will explain below).
      protocol: TCP
      targetPort: 80  // port where httpd runs inside the webserver pod.

Appserver的service.yml代码

spec:
  selector:
    app: appserver
  type: ClusterIP        // written to make this service NOT accessible from outside.
  ports:
    - port: 5050         // port to access this container internally
      protocol: TCP
      targetPort: 8080   // port where tomcat runs inside the appserver pod.

还请注意,在Web服务器的httpd.conf文件中,我们将编写IP,该IP将用户的请求重定向到appserver。该IP地址为:host_IP:5050

这里到底发生了什么? 用户写hostIP:30475并查看Web服务器的页面。这是因为它由端口80(目标端口)上的httpd提供服务。用户单击按钮时,将发出请求。此请求被重定向到Appserver,因为在httpd.conf文件中提到了端口5050,这是Appserver的容器与Webserver的容器内部进行通信的端口。当appserver收到请求时,由于tomcat在端口8080内运行,它能够处理该请求。

答案 3 :(得分:5)

简而言之

nodeport:侦听nodeip:port上所有辅助节点上的外部请求,并将请求转发到端口。

port:容器的内部集群服务端口,用于侦听来自节点端口的传入请求并转发到targetPort。

targetPort:从端口接收请求,然后转发到正在监听的容器pod(port)。即使您未指定,默认情况下也会为该端口分配与port相同的端口号。

答案 4 :(得分:2)

除了其他答案,该答案还参考Kubernetes的文档:

https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/

targetPort:是容器接受流量的端口,

port:是抽象的Service端口,可以是其他Pod用于访问Service的任何端口

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

Pod中的端口定义具有名称,您可以在服务的targetPort属性中引用这些名称。即使服务中使用单一配置的名称混合Pod,也可以通过不同的端口号使用相同的网络协议,这仍然有效。

答案 5 :(得分:1)

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

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

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

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,则流量将路由到容器(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:30475,10.10.20.20:31261,10.10.20.20:30013来访问http,指标,健康服务

答案 6 :(得分:1)

“目标端口”是容器运行所在的端口。

Port:端口将流量从服务重定向到容器。

公开部署

  master $ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE

nginx        1/1     1            1           31s
master $ kubectl expose deployment nginx --name=nginx-svc --port=8080 --target-port=80
service/nginx-svc exposed

master $ kubectl get svc

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE

nginx-svc    ClusterIP   10.107.209.151   <none>        8080/TCP   5s

NodePort:是使服务能够从外部访问的端口。

希望这个答案。

答案 7 :(得分:1)

如果容器侦听端口9376,则 targetPort :9376

如果服务在端口80上侦听,则 端口:80

然后,服务端口配置如下所示

ports:
 - protocol: TCP
   port: 80
   targetPort: 9376

最后,请求已接收到服务的端口,并转发到了Pod的 targetPort

答案 8 :(得分:1)

这个答案是给绝对初学者的:

案例 1:

假设没有 nodPort 或端口,现在您想运行您的应用程序并将其公开给外部,您将需要:

  1. 一个入口控制器,它将使用一个 servicePort 根据路由重定向到我们想要的服务。
  2. 具有定义目标的集群 IP 服务到您的应用程序端口(也称为 targetPort)
  3. 一个网络端口,用于识别在计算机上运行的应用程序或服务(即应用程序端口)。

因此,为了从外部访问,我们发现需要三个端口。

  1. servicePort(入口控制器)
  2. targetPort(集群 Ip 服务)
  3. networkPort(应用程序端口)

一切正常: servicePort === targetPort === networkPort

情况 2: 现在假设一个服务与我们集群中的另一个服务通信,或者假设一个服务收到来自外部的请求,并且它发出一个事件触发我们集群内部的另一个服务。

假设Service X通过nodePort Service暴露在外面,X服务收到请求后想和Y服务通信。

Y 服务需要以下端口

  1. 一个 ClusterIP 端口,X 服务将通过该端口转发请求
  2. 一个 ClusterIP 目标端口,Y 服务将通过它确定运行应用程序的端口。
  3. 应用端口

端口 === 任意

targetPort === 应用端口

内部服务 X:

app.post('/posts/create', async (req, res) => {
  const id = randomBytes(4).toString('hex');
  const { title } = req.body;

  posts[id] = {
    id,
    title
  };

  await axios.post('http://event-bus-srv:4010/events', {
    type: 'PostCreated',
    data: {
      id,
      title
    }
  });

  res.status(201).send(posts[id]);
});

配置和服务内部 Y

apiVersion: v1
kind: Service
metadata:
  name: event-bus-srv
spec:
  selector:
    app: event-bus
  type: ClusterIP
  ports:
    - name: event-bus
      protocol: TCP
      port: 4010
      targetPort: 4009
app.listen(4009, () => {

  console.log('Listening on 4009');
});

enter image description here

答案 9 :(得分:0)

targetport:容器在 pod 内侦听的一个或多个端口。

nodeport:主要用于接受消费者请求。 (例如:从消费者到容器中运行的网络服务器的 HTTP 请求)

nodeport 在所有接口上的所有节点上侦听,即 0.0.0.0:nodeport。发送到 nodeport 的消费者服务请求被路由到容器的目标端口,以便容器可以完成请求。

port:kubernetes pod 网络内使用的端口,主要用于 pod 之间交换请求。在这里,来自另一个 Pod 的请求也被路由到对应 Pod 的容器目标端口。

摘要:所有请求都在目标端口中结束。 nodeport 用于 k8s 网络外部的请求,port 用于内部请求。