在Google容器引擎中暴露两个端口

16

在Google容器引擎中创建一个Pod是否可以暴露两个端口:8080端口监听传入内容,80端口将此内容分发给客户端?

Google提供了以下命令示例来创建Pod:

kubectl run hello-node --image=gcr.io/${PROJECT_ID}/hello-node --port=8080

我似乎无法定义监听端口,当我添加第二个“--port=”开关时,仅暴露一个端口。是否有一种方法可以公开第二个端口,或者我每个容器只能使用一个端口?


正如caesarxuchao所指出的那样,您不必限制每个pod只使用一个端口。但是如果我理解正确的话,您的应用程序正在8080端口接收数据(例如通过http post或原始tcp),并在80端口上从后端接收请求(例如通过http get或原始tcp)?针对这种情况,我建议您使用多端口服务而不是简单的pod:https://github.com/kubernetes/kubernetes/blob/release-1.1/docs/user-guide/services.md#multi-port-services - Prashanth B
6个回答

36

另一个很好的例子在这里,使用多个协议:https://cloud.google.com/container-engine/docs/tutorials/persistent-disk/ - Brandon
我认为第一行缩进过多。 - Riccardo

3

如果需要通过helm实现,则可以如下操作:

deployment.yaml

        ports:
        - containerPort: {{ .Values.containerport1 }}
          #name: containerport1
        - containerPort: {{ .Values.containerport2 }}
          #name: containerport2
        - containerPort: {{ .Values.containerport3 }}
          #name: containerport3

服务文件需要具有端口名称,否则它将会产生渲染错误。 service.yaml
  ports:
  - name: containerport1
    protocol: TCP
    port: {{ .Values.exposedport1 }}
    targetPort: {{ .Values.containerport1 }}
  - name: containerport2
    protocol: TCP
    port: {{ .Values.exposedport2 }}
    targetPort: {{ .Values.containerport2 }}
  - name: containerport3
    protocol: TCP
    port: {{ .Values.exposedport3 }}
    targetPort: {{ .Values.containerport3 }}

在安装Helm图表时,可以使用--set参数设置值。

values.yaml

containerport1: 8001
containerport2: 8002
containerport3: 8003
exposedport1: 8004
exposedport2: 8005
exposedport3: 8006

在编写 deployment.yamlservice.yaml 文件时,它们的名称是否必须匹配? - David
1
不一定,这样更容易识别。你可以给它们起不同的名字。然而我没有尝试过,但如果在服务文件中有多个端口,则名称字段是必需的,否则您的服务文件将无法解析。此外,正如您在部署文件中所看到的,名称字段已被注释掉,原因是该字段对于文件的解析并不是必需的。因此,是的,端口名称可以不同。这就是你是否要在部署文件中命名端口的答案,但是在 k8s 的服务文件中一定要为它们命名。 - redzack

2

在另一个答案中指出,使用 Kubernetes 可以进行定位,还可以使用多个端口:

kubectl expose deployment example --type=LoadBalancer --port 8080,8081 --target-port 80

1

从命令行可以使用--overrides选项指定多个端口:

以下示例同时暴露了80和8080端口:

    export APP_NAME=app-hello
    export IMAGE=gcr.io/google-samples/hello-app:1.0
    kubectl run $APP_NAME \
                --image=$IMAGE \
                --overrides='{"spec": {"template":  {"spec": {"containers": [{"name": "'$APP_NAME'", "image": "'$IMAGE'",
 "ports": [{"containerPort": 8080, "protocol": "TCP"}, {"containerPort": 80, "protocol": "TCP"}]}]}}}}'

0

Kubernetes支持目标端口:

kubectl expose deployment example --type=LoadBalancer --port 8080 --target-port 80


-2

您可以使用 --port 参数两次 kubectl run hello-node --image=gcr.io/${PROJECT_ID}/hello-node --port=8080 --port=8081


然而,原始问题和此GitHub问题指出这不起作用 - 而文档说“端口”单数。这是否已更改? - Rup
在最新版本中,它也被捕获为StringVar而不是StringArray:https://github.com/kubernetes/kubernetes/blob/v1.13.0-alpha.0/pkg/kubectl/cmd/run.go#L175 - Rup
上述方法对我无效,只显示最后一个端口。请使用kubectl get pod <pod-name> -o jsonpath='{.spec.containers[].ports[].containerPort}'命令来检查您的端口。 - undefined

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