【问题标题】:Container port pods vs container port service容器端口 pod 与容器端口服务
【发布时间】:2022-04-02 01:40:03
【问题描述】:

我想了解一下服务端口和pod容器端口的映射关系。

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

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    containerPort 作为 pod 定义的一部分仅供参考。最终,如果您想在集群或节点中将其作为服务公开,那么您必须创建一个服务。

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

    这很好解释here

    官方kubernetes参考documentation

    【讨论】:

    • k8s 网站也对此进行了解释:kubernetes.io/docs/reference/kubernetes-api/workload-resources/…“在此处公开端口可为系统提供有关容器使用的网络连接的附加信息,但主要是信息性的。此处未指定端口不会阻止这种情况端口被暴露。”
    • 感谢您的指出。我也更新了 k8 参考链接。
    【解决方案2】:

    容器暴露的端口和服务的端口在 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
    

    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
    

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

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

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

    【讨论】:

    • 来自官方文档的示例场景:kubernetes.io/docs/tasks/access-application-cluster/…
    • containerPort 没有设置要暴露的端口,它纯粹是信息性的,对 Kubernetes 网络没有影响。然而,记录容器正在侦听的端口以供下一个试图找出您的系统的可怜人为好习惯。
    【解决方案3】:

    让我们举个例子,并尝试借助图表来理解。 考虑一个有 2 个节点和一个服务的集群。每个节点有 2 个 pod,每个 pod 有 2 个容器,分别是应用容器和 Web 容器。

    NodePort:30001(每个节点的集群级暴露端口)

    端口:80(服务端口)

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

    targetPort:80(在 docker expose 中应该提到 web 容器端口)

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

    参考和更多详情请参考以下链接https://theithollow.com/2019/02/05/kubernetes-service-publishing/

    【讨论】:

    • 您的 NodePort 错误:缺少 0。
    • 更正了错字
    • 感谢图表!!!
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多