Skip to content

Kubernetes

This chapter covers Kubernetes container orchestration basics.


Kubernetes Architecture
+------------------------------------------------------------------+
| |
| +------------------+ |
| | Control Plane | |
| | +--------------+ | |
| | | kube-apiserver| |
| | | etcd | |
| | | kube-scheduler| |
| | | kube-controller| |
| | +--------------+ | |
| +------------------+ |
| | |
| | |
| +------------------+ +------------------+ |
| | Worker Nodes | | Worker Nodes | |
| | +--------------+ | | +--------------+ | |
| | | kubelet | | | | kubelet | | |
| | | kube-proxy | | | | kube-proxy | | |
| | | containerd | | | | containerd | | |
| | +--------------+ | | +--------------+ | |
| +------------------+ +------------------+ |
| |
+------------------------------------------------------------------+

Terminal window
# Cluster info
kubectl cluster-info
kubectl get nodes
# Pods
kubectl get pods
kubectl get pods -o wide
kubectl describe pod pod_name
kubectl logs pod_name
kubectl exec -it pod_name -- /bin/sh
# Deployments
kubectl get deployments
kubectl create deployment nginx --image=nginx
kubectl scale deployment nginx --replicas=3
kubectl rollout status deployment nginx
# Services
kubectl get services
kubectl expose deployment nginx --port=80

pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
resources:
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "64Mi"
cpu: "250m"

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80

service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: ClusterIP # or NodePort, LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80
Terminal window
# NodePort example
kubectl expose deployment nginx --type=NodePort
# LoadBalancer
kubectl expose deployment nginx --type=LoadBalancer

configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database_url: "postgres://db:5432/app"
cache_enabled: "true"
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData:
username: admin
password: changeme

Terminal window
# List namespaces
kubectl get namespaces
# Create namespace
kubectl create namespace dev
# Use namespace
kubectl config set-context --current --namespace=dev
# Get in namespace
kubectl get pods -n dev

In this chapter, you learned:

  • ✅ Kubernetes architecture
  • ✅ kubectl commands
  • ✅ Pods
  • ✅ Deployments
  • ✅ Services
  • ✅ ConfigMaps and Secrets
  • ✅ Namespaces

Chapter 60: Container Security


Last Updated: February 2026