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!
You have multiple Options:
Create multiple services exposing one port each, on the same deployment.
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
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.
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