【问题标题】:Exposing two ports in Google Container Engine在 Google Container Engine 中暴露两个端口
【发布时间】:2016-04-02 19:18:40
【问题描述】:

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

Google 给出了以下创建 Pod 的命令:

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

我似乎无法定义监听端口,当添加第二个“--port=”开关时,只有一个端口被暴露。 有没有办法公开第二个端口,或者我是否仅限于每个容器一个端口?

【问题讨论】:

  • 正如 caesarxuchao 所指出的,每个 pod 不限于 1 个端口。但是 IIUC 您的应用程序正在 8080 上接收数据(例如通过 http post 或 raw tcp)并在端口 80 上接收来自后端的请求(例如通过 http get 或 raw tcp)?对于这种情况,我建议不要使用简单的 pod,而是使用多端口服务:github.com/kubernetes/kubernetes/blob/release-1.1/docs/…

标签: google-cloud-platform kubernetes gcloud google-kubernetes-engine


【解决方案1】:

不,您不能在kubectl run 中指定多个端口。但是你可以使用kubectl create创建一个复制控制器,并为容器指定多个端口。

https://github.com/kubernetes/examples/blob/master/cassandra/cassandra-statefulset.yaml 有一个例子:

ports:
- containerPort: 7000
  name: intra-node
- containerPort: 7001
  name: tls-intra-node
- containerPort: 7199
  name: jmx
- containerPort: 9042
  name: cql

【讨论】:

【解决方案2】:

在另一个答案中指出,使用 kubernetes 允许定位,但也允许多个端口:

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

【讨论】:

    【解决方案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 chart 时使用 --set 参数设置值。

    values.yaml

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

    【讨论】:

    • deployment.yamlservice.yaml 中的名称必须匹配吗?
    • 不一定这样更容易识别。您可以以不同的方式命名它们。但是我没有尝试过,但是如果您在服务文件中有多个端口,则名称字段是必需的,否则您的服务文件将不会被解析。此外,正如您在部署文件中看到的那样,名称字段已被注释掉,这是解析文件不需要字段的原因。所以是的,端口名称可以不同。这就是你是否在部署文件中命名端口而是在k8s的服务文件中确定它们的答案。
    【解决方案4】:

    在命令行中,可以使用 --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"}]}]}}}}'
    

    【讨论】:

      【解决方案5】:

      Kubernetes 支持一个目标端口:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 2018-09-03
        • 2021-12-16
        • 1970-01-01
        • 2019-10-24
        • 2020-02-22
        • 2019-06-22
        相关资源
        最近更新 更多