Example: Create Pod with Run Command #
# Create a pod with Nginx container
kubectl run example-pod --image=nginx:alpine
# List pods
kubectl get pods
# List pod details
kubectl describe pod example-pod
# List pod details: Save output in YAML format into file
kubectl get pod example-pod -o yaml > example-pod.yaml
# Delete the pod
kubectl delete pod example-pod
 
Example: Create Pod with YAML Configuration #
Create Configuration #
# Create a pod configuration with dry-run
kubectl run nginx --image=nginx --dry-run=client -o yaml > example-pod.yaml
# Adopt the pod configuration and add a port
vi example-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    ports: # Add the port
    - containerPort: 80
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
# Create the pod
kubectl create -f example-pod.yaml
Port-Forwarding #
# Create a port-forwarding
kubectl port-forward pod/nginx 8080:80
# Curl the Nginx container (in a new shell)
curl localhost:8080
# Shell output:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
 
Example: Multi Container Pod #
Overview #
- 
The following Pod configuration deploys a Nginx and an Alpine container within the same pod. 
- 
The Nginx container serves the default content on port “80” and the Alpine container is configured to curl the Nginx service at localhost port “80” every three seconds. 
- 
Containers within the same pod share the same network space and can communicate via localhost, which refers to other containers in the same pod.
- 
All containers in the pod share the same IP address and each must ensure they use different port numbers if they serve network traffic. 
Create Pod #
# Create a configuration for the pod
vi nginx-alpine-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-alpine-pod
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 80
  - name: alpine-container
    image: alpine
    command: ["/bin/ash", "-c"]
    args:
    - apk add --no-cache curl &&
      while true; do
        curl http://localhost:80/;
        sleep 3;
      done
- "/bin/ash", "-c"Path to ash shell, the “-c” option tells the shell to take the next string as a command to execute.
# Create the pod
kubectl create -f nginx-alpine-pod.yaml
Pod Status & Details #
List Pods & Pod Details #
# Check pod status
kubectl get pods
# Shell output: Wait till both containers a ready
NAME                                    READY   STATUS    RESTARTS      AGE
nginx-alpine-pod                        2/2     Running   0             11s
# List pod details
kubectl describe pod nginx-alpine-pod
# Shell output:
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  26s   default-scheduler  Successfully assigned default/nginx-alpine-pod to ubuntu3
  Normal  Pulling    26s   kubelet            Pulling image "nginx"
  Normal  Pulled     25s   kubelet            Successfully pulled image "nginx" in 979ms (979ms including waiting). Image size: 72955450 bytes.
  Normal  Created    25s   kubelet            Created container nginx-container
  Normal  Started    25s   kubelet            Started container nginx-container
  Normal  Pulling    25s   kubelet            Pulling image "alpine"
  Normal  Pulled     23s   kubelet            Successfully pulled image "alpine" in 2.543s (2.543s including waiting). Image size: 3634744 bytes.
  Normal  Created    23s   kubelet            Created container alpine-container
  Normal  Started    23s   kubelet            Started container alpine-container
Alpine Container Logs #
In the logs of the Alpine container, the curled output of the Nginx service is visible:
# Check the logs of the "alpine-container" in the "nginx-alpine-pod"
kubectl logs nginx-alpine-pod -c alpine-container --tail=30
# Shell output:
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
Find Container on Kubernetes Node #
Find Worker Node #
# List on which node the pods runs
kubectl get pods -o wide
# Shell output:
NAME               READY   STATUS    RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
nginx-alpine-pod   2/2     Running   0          6m21s   10.233.74.71   node4   <none>           <none>
Find Container Runtime #
# Use the following command to find the container runtime
kubectl describe node node4
# Shell output:
...
Container Runtime Version:  containerd://1.7.16
List Containers on Node #
Log in to the Kubernetes node where the pod runs, to check the container status:
# List all running containers managed by containerd within the Kubernetes namespace (k8s.io)
sudo ctr -n k8s.io containers list
# Shell output:
CONTAINER                                                           IMAGE                                               RUNTIME
...
0a68e2f17ff0a92ed5d7ee14d4041362ab62851377a34a153c0a04c4e047a772    docker.io/library/alpine:latest                     io.containerd.runc.v2
1ea8b91d268c81819ccfd2a8d41936d53f545f2a8933a6de28e9c34a133c391d    docker.io/library/nginx:1.25.2-alpine               io.containerd.runc.v2
# List detailed information about a specific container
sudo ctr -n k8s.io containers info container-id
sudo ctr -n k8s.io containers info 0a68e2f17ff0a92ed5d7ee14d4041362ab62851377a34a153c0a04c4e047a772
Delete the Pod #
# Delete the pod
kubectl delete pod nginx-alpine-pod