在 Kubernetes 中,targetPort
是一个 Service 资源定义中的一个关键字段,它指定了流量将被转发到后端 Pod 上的哪个端口。这个机制允许你在 Pod 内部使用一个端口,而在集群外部使用另一个端口来访问这些 Pod,从而提供了额外的灵活性和封装。
参考文章: 深入理解 Kubernetes:targetport
Service 和 targetPort
解释
-
Service:在 Kubernetes 中,Service 是定义一组逻辑上相同的 Pod 访问规则的抽象方式。它允许你通过一个固定的 IP 地址和端口来访问这一组 Pod,无论这些 Pod 的实际 IP 地址和端口是什么。
-
targetPort
:这是 Service 中的一个字段,用来指定流量最终被转发到 Pod 上的哪个端口。targetPort
可以是一个数字,也可以是字符串(如果你的 Pod 定义中有命名的端口)。
targetPort
使用场景
假设你有一组运行 HTTP 服务器的 Pod,这些服务器内部监听 8080 端口。但是,你希望集群外的用户能够通过标准的 HTTP 端口 80 来访问这些服务。在这种情况下,你可以创建一个 Service,并设置 port
(Service 上的端口)为 80,targetPort
(Pod 上的端口)为 8080。
示例
下面是一个 Service 定义的示例,演示了如何使用 targetPort
:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80 # Service 上暴露的端口
targetPort: 8080 # 流量将被转发到 Pod 上的这个端口
在这个示例中,任何发往 my-service
的流量都会被转发到标签为 app: MyApp
的 Pod 上,且这些 Pod 上的目标端口是 8080。这意味着即使 Pod 内部的应用监听在 8080 端口,外部用户也可以通过访问 Service 的 80 端口来访问应用。
注意事项
- 端口命名:在 Pod 模板中给端口命名可以提高配置的可读性。当你使用命名端口时,可以在
targetPort
中使用这个名称,而不是数字端口号。 - 默认行为:如果在 Service 定义中省略了
targetPort
,Kubernetes 默认将targetPort
设置为与port
字段相同的值。 - 灵活性:
targetPort
提供了灵活性,使得你可以在不影响外部访问的情况下,更改 Pod 内部的端口配置。
通过合理使用 targetPort
,你可以在 Kubernetes 中灵活地管理服务的访问规则,确保应用的可访问性和安全性。