Service Kubernetes服务定义中targetPort和port之间的差异

Service Kubernetes服务定义中targetPort和port之间的差异,service,kubernetes,port,Service,Kubernetes,Port,Kubernetes在服务定义中可以有targetPort和port: 种类:服务 版本:v1 元数据: 姓名:我的服务 规格: 选择器: 应用程序:MyApp 端口: -协议:TCP 港口:80 目标港:9376 端口和目标端口之间有什么区别?服务:这会将流量引导到pod TargetPort:这是容器中运行应用程序的实际端口 端口:有时,容器内的应用程序在不同的端口上提供不同的服务 示例:实际应用程序可以运行8080,此应用程序的运行状况检查可以在容器的8089端口上运行。 因此,如果您点

Kubernetes在服务定义中可以有
targetPort
port

种类:服务
版本:v1
元数据:
姓名:我的服务
规格:
选择器:
应用程序:MyApp
端口:
-协议:TCP
港口:80
目标港:9376

端口
目标端口
之间有什么区别?

服务:这会将流量引导到pod

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的主机上的端口 这样,流量将重定向到容器的某个端口。这是
节点端口
(主机上公开的端口)。 从上面的示例中,您可以通过
host\u ip:nodePort

假设你的主机ip是
10.10.20.20
,你可以通过
10.10.20.20:30475
10.10.20.20:31261
10.10.20.20:30013
点击http,metrics,health services


编辑:根据评论编辑。

以上@Manikanta p给出的答案是正确的。然而,“港口”的解释在一读时可能有点不清楚。我会举例说明:

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

开发人员想要的:用户应该能够从外部访问Web服务器,但不能从外部访问Appserver

解决方案:其service.yml中的Web服务器的服务类型将是NodePort,而其service.yml中的Appserver的服务类型将是ClusterIP

Web服务器的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.
还要注意,在Web服务器的
httpd.conf
文件中,我们将编写将用户请求重定向到appserver的IP。此IP将为:
主机\u IP:5050

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

上运行,这有助于我从服务的角度思考问题

  • nodePort
    :节点上的端口,外部通信将在其中进入
  • 端口
    :此服务的端口
  • targetPort
    pod上要将流量转发到的目标端口
流量通过
节点端口
进入,转发到服务上的
端口
,然后路由到pod上的
目标端口

值得进一步强调的是,
nodePort
用于外部流量。群集中可能需要访问服务的其他POD将只使用
端口
,而不是
节点端口
,因为它是对服务的内部唯一访问


还值得注意的是,如果未设置
targetPort
,它将默认为与
port
相同的值。例如,
80:80
对于服务港
80
目标集装箱港
80

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

:

targetPort
:是集装箱接受运输的港口

端口
:是抽象的服务端口,可以是其他POD用于访问服务的任何端口

:

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

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

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

公开部署

  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
master$kubectl获取部署
姓名就绪最新可用年龄
nginx 1/1 31s
master$kubectl公开部署nginx--name=nginx svc--port=8080--target port=80
服务/nginx svc暴露
master$kubectl获得svc
名称类型CLUSTER-IP外部IP端口年龄
nginx svc群集IP 10.107.209.151 8080/TCP 5s
NodePort:是要使用的端口吗
  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
ports:
 - protocol: TCP
   port: 80
   targetPort: 9376
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]);
});
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');
});