Pod
Pods are the smallest deployable units of computing that you can create and manage in Kubernetes.
A Pod is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers.
Think of a Pod as a wrapper around containers, ensuring they work as a single unit.
Single Container Pod
We can start or run a particular image in a pod using kubectl run
command.
➜ kubectl run nginx --image=nginx --port=80
pod/nginx created
This command will create a pod named nginx
will single container named nginx
using image nginx
and open port 80
. We can see the details using command kubectl describe
.
➜ kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
Start Time: Tue, 04 Feb 2025 12:48:15 +0700
Labels: run=nginx
Annotations: <none>
Status: Running
IP: 10.244.0.94
IPs:
IP: 10.244.0.94
Containers:
nginx:
Container ID: docker://6f804d723c05e62267a7b70896ec07dac53991f4e152874a8e713144c57c02d2
Image: nginx
Image ID: docker-pullable://nginx@sha256:0a399eb16751829e1af26fea27b20c3ec28d7ab1fb72182879dcae1cca21206a
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 04 Feb 2025 12:48:19 +0700
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-6bc8f (ro)
...
We can also use yaml
file to define pod configuration. The command kubectl run
we previously use is more or less equal with this configuration below.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Explanation:
metadata.name: nginx
: The name of the Pod (must be unique in the namespace).spec
: The specification of the Pod.containers
: List of containers that will run inside this Pod.- name: nginx
: The name of the container inside the Pod.image: nginx
: The Docker image used to run the container (pulled from Docker Hub by default).ports
: Defines which ports are opened on the container.containerPort: 80
: The container listens on port 80.
To apply it as usual we can use kubectl apply -f <file>
command.
Multiple Container Pod
To create a pod that have multiple containers we just need to add new entries in containers
section. Create new file pod.yaml
and put example configuration below.
apiVersion: v1
kind: Pod
metadata:
name: nginx-with-logger
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- name: logger
image: busybox
command: ["sh", "-c", "while true; do echo 'Logging...'; sleep 10; done"]
Apply the configuration file using kubectl apply
and let see the details using kubectl describe
command.
➜ kubectl apply -f pod.yaml
pod/nginx-with-logger created
➜ kubectl describe pod nginx-with-logger
Name: nginx-with-logger
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
Start Time: Tue, 04 Feb 2025 13:49:17 +0700
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.244.0.95
IPs:
IP: 10.244.0.95
Containers:
nginx:
Container ID: docker://7ff16ce361c2acba92bc4e7a5ad4591c2f8943dc9fc766d8c89870a66e35d012
Image: nginx
Image ID: docker-pullable://nginx@sha256:0a399eb16751829e1af26fea27b20c3ec28d7ab1fb72182879dcae1cca21206a
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 04 Feb 2025 13:49:21 +0700
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dmx2c (ro)
logger:
Container ID: docker://a2bf248b0f9cad05d9e9af0e99fc273e479bda47018c43b406d3469ed93a88e8
Image: busybox
Image ID: docker-pullable://busybox@sha256:a5d0ce49aa801d475da48f8cb163c354ab95cab073cd3c138bd458fc8257fbf1
Port: <none>
Host Port: <none>
Command:
sh
-c
while true; do echo 'Logging...'; sleep 10; done
State: Running
Started: Tue, 04 Feb 2025 13:49:26 +0700
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dmx2c (ro)
...
As you can see above we have 2 containers with name nginx
and logger
.
We can get the container logs using this command below.
➜ kubectl logs pods/nginx-with-logger logger
Logging...
Logging...
Logging...
Logging...
Logging...
Logging...
The command above will print logs from pod nginx-with-logger
specifically in container logger
. To print logs from all container we can add option --all-containers=true
.
Access the Pod
To access the pod we can use kubectl port-forward
command.
➜ kubectl port-forward nginx-with-logger 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
This command will forward traffic from port 8080
in our local machine to pod named nginx-with-logger
port 80
.
Lets try to access it using curl
and we should see default response from nginx server.
➜ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Delete Pod
To delete pod we can use kubectl delete pods <pod-name>
command.
➜ kubectl delete pods nginx
pod "nginx" deleted