【问题标题】:Which ports are supposed to be exposed in a Helm Chart when TWO ports are exposed in the docker image?当 docker 镜像中暴露了两个端口时,哪些端口应该暴露在 Helm Chart 中?
【发布时间】:2021-12-18 16:25:00
【问题描述】:

在使用 helm 图表(由 helm create <name> 生成)并在 values.yaml 中指定一个 docker 镜像时,例如镜像“kubernetesui/dashboard:v2.4.0”,其中暴露的端口写为EXPOSE 8443 9090 我发现很难知道如何在实际的 helm 图表文件中正确指定这些端口,并且想知道是否有人可以进一步解释该主题。

据我了解,EXPOSE 8443 9090 表示 hostPort "8443" 映射到 containerPort "9090"。在这种情况下,service.yaml 似乎应该以类似于以下方式指定端口:

spec:
  type: {{ .Values.service.type }}
  ports:
    - port: 8443
      targetPort: 9090

但是,deployment.yaml 文件只有“containerPort”字段,没有 8443 端口的端口字段(如下所示)我是否应该在 deployment.yaml 中添加一些字段以包含端口 8443?

spec:
  template:
    spec:
      containers:
        - name: {{ .Chart.Name }}
          ports:
            - name: http
              containerPort: 9090
              protocol: TCP

截至目前,当我尝试安装 helm 图表时,它给了我一条错误消息:"Container image "kubernetesui/dashboard:v2.4.0" already present on machine",我听说这意味着 service.yaml 中的端口未配置为与 docker 映像公开的端口相匹配。我已经使用更简单的 docker 映像对此进行了测试,该映像仅公开了一个端口,并且只是在各处添加了该端口,并且错误消息消失了,所以这似乎是真的,但我仍然对如何使用两个公开的端口进行操作感到困惑。

非常感谢您的帮助,如果您对此有任何经验并愿意分享,请提前感谢您。

【问题讨论】:

    标签: docker kubernetes kubernetes-helm docker-image


    【解决方案1】:

    Docker 映像永远不会指定它将使用的任何主机资源。如果 Dockerfile 有 EXPOSE 和两个端口号,那么这两个端口都是公开的(其中“公开”在现代 Docker 中几乎没有任何意义)。那就是:这行说容器在端口 8443 和 9090 上侦听,而不需要任何特定的外部行为。

    在您的 Kubernetes Pod 规范(通常嵌套在部署规范中)中,您通常会将两个端口都列为 containerPorts:。同样,这并没有真正说明服务如何使用它。

    # inside templates/deployment.yaml
    ports:
      - name: http
        containerPort: 9090
        protocol: TCP
      - name: https
        containerPort: 8443
        protocol: TCP
    

    然后在相应的服务中,您可以重新发布一个或两个端口。

    # inside templates/service.yaml
    spec:
      type: {{ .Values.service.type }}
      ports:
        - port: 80           # default HTTP port
          targetPort: http   # matching name: in pod, could also use 9090
        - port: 443          # default HTTP/TLS port
          targetPort: https  # matching name: in pod, could also use 8443
    

    我选择在其“正常”HTTP 端口上发布未加密和受 TLS 保护的端口,并使用端口名称将服务绑定到 pod。

    这些设置都不是 Helm 特有的;这里唯一的 Helm 模板引用是 Service type:(如果操作员需要发布 NodePortLoadBalancer 服务)。

    【讨论】:

    • (我试图回答核心问题,但这并不能回答 pod 无法启动的问题。您引用的消息是集群没有拉动的信息性消息image 因为它不需要。这个端口/服务级别的配置通常不会导致 pod 无法启动。)
    猜你喜欢
    • 2017-08-31
    • 2018-09-03
    • 1970-01-01
    • 2019-10-24
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多