在Kubernetes上暴露容器的多个端口

11

我正试图在本地的minikube集群上运行我的自定义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

但它只讨论了如何配置服务以公开多个端口,而不是如何为容器实现这一点——这应该是先决条件。

谢谢!

2个回答

17

使用kubectl expose命令,你可以通过用逗号隔开的方式指定多个端口:

    --port=8001,8002

我认为这是对问题最简单的答案。 - Anurag
如果您需要在一个命令中从多个容器中暴露端口,可以使用像 concurrently 这样的工具。(这是我使用的工具) - Venryx
这个可行!但我需要将多个端口映射到多个目标端口,而这不起作用 :( --target-port 不接受多个端口。 - bentzy

15
根据您的命令,需要在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参数会起作用吗? - user152468
当暴露多个端口时,您需要为每个暴露的端口命名。这应该添加到答案中。 - user152468
回答已更新。关于在创建容器时指定端口,根据文档,kubectl run 只接受一个端口。 - Javier Salmeron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接