POD - Kubernetes
Ibrahim S
Posted on March 2, 2024
A Pod encapsulates one (or) more containers, shared storage (volumes), and configuration options about how to run the containers.
Here are some key points about Pods in Kubernetes:
Atomic Unit: A Pod represents a single instance of an application in Kubernetes. It's the basic building block for deploying and managing containers.
Single (or) Multiple Containers: A Pod can contain one (or) more containers that are tightly coupled and share certain resources such as networking and storage. These containers are scheduled onto the same node and can communicate with each other via localhost.
Shared Network and Storage: Containers within the same Pod share the same network namespace, including IP address and port space, and they can communicate with each other using localhost. They can also share storage volumes, allowing them to share data.
Lifecycle: Pods have a lifecycle that includes phases such as Pending, Running, Succeeded, Failed, (or) Unknown. Kubernetes manages the lifecycle of Pods, ensuring they are always in the desired state.
Immutable: Pods are immutable once created. If changes are needed, a new Pod is typically created with the updated configuration.
Labels and Selectors: Pods can be labeled with key-value pairs, and selectors are used to identify Pods based on these labels. This allows for grouping and organizing Pods, which is useful for tasks like service discovery and load balancing.
Controllers: While Pods can be created manually, they are typically managed by higher-level controllers like Deployments, StatefulSets (or) DaemonSets. These controllers ensure that a specified number of Pod replicas are running and manage rolling updates, scaling, and self-healing.
Resource Management: Pods can have resource requests and limits specified for CPU and memory usage, allowing Kubernetes to make scheduling decisions based on available resources.
Pod Lifecycle Management: Kubelet handles the lifecycle of pods, including starting, stopping, and restarting containers as necessary to maintain the desired state specified in the pod definition.
Pods in Kubernetes using YAML files. Using these YAML files, we can create objects that interact with the Kubernetes API (Pods, Namespace, Deployments, etc.). Under the hood, kubectl converts the information defined in our YAML file to JSON, which requests the Kubernetes API.
apiVersion: v1
kind: Pod
metadata:
name: nginx-1
labels:
name: nginx-1
env: production
spec:
containers:
- name: nginx
image: nginx
To create Kubernetes objects using YAML, we need to set values for the following fields.
apiVersion - This defines the Kubernetes API version. We want to use this YAML file.
kind - This defines what kind of Kubernetes object we want to create.
metadata - This is data that helps us uniquely identify the object that we want to create. Here we can provide a name for our app, as well as apply labels to our object.
spec - This defines the state that we want or our object. The format that we use for spec. For our Pod file, we have provided information about the containers that we want to host on our Pod.
Deploy and interact with our Pods using kubectl
kubectl, (kube-control (or) as some people call it, kube-cuddle) is the Kubernetes command-line tool. It allows us to run commands against Kubernetes clusters.
Create a Pod using our YAML definition file like
kubectl apply -f mypod.yaml
List all of our Pods
kubectl get pods
Pods and Containers are only accessible within the Kubernetes Cluster. Expose a container port externally using kubectl
kubectl port-forward mypod 8080:80
Delete the pod
kubectl delete pod mypod
Pod to be destroyed and created. We can also delete the Deployment that manages the Pod.
kubectl delete deployment mydeployment
Ensure that our Pods in Kubernetes are healthy
Kubernetes relies on Probes to determine whether (or) not a Pod is healthy.
Liveness Probes
Readiness Probes
Startup Probe
Probe https://dev.to/ibrahimsi/probe-kubernetes-o67
Kubernetes manages the lifecycle of Pods, ensuring they are always in the desired state and below the lifecycle of a pod in Kubernetes.
ā š£š²š»š±š¶š»š“ ā” When a pod is created, it enters the Pending state. In this state, the Kubernetes scheduler assigns the pod to a suitable node in the cluster.
The scheduler considers factors like resource availability, node affinity, and pod anti-affinity when making this assignment.
ā š„šš»š»š¶š»š“ ā” Once a pod is assigned to a node, it transitions to the Running state. In this state, the pod's containers are created and started, and they begin running on the assigned node.
However, the containers may still be initializing or starting up, so the pod may not be fully ready to serve traffic.
ā š¦šš°š°š²š²š±š²š± ā” If a pod completes its main task successfully and terminates, it enters the Succeeded state.
This typically happens for batch jobs or one-time tasks. Once in the Succeeded state, the pod remains in this state until it is explicitly deleted. The system can reclaim the resources occupied by the pod.
ā šš®š¶š¹š²š± ā” If a pod encounters an error or its containers fail to start or run, it enters the Failed state.
Posted on March 2, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.