容器端口 Pod 与容器端口服务

Pet*_*ter 12 kubernetes

我想了解服务端口和pod容器端口之间的映射。

我是否需要将容器端口定义为 pod 的一部分以及服务的一部分?或者只是将它作为服务的一部分公开就可以了?

Tep*_*epu 23

让我们举个例子并尝试借助图表来理解。考虑一个具有 2 个节点和一个服务的集群。每个节点都有 2 个 Pod,每个 Pod 有 2 个容器,即应用程序容器和 Web 容器。

NodePort:30001(每个节点的集群级公开端口)

端口:80(服务端口)

targetPort:8080(应用程序容器端口应在 docker 暴露中提及)

targetPort:80(在 docker 公开中应提及相同的 Web 容器端口)

现在下图应该可以帮助我们更好地理解它。

在此输入图像描述

有关参考和更多详细信息,请参阅以下链接 https://theithollow.com/2019/02/05/kubernetes-service-publishing/


lok*_*oki 22

containerPort 作为 pod 定义的一部分仅用于提供信息。最终,如果您想将此作为集群或节点中的服务公开,那么您必须创建一个服务。

要回答您的问题,是的,如果您将其作为 Kubernetes 服务的一部分公开就足够了。作为 pod 定义的一部分提及是一个很好的做法,这样如果有人查看定义就可以了解运行容器服务的端口。

在这里得到了很好的解释-

  • k8s 网站也对此进行了解释:https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#ports “在此处公开端口可为系统提供有关容器使用的网络连接的附加信息,但主要是提供信息。此处不指定端口并不能防止该端口被公开。” (2认同)

Yav*_*ert 9

容器暴露的端口和服务的端口在Kubernetes中是不同的概念。

如果你想为你的应用创建一个服务,你的 pod 必须有一个端口。例如,这是一个 pod yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 8080
Run Code Online (Sandbox Code Playgroud)

containerPort 设置应用程序将公开的端口。

要通过服务访问此应用程序,您必须使用此类 yaml 创建服务对象:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    run: my-nginx
Run Code Online (Sandbox Code Playgroud)

在这个 yaml 中,关键字 port 设置服务的端口。targetPort 是您的应用程序的端口。所以,服务的端口是不同的。

这是来自官方文档的一个很好的定义:

Kubernetes 服务是一种抽象,它定义了一组逻辑 Pod 和访问它们的策略 - 有时称为微服务。服务所针对的 Pod 集(通常)由标签选择器决定(请参阅下文了解为什么您可能需要没有选择器的服务)。

  • containerPort 没有设置将公开的端口,它纯粹是提供信息的,对 Kubernetes 网络没有影响。然而,最好的做法是记录容器正在侦听的端口,以防止下一个试图找出您的系统的可怜灵魂。 (7认同)