在 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 中灵活地管理服务的访问规则,确保应用的可访问性和安全性。