Kubernetes 中容器端口和目标端口的区别?

Difference between Container port and targetport in Kubernetes?

container port 与 Kubernetes 容器中的 targetports 有何不同? 它们是否可以互换使用,如果可以,为什么?

我发现了下面的代码片段,其中 containerPort 用于表示 Kubernetes 中 pod 上的 port

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
  labels:
    app: demo-voting-app
spec:
  replicas: 1
  selector:
    matchLabels:
      name: postgres-pod
      app: demo-voting-app
  template:
    metadata:
      name: postgres-pod
      labels:
        name: postgres-pod
        app: demo-voting-app

    spec:
      containers:
      - name: postgres
        image: postgres:9.4
        ports:
        - containerPort: 5432
        

在上面的代码片段中,他们为 containerPort 参数(在最后一行)提供了 5432。那么,这个 containerPorttargetport 有何不同?

据我所知,术语port一般是指service(Kubernetes)上的port。如果我不正确,请纠正我。

pod 规范中的 ContainerPort

要从容器公开的端口列表。在此处公开端口可为系统提供有关容器使用的网络连接的附加信息,但主要是信息性的。此处不指定端口不会阻止该端口被公开

服务规范中的目标端口

要在服务所针对的 pods 上访问的端口号或名称。数字必须在 1 到 65535 的范围内。名称必须是 IANA_SVC_NAME。如果这是一个字符串,它将在目标 Pod 的容器端口中查找为命名端口。如果未指定,则使用 'port' 字段的值(恒等映射)。

因此,服务中的 targetPort 需要与 pod 规范中的 containerPort 匹配,因为这是服务知道哪个容器端口是将流量转发到目的地的方式。

简而言之: targetPortcontainerPort 基本上指的是同一个端口(所以如果两者都被使用,它们应该具有相同的值) 但它们用于两种不同的上下文并且具有完全不同的目的。

它们不能互换使用,因为它们都是两个不同的 kubernetes resources/objects 规范的一部分:分别是 ServicePod。虽然 containerPort 的目的可以被视为纯粹的信息,但 Service 需要 targetPort,它公开了一组 Pods.

请务必了解,通过在 Pod/Deployment 规范中使用特定值声明 containerPort,您无法使 Pod 公开此特定端口,例如如果你在 containerPort 字段声明你的 nginx Pod 暴露端口 8080 而不是默认的 80,你仍然需要在你的容器中配置你的 nginx 服务器来监听这个端口.

Pod 规范中声明 containerPort 是可选的。即使没有它,您的 Service 也会根据它在 targetPort.

中声明的信息知道将请求定向到哪里

最好记住,不需要在 Service 定义中声明 targetPort。如果省略它,它默认为您为 port 声明的值(这是 Service 本身的端口)。

containerPort是端口,可以访问容器内的app。

targetPort为端口,暴露在集群中,服务将pod连接到其他服务或用户。