Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kubernetes - How to expose 2 different containers in a pod?

Tags:

kubernetes

I am trying to create a pod with 2 containers each having different images! Am not sure how to expose the two different containers to the client. Following is my yaml file for deployment.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: checkdifimage
spec:
  replicas: 1
  template: 
metadata:
  labels:
    app: checkdifimagelab
spec:
  containers:
  - name: checkallcont1
    image: <dockerimage>
    ports:
    - containerPort: 32030
  - name: checkall1cont2
    image: <dockerimage2>
    ports:
    - containerPort: 32031

What am currently doing is after I have the deployment up. I run the following command to expose the service :

kubectl expose pod checkdifimage --port=8080 --type=NodePort --name=diffimage

This works for a single container and am able to hit the service from a rest client. But when I use 2 containers, i am only able to hit one container. How should I proceed to hit both the containers? Also, if someone can please guide on what are the advantages and disadvantages of using one pod having one image vs one pod having multiple images!

like image 291
Dreams Avatar asked Feb 16 '17 09:02

Dreams


2 Answers

You have multiple Options:

  1. Create multiple services exposing one port each, on the same deployment.

  2. Create single service exposing multiple ports:

    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      selector:
        app: MyApp
      ports:
      - name: http
        protocol: TCP
        port: 80
        targetPort: 9376
      - name: https
        protocol: TCP
        port: 443
        targetPort: 9377
    
  3. Using kubectl expose:

    kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https
    

Note that if no port is specified via –port and the exposed resource has multiple ports, all will be re-used by the new service. Also if no labels are specified, the new service will re-use the labels from the resource it exposes.

Source

When to use multi container pods: A pod is a group of one or more containers, the shared storage for those containers, and options about how to run the containers. Pods are always co-located and co-scheduled, and run in a shared context. A pod models an application-specific “logical host” - it contains one or more application containers which are relatively tightly coupled — in a pre-container world, they would have executed on the same physical or virtual machine.

enter image description here

like image 77
Farhad Farahi Avatar answered Nov 13 '22 03:11

Farhad Farahi


You can actually do this in the command line:

kubectl expose deployment xxx --port=8080,18000 --type=NodePort

Set the ports just by a comma

like image 33
Junv Avatar answered Nov 13 '22 03:11

Junv