在Kubernetes(K8s)的service对象中,spec.ports对象存在三个与端口有关的字段,分别是port、targetPort、nodePort,以下介绍这个字段的区别。
spec.ports.port
该字段表示 Service 自身的端口,即其他应用程序可以通过该端口访问该 Service 所关联的Pod(即spec.selector字段所匹配的Pod)。当其他 Pod 或外部客户端要与该 Service 通信时,它们将使用 Service 的 IP 地址和该端口号。这个端口是 Service 提供的服务的入口端口。
spec.ports.targetPort
该字段表示 Service 后端 Pod 上运行的应用程序的端口。当请求到达 Service,Service 将根据 Service 的配置将流量转发到相应的后端 Pod,并使用 targetPort 指定的端口与后端 Pod 上的应用程序进行通信。targetPort 是 Service 路由到后端 Pod 的目标端口。
例如,假设我们有一个后端 Pod,它在端口 8080 上运行一个 Web 服务器,并且有一个定义如下的 Service :
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app #匹配 metadata.labels.app: my-app 值的Pod
ports:
- protocol: TCP # 使用的协议
port: 8080 # 该Service所暴露端口
targetPort: 80 # Pod容器上的应用程序的端口
在这个例子中,my-service Service 使用端口 8080,当外部请求到达 Service 时,它将被转发到 my-app 标签选择器匹配的后端 Pod,并且在后端 Pod 上的应用程序将使用端口 80 进行通信。因此,port 是 Service 自身的端口,而 targetPort 是后端 Pod 上应用程序的端口。
上述所定义的service资源将在默认的命名空间内生效,当我们需要与标签存在`app: my-app`的Pod通信时,使用该service.name作为Host访问,例如:http://my-service:8080。更进一步,当一个service资源仅定义了一个映射暴露出来的端口时,不需要显示指定该service端口,直接使用http://my-service来访问Mysql。
spec.ports.nodePort 字段
当指定 Service 的 type 字段为 NodePort 时,表示可以通过集群内任何一个节点(物理主机、云服务器)上的IP地址访问,从而实现外部与集群内部该 Service 通信。nodePort 就是用来定义该 Service 的端口,这个端口号通常是一个整数,范围为 30000 到 32767。
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web-svc
spec:
type: NodePort # 服务类型
ports:
- port: 80 # 该Service所暴露端口,集群内部通过该Service的IP访问使用
protocol: TCP # 协议
targetPort: 80 # Pod容器上的应用程序的端口
nodePort: 30001 # 对集群外部所暴露的端口,集群外部通过Pod所在任一主机上的IP访问
selector:
app: web # 指定关联匹配一组labels字段中含有app: web的Pod对象
在这个例子中,nodePort 被设置为 30001。这意味着在集群内部,可以通过http://web-svc:80来访问该Service。同时,你也可以通过在外部的客户端使用任何一个节点上的 IP 地址和端口 30001 来访问web-svc,但这种在集群外部访问 Service 的方法通常用于测试、开发或需要外部访问的场景。
文章评论