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

Pur*_*nth 6 port containers kubernetes kubernetes-pod

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

我遇到了下面的代码片段,其中containerPort用于表示portKubernetes 中的 pod。

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
        
Run Code Online (Sandbox Code Playgroud)

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

据我所知,该术语port泛指portservice(Kubernetes)。如果我不正确,请纠正我。

Arg*_*dhu 11

Pod 规范中的 ContainerPort

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

服务规范中的 targetPort

服务目标 Pod 上要访问的端口号或名称。数字必须在 1 到 65535 范围内。名称必须是 IANA_SVC_NAME。如果这是一个字符串,它将在目标 Pod 的容器端口中作为命名端口进行查找。如果未指定,则使用“端口”字段的值(身份映射)。

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


mar*_*rio 8

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

它们不能互换使用,因为它们都是两个不同的 kubernetes 资源/对象规范的一部分:ServicePod。虽然 的目的containerPort可以被视为纯粹的信息,但targetPort它需要Service暴露一组Pods.

重要的是要了解,通过containerPortPod/Deployment规范中声明特定值,您不能Pod公开此特定端口,例如,如果您在containerPort字段中声明nginxPod公开端口8080而不是默认端口80,您仍然需要在容器中配置 nginx 服务器监听这个端口。

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

最好记住它不需要targetPortService定义中声明。如果省略它,则默认为您为其声明的值port(即Service自身的端口)。

  • 这正是我正在寻找的,它在 kubernetes 文档中的任何位置都有记录? (2认同)