在Kubernetes中,有三种类型的端口与Service相关:port、targetPort和NodePort。它们分别用于不同的用途:

port:port字段定义了Service暴露给集群内部和外部的端口号。当你创建一个Service时,其他应用或服务可以通过该端口与Service进行通信,将请求发送到Service上。这个端口号是Service在Kubernetes集群内部和外部可见的端口。 targetPort:targetPort字段定义了Service将流量转发到后端Pod的容器端口号。当请求进入Service时,Service会根据其定义将请求转发到后端Pod的这个指定端口。通常,后端Pod中的应用程序在指定的容器端口上监听并处理请求。 NodePort:NodePort是一种Service类型,它允许通过Kubernetes集群中的每个节点的IP地址和指定的端口号访问Service。NodePort是将外部流量导入到Service的一种方式。Kubernetes会在集群中的每个节点上打开一个高端口(30000-32767范围内),并将该端口映射到Service的port和targetPort上。这样,你可以通过任何节点的IP地址和NodePort来访问Service。

下面是一个示例Service的定义,演示了这三个端口的用法:

apiVersion: v1

kind: Service

metadata:

name: my-service

spec:

selector:

app: my-app

ports:

- name: http

protocol: TCP

port: 80

targetPort: 8080

type: NodePort

在上述示例中,port: 80定义了Service暴露给集群外部和内部的端口,targetPort: 8080定义了将流量转发到后端Pod的容器端口。另外,type: NodePort将Service的类型设置为NodePort,允许通过每个节点的IP地址和随机高端口访问Service。

请注意,NodePort是一种简单的方式来暴露Service到集群外部,但在生产环境中,通常会使用更高级的负载均衡器或Ingress控制器来处理流量分发和SSL终止等更高级的功能。

例如:

// 创建一个nginx pod

kubectl create deployment nginx --image=nginx

// 创建一个类型为NodePort类型的svc,8181是对集群内部和外部暴露的端口,80是Service将流量转发到后端Pod的容器端口号

kubectl expose deploy nginx --port=8181 --target-port=80 --type=NodePort

创建成功之后可以看到k8s自动分配了节点宿主机的32313端口给nginx service,宿主机端口32313的流量会被转发到集群内的8181端口,集群8181端口的流量又会被转发到pod的80端口,所以我们在宿主机上直接访问 curl localhost:32313 就能够访问到pod里的nginx服务。

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: