15
votes

Is it possible to create a Pod in the Google Container Engine where two ports are exposed: port 8080 is listening for incoming content and port 80 distributes this content to clients?

The following command to create a Pod is given as example by Google:

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

I can't seem to define a listening port, and when adding a second "--port=" switch only one port is exposed. Is there a way to expose a second port or am I limited to one port per container?

6
As pointed out by caesarxuchao, you are not limited to 1 port per pod. But IIUC your app is receiving data (say via http post, or raw tcp) on 8080 and receiving requests from backends (say via http get, or raw tcp) on port 80? Instead of using a simple pod I'd recommend a multiport service for such cases: github.com/kubernetes/kubernetes/blob/release-1.1/docs/… - Prashanth B

6 Answers

27
votes

No, you cannot specify multiple ports in kubectl run. But you can use kubectl create to create a replication controller, and specify multiple ports for the container.

https://github.com/kubernetes/examples/blob/master/cassandra/cassandra-statefulset.yaml has an example:

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

If required through the helm, it can be achieved as:

deployment.yaml

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

The service file needs to have a port name else it will give a render error.

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 }}

The values can be set using the --set parameter while installing helm chart.

values.yaml

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

Pointed out in another answer using kubernetes allows targeting, but also multiple ports:

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

From the command line, it is possible to specify multiple ports using the --overrides option:

This example exposes both ports 80 and 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
votes

Kubernetes supports a target port:

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

-2
votes

You can use --port paramater two times kubectl run hello-node --image=gcr.io/${PROJECT_ID}/hello-node --port=8080 --port=8081