Kubernetes - Pod
Intro to smallest deployable unit in Kubernetes
Table of Contents
A Pod is a group of one or more containers and it is the smallest deployable unit in Kubernetes. Pod and VM (virtual machine) are similar in many ways:
- Containers in pod share the same IP address and port space
- Shared storage (volumes)
- Relatively tightly coupled applications in one pod
Kubernetes applies IP at Pod
scope. Containers within a pod share an IP address and port space, and can find each other via localhost
. Its just like what we do in VM: one prcoess find others with localhost:port
.
Also pod can be accessed by other pod in Kubernetes cluster, it helps developer no need to worry about how to access other containers cross hosts. However, normally we don’t access other Pod directly but using service
instead and we will discuss it in later article.
For example, emptyDir
is one of volume types in Kubernetes, it share the lifetime with Pod which means that it exists as long as the Pod is running on that node. Containers in same pod share the emptyDir
, its quite helpful when you want to access the same files across Pod. Imagine that there is a service running in Pod and you need a log parser to parse the service log in order to monitor service state, we can access the log files easily in different containers through mounting shared emptyDir
volume.
Container often runs single application. But sometimes we also need a sidecar container
to help the main container, for example we need a monitor container to monitor service container and sending alerts if something goes wrong. In a pre-container world, these tightly coupled applications would have run on the VM, and now they runs on different containers in the same Pod.
Lets create a web server pod with two containers backend
and frontend
in it.
- backend: prints current date to index.html(/tmp/index.html) located at the share volume every second.
- frontend: runs a simple http server that display the index.html, which the directory is mount to /var/www, to user.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
labels:
service: example-pod
spec:
containers:
- name: backend
image: ubuntu
command:
- "bash"
- "-c"
args:
- "while true; do date > /tmp/index.html ; sleep 1; done"
volumeMounts:
- mountPath: /tmp # the mount point for volume
name: content-volume # should match the volume name defined below
- name: frontend
image: trinitronx/python-simplehttpserver
command:
- "sh"
- "-c"
args:
- "python -m SimpleHTTPServer 8080"
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /var/www # we can define different mount point for different container
name: content-volume
volumes:
- name: content-volume
emptyDir: {}
Find the internal IP Address of pod in Kubernetes cluster
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
example-pod 2/2 Running 0 4m 172.16.31.4 10.101.0.199
The address 172.16.31.4
is only accessible in Kubernetes cluster, so we create another pod to perform curl
command.
$ kubectl -n default run curl-test --image=radial/busyboxplus:curl -i --tty --rm
Now, you should be able to see the response from the web server pod.
[ root@curl-test-74cc7dc45f-4qjk4:/ ]$ curl http://172.16.31.4:8080
Mon Jun 25 05:51:54 UTC 2018
See Also
- Kubernetes - Two Steps Installation
- Kubernetes - Installation
- Rolling Updates with Kubernetes Deployments
- Kubernetes - High Availability
- Adopting Container and Kubernetes in Production
To reproduce, republish or re-use the content,
please attach with link: https://tachingchen.com/
Twitter
Google+
Facebook
Reddit
LinkedIn
StumbleUpon
Pinterest
Email