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


Answers:


79

服务:这将流量引导到吊舱。

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则将流量路由到8080容器(targetPort)。同样,如果您单击,my-service:8443则将其重定向到8085容器(targetPort)。但这myservice:8089是kubernetes集群的内部功能,可以在一个应用程序想要与另一应用程序通信时使用。因此,要从集群外部访问服务,需要有人公开运行kubernetes的主机上的端口,以便将流量重定向到容器的端口。这是node port(主机上暴露的端口)。在上面的示例中,您可以通过以下方式从群集外部(邮递员或任何其他客户端)访问服务:host_ip:nodePort

假设你的主机机的ip是10.10.20.20可以通过打HTTP,指标,卫生服务10.10.20.20:3047510.10.20.20:3126110.10.20.20:30013

编辑:根据Raedwald评论进行编辑。


4
允许porttargetPort有所不同的好处是什么?因此,例如查看您的health示例,为什么要使用port 8443代替8085?基本上,为什么有两个参数而不是只公开targetPort服务上的所有?

嗨,丹,您可以使用8443作为健康的端口和目标端口。我使用了不同的数字以获得更好的解释。
Manikanta P

感谢您的回应。我的意思是,在什么情况下使它们与众不同会有用吗?

“在容器上运行”是什么意思?容器的服务器使用的端口?还是容器外部的客户端使用的端口?
Raedwald

我们可以在Cloud Services中假设主机的固定IP(例如10.10.20.20)吗?例如,具有多节点部署情况的Azure AKS?
Jaish Mathews,

14

服务的角度来看这对我有所帮助。

  • nodePort:节点上将要传入外部流量的端口
  • port此服务的端口
  • targetPort Pod上用于将流量转发到的目标端口

流量进来nodePort,转发到port服务上,然后路由到targetPortPod上。

值得强调的是更多nodePort用于外部流量的信息。集群中可能需要访问服务的其他Pod只会使用port,而不是nodePort内部访问服务的唯一容器。

同样值得注意的是,如果targetPort未设置,则默认值为port。例如,80:80以服务端口为80目标的容器端口80


4
好总结,可以用几句话很好地回答这个问题,谢谢!
沃尔夫森

同意。我发现其他答案令人困惑,但是这个答案很重要。
NikolaMalešević

人们想知道的区别porttargetPort。您确实消除了混乱。
Ankur Gautam

我同意,我认为这是“答案”,而以上答案打开了更多领域和更广泛的主题,这使得它很难理解。干杯。
Worp

10

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

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

开发人员的要求:用户应该能够从外部访问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.

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

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


4
为什么网络服务器规范定义了“端口:5050”?如果我理解正确,则网络服务器将调用appserver:5050,而不是其他方式...?
埃弗顿

1
除了埃弗顿的问题外,如果Tomcat在端口5050上服务内部请求,则需要打开8080端口的意义是什么?
史蒂芬

这个答案令人困惑。另外httpd.conf在“由于httpd.conf文件中,提到端口5050”
聚合酶

@Polymerase httpd.conf文件与您在系统上安装的httpd软件包一起提供。这是您必须配置的内部文件。路径:/etc/httpd/conf/http.conf
matak8s

在tomcat / conf / server.xml中的@Stephen中,我们指定了运行tomcat服务的端口。这是与目标端口相同的端口号,因此kubernetes知道它必须在该端口上启动tomcat服务。如果我错了,请纠正我。
matak8s

1

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

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

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

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

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

Pod中的端口定义具有名称,您可以在targetPort服务的属性中引用这些名称。即使服务中使用单个配置的名称混合使用Pod,并且通过不同的端口号提供相同的网络协议,此功能也可以使用。


感谢您的简洁回答
Ankur Gautam

1

简而言之

nodeport: 在nodeip:port的所有工作节点上侦听外部请求,并将请求转发到port。

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

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


0

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

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

公开部署

  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:是使服务能够从外部访问的端口。

希望这个答案。


0

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

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

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

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

最后,请求接收到服务的port,并转发到pod 的targetPort上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.