在 Kubernetes 上暴露多个容器端口

Posted

技术标签:

【中文标题】在 Kubernetes 上暴露多个容器端口【英文标题】:Exposing multiple ports of container on kubernetes 【发布时间】:2018-05-22 22:03:31 【问题描述】:

我正在尝试在我的本地 minkube 集群上运行我的自定义 marklogic 图像。 Marklogic 为管理 (8001) 和查询 (8000) 公开了多个不同的端口。有没有办法在 Kubernetes 上暴露一个容器的多个端口?

这是我尝试过的:

# try to run container with multiple ports exposed. 
kubectl run ml3 --image=marklogic-initial-install:9.0-3.1 --port=8001 --port 8002
# create service to expose the container
kubectl expose deployment ml3 --type=LoadBalancer
# use qinikube to open the exposed ports 
minikube service ml3

这可能吗?

kubernetes 文档中的这一部分表明它确实是可能的:

https://kubernetes.io/docs/concepts/services-networking/service/#multi-port-services

但它只讲了如何配置服务以暴露多个端口,并没有说明如何为容器实现这一点——这应该是一个先决条件。

谢谢!

【问题讨论】:

【参考方案1】:

根据我在您的命令中看到的内容,您需要在 kubectl expose 中指定此服务将使用的两个端口中的哪一个。如果有两个端口执行不同的操作,那么拥有两个服务是有意义的(否则您将不知道每个请求中将使用两个端口中的哪一个)。所以,我的建议是执行两个 kubectl expose 命令(在--port 部分你可以放任何你想要的东西):

kubectl expose deployment ml3 --type=LoadBalancer --name=management --port=80 --target-port=8000
kubectl expose deployment ml3 --type=LoadBalancer --name=query --port=80 --target-port=8001

因此,您将拥有一个用于查询的服务和另一个用于管理的服务。

另一种选择是使用具有两个不同端口的服务,但我不确定这是否可以使用 kubectl expose。在这种情况下使用 yaml 文件是有意义的:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp <-- use a proper selector for your pods
  ports:
  - name: management 
    protocol: TCP
    port: 80
    targetPort: 8000
  - name: query 
    protocol: TCP
    port: 81
    targetPort: 8001

【讨论】:

听起来不错。但是我不是在创建容器时也必须指定两个端口吗?它可以与多个 --port 参数一起使用吗? 当暴露多个端口时,您必须为每个暴露的端口命名。这应该添加到答案中。 答案已更新。关于在创建容器时指定端口,根据文档,看起来 kubectl run 只会接受一个。【参考方案2】:

使用kubectl expose,您可以通过逗号分隔来指定多个端口:

    --port=8001,8002

【讨论】:

我认为这是对这个问题最简单的回答。 如果你需要在一个命令中暴露多个容器的端口,你可以使用concurrently这样的工具。 (这就是我使用的)

以上是关于在 Kubernetes 上暴露多个容器端口的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes 暴露服务端口的几种方式

Docker容器 暴露多个端口

如何运行多进程Docker容器

如何列出所有容器的暴露端口?

Kubernetes基础知识笔记

如何配置prometheus kubernetes_sd_configs 指定特定主机端口?