Kubernetes - Pods

Kubernetes - Pods

Kubernetes Pods are the smallest and most fundamental units in the Kubernetes object model that you can create or deploy. A pod represents a single instance of a running process in your cluster. In this guide, we'll explore the different aspects of creating and managing Kubernetes pods, including single and multi-container pods, namespaced pods, troubleshooting, and setting resource requests and limits.

1. Creating a Pod with a Single Container

Creating a pod with a single container is the most basic operation in Kubernetes. Here’s an example configuration to create a pod named single-container-pod that runs an NGINX container.

YAML Configuration:

apiVersion: v1
kind: Pod
metadata:
  name: single-container-pod
spec:
  containers:
  - name: cont1
    image: nginx:latest
    ports:
    - containerPort: 80

Command to Apply the Configuration:

kubectl apply -f single-container-pod.yaml

Verifying the Pod Creation:

After applying the configuration, you can verify the pod creation with the following commands:

kubectl get pods
kubectl get pods -n default

Checking the Node of the Pod:

To check which worker node a specific pod is running on, use:

kubectl get pods -o wide

2. Creating a Pod in a Specific Namespace

Namespaces in Kubernetes help separate resources and manage environments more effectively. Here's how you can create a pod in a specific namespace:

YAML Configuration:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: dev
spec:
  containers:
  - name: cont1
    image: httpd
    ports:
    - containerPort: 80

Command to Apply the Configuration:

kubectl apply -f  dev-namespaced-pod.yaml

This will create a pod named my-pod in the dev namespace, running an HTTPD container.

Checking the Pod Status within the Namespace:

kubectl get pods -n dev

Checking the Node of the Pod in the Namespace:

To see which worker node the pod is running on, use:

kubectl get pods -n dev -o wide

3. Creating a Pod with Multiple Containers

Kubernetes pods can contain multiple containers that share the same network namespace and storage. Below is an example configuration for creating a pod with two containers:

YAML Configuration:

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: cont1
    image: httpd
    ports:
    - containerPort: 80
  - name: cont2
    image: nginx
    ports:
    - containerPort: 80

Command to Apply the Configuration:

Save the configuration as multi-container-pod.yaml and run:

kubectl apply -f multi-container-pod.yaml

This pod (multi-container-pod.yaml) will run both HTTPD and NGINX containers, each exposing port 80.

4. Troubleshooting Pod Containers

When issues arise, Kubernetes offers tools to help troubleshoot pods. Here's how to gather detailed information:

Detailed Pod Information:

To get detailed information about a pod, use:

kubectl describe pod <pod-name>

Access Container Logs:

To view the logs of a specific container within a pod:

kubectl logs <pod-name> <container-name>

These commands provide valuable insights into the pod’s status and the container's logs, helping you diagnose issues effectively.

5. Setting Resource Requests and Limits

To ensure efficient resource utilization, it's essential to specify resource requests and limits for your containers. Below is an example configuration:

YAML Configuration:

apiVersion: v1
kind: Pod
metadata:
  name: resource-limits-pod
spec:
  containers:
  - name: cont1
    image: nginx:latest
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

Command to Apply the Configuration:

Apply the configuration by running:

kubectl apply -f resource-limits-pod.yaml

This configuration ensures that the NGINX container in resource-limits-pod.yaml requests 64Mi of memory and 250m of CPU, with limits set at 128Mi of memory and 500m of CPU