In this article we will look at pod concept in Kubernetes
What is pod in kubernetes?
The pod is the smallest execution unit in Kubernetes. It’s a single container or group of containers that serve a running process in the K8s cluster. Read what is container? if you are not familiar with containerization.
Each pod has a single IP address that is shared by all the containers within. Also, the port space is shared by all the containers inside.
You can view running pods in K8s by using below command –
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 1/1 Running 0 10s
View pod details in K8s
To get more detailed information on each pod, you can run below command by supplying its pod name as argument –
$ kubectl describe pods webserver
Name: webserver
Namespace: default
Priority: 0
Node: node01/172.17.0.9
Start Time: Sun, 05 Jul 2020 13:50:41 +0000
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.244.1.3
IPs:
IP: 10.244.1.3
Containers:
webserver:
Container ID: docker://8b260effa4ada1ff80e106fb12cf6e2da90eb955321bbe3b9e302fdd33b6c0d8
Image: nginx
Image ID: docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Sun, 05 Jul 2020 13:50:50 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-bjcwg (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-bjcwg:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-bjcwg
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 25s default-scheduler Successfully assigned default/webserver to node01
Normal Pulling 23s kubelet, node01 Pulling image "nginx"
Normal Pulled 17s kubelet, node01 Successfully pulled image "nginx"
Normal Created 16s kubelet, node01 Created container webserver
Normal Started 16s kubelet, node01 Started container webserver
pod configuration file
One can create a pod configuration file i.e. yml file which has all the details to start a pod. K8s can read this file and spin up your pod according to specifications. Sample file below –
$ cat my_webserver.yml
echo "apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
containers:
- name: webserver
image: nginx
ports:
- containerPort: 80" >my_webserver.yml
Its a single container pod file since we specified specs for only one kind of container in it.
Single container pod
Single container pod can be run without using a yml file. Like using simple command –
$ kubectl run single-c-pod --image=nginx
pod/single-c-pod created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
single-c-pod 1/1 Running 0 35s
webserver 1/1 Running 0 2m52s
You can spin the single container pod using simple yml file stated above.
Multiple container pod
For multiple container pods, let’s edit the above yml file to add another container specs as well.
$ cat << EOF >web-bash.yml
apiVersion: v1
kind: Pod
metadata:
name: web-bash
spec:
containers:
- name: apache
image: httpd
ports:
- containerPort: 80
- name: linux
image: ubuntu
ports:
command: ["/bin/bash", "-ec", "while true; do echo '.'; sleep 1 ; done"]
EOF
In the above file, we are spinning up a pod that has 1 webserver container and another is Ubuntu Linux container.
$ kubectl create -f web-bash.yml
pod/web-bash created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-bash 2/2 Running 0 12s
How to delete pod
Its a simple delete pod command
$ kubectl delete pods web-bash
pod "web-bash" deleted
How to view pod logs in Kubernetes
I am running a single container pod of Nginx. We will then check pod logs to confirm this messages.
$ kubectl run single-c-pod --image=nginx
pod/single-c-pod created
$ kubectl logs single-c-pod
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
Share Your Comments & Feedback: