赞
踩
在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服务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。