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

24

容器端口在Kubernetes容器中与目标端口(target ports)有何区别?如果可以互换使用,为什么?

我看到下面的代码片段,其中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是指服务(Kubernetes)上的port。如果我有错误,请纠正我。

你是在谈论 Kubernetes 服务中的端口和目标端口吗? - Arghya Sadhu
@Arghya Sadhu 是的!! - Purushothaman Srikanth
我想知道术语“containerport”和“port”是否意味着相同的含义! - Purushothaman Srikanth
编辑问题并添加一个示例yaml以澄清您所指的端口和容器端口。 - Arghya Sadhu
我已经添加了一段代码片段和几行文字。我认为这将使我的问题有资格保持开放,以便社区能够帮助我。谢谢! - Purushothaman Srikanth
3个回答

36
简而言之,targetPortcontainerPort基本上指的是相同的端口(因此如果两者都使用,则期望它们具有相同的值),但它们用于两个不同的上下文,并且具有完全不同的目的。
它们不能互换使用,因为它们是两个不同的Kubernetes资源/对象的规范的一部分:分别是ServicePod。虽然containerPort的目的可以被视为纯粹信息性质,但targetPortService所必需的,该服务暴露了一组Pods
重要的是要理解,在您的Pod/Deployment规范中声明特定值的containerPort并不能使您的Pod暴露这个特定的端口,例如,如果在containerPort字段中声明您的nginx Pod暴露端口8080而非默认的80,您仍然需要在容器中配置您的nginx服务器以在此端口上侦听。
Pod规范中声明containerPort是可选的。即使没有这样做,您的Service也会知道根据其在targetPort中声明的信息将请求定向到哪里。

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


2
这正是我正在寻找的,它在 Kubernetes 文档中有记录吗? - VimleshS
这对我来说是非常关键的信息。感谢您详细回答。您能分享一下相关的Kubernetes文档吗? - Dhanaraj Durairaj

11

Pod规范中的ContainerPort

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

服务规范中的targetPort

访问由服务目标的Pod上的端口的编号或名称。编号必须在1到65535范围内。名称必须是IANA_SVC_NAME。如果这是一个字符串,则会将其查找为目标Pod的容器端口中的命名端口。如果未指定此参数,则使用“port”字段的值(即标识映射)。

因此,service中的targetPort需要与Pod规范中的containerPort匹配,因为这样服务才知道哪个容器端口是转发流量的目标。


在哪里规定端口名称必须符合IANA_SVC_NAME?https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service使用http-web-svc作为名称。它需要映射您在容器端口中定义的内容。 - jontro

2

containerPort 是容器内应用程序可以访问的端口。

targetPort 是在集群中公开的端口,服务将该端口连接到其他服务或用户的 Pod。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接