A Pod is the smallest execution unit of a Kubernetes application. Each Pod represents a part of a workload that is running on your cluster.
We usually have one pod per application. Inside that pod we could have multiple container.
- A Pod is a Kubernetes abstraction that represents a group of one or more application containers and some shared resources.
- It has shared volumes.
- Cluster IP(Every pod has unique IP even in same Node)
- Info about how to run container.
- We don’t deal with containers instead we work with pods.
- If a container dies inside a pod it will be automatically restarted.
- Each pod is tied to one node until termination.
- Pods that are running inside k8s are only visible from other pods and services inside the k8s cluster.
- We have to expose the app to outside the k8s.
Multiple Container Pods – The pods are always designed to support multiple correlated containers. The containers in a pod is automatically scheduled in same VM or physical machine in the cluster.
The containers can communicate to each other and share resources.
Pods Networking –
- Each pod is assigned with a unique IP address.
- Each container in pods share the network share the same IP address with port.
- The containers inside a pod can communicate to each other with localhost.
- The containers inside a pod can also communicate using Inter Process Communication.
Life Cycle of a Pod
- A pod is said to be ephemeral.
- A pod is never rescheduled to a different node Instead the pod is replaced by a new one.
- If a node fails the pods assigned to it also fail.
Generally a pod has 5 phases –
- Pending – Pod has been accepted by the cluster but one or more container haven’t been setup.
- Running – A pod has been bound to a node and containers have started.
- Succeeded – All containers in the pod have been terminated successfully.
- Failed – At least one container have been terminated in failure.
- Unknown – For some reason the state of pod could not be obtained.
# Create a deployment $ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 # Get deployment info $ kubectl get deployments # Get the list of pods running $ kubectl get pods # See which containers are running inside a pod $ kubectl describe pods # Run a command inside a container $ kubectl exec $POD_NAME -- env # Open bash inside a container $ kubectl exec -it $POD_NAME -- bash
We don’t create the pods directly. The reason is suppose we need 4 pods in our deployment always and if we create the pods directly and the one pod goes down then we have to create the pods manually.
That’s why we use ReplicaSet. It is a management system that ensure that I have the desired set of pods in the k8s cluster. And the controller check the current state with the desired state and see if the current pod count match the ReplicaSet count or not. If not it creates or deletes pods.
# Get the replica set $ kubectl get rs # Scale up the app and change replicaset $ kubectl scale deployments/kubernetes-bootcamp --replicas=4 # Scale down the app $ kubectl scale deployments/kubernetes-bootcamp --replicas=2 # To see a pod in managed by ReplicaSet $ kubectl get pods <pod_name> -o yaml # Delete the ReplicaSet $ kubectl delete rs <replica_name> # Delete the replica set but keep the pods $ kubectl delete rs <replica_name> --cascade=false