Table of Contents
CKA: Kubernetes Cluster Administrator
The Certified Kubernetes Administrator (CKA) certification from the Cloud Native Computing Foundation (CNCF) validates your skills in designing, installing, configuring, and managing production-grade Kubernetes clusters. Unlike CKAD which focuses on application development, CKA tests your ability to administer and troubleshoot Kubernetes infrastructure.
CKA is a 100% hands-on, performance-based exam. You perform actual administrative tasks on real Kubernetes clusters - no multiple choice questions.
- Kubernetes cluster administrators
- DevOps engineers managing K8s infrastructure
- Site Reliability Engineers (SREs)
- Platform engineers building K8s platforms
- Cloud engineers deploying production clusters
- Those with 1+ year Kubernetes experience
What Makes CKA Challenging
Pure Performance-Based:
- No theoretical questions or multiple choice
- Solve 15-20 real-world administrative tasks
- Work with actual Kubernetes clusters (6-8 clusters)
- All solutions must function correctly to receive credit
Time Pressure:
- 2 hours for 15-20 questions
- Complex tasks requiring multiple steps
- Must know kubectl commands by heart
- Context switching between clusters
Real Production Scenarios:
- Troubleshoot broken clusters
- Recover from failures
- Implement security policies
- Configure networking and storage
- Upgrade cluster components
Exam Format and Requirements
Exam Environment
Remote Proctored:
- Take from home/office with webcam
- Strict proctoring (clean desk, one monitor, no notes)
- Live proctor monitors via webcam and screen sharing
- PSI Secure Browser required
Terminal Environment:
- Ubuntu Linux terminal with kubectl pre-installed
- Multiple Kubernetes clusters (v1.29 as of 2025)
- Must switch contexts between clusters
- Each question specifies which cluster to use
Allowed Resources:
- kubernetes.io/docs - Official Kubernetes documentation
- kubernetes.io/blog - Kubernetes blog
- Can search and reference documentation during exam
- No other websites or resources allowed
Tools Available:
- kubectl (Kubernetes CLI)
- vim, nano (text editors)
- systemctl (for cluster components)
- crictl (container runtime interface)
CKA Exam Domains
Domain 1: Cluster Architecture, Installation & Configuration
Manage RBAC:
# Create service account
kubectl create serviceaccount jenkins -n devops
# Create role
kubectl create role pod-reader --verb=get,list,watch --resource=pods
# Create rolebinding
kubectl create rolebinding pod-reader-binding \
--role=pod-reader --serviceaccount=devops:jenkins
# ClusterRole and ClusterRoleBinding
kubectl create clusterrole node-reader --verb=get,list --resource=nodes
kubectl create clusterrolebinding node-reader-binding \
--clusterrole=node-reader --serviceaccount=devops:jenkins
# Check permissions
kubectl auth can-i create pods --as=system:serviceaccount:devops:jenkins
kubectl auth can-i get nodes --as=system:serviceaccount:devops:jenkins
Upgrade Kubernetes Cluster:
# Control plane upgrade
sudo apt-mark unhold kubeadm
sudo apt update
sudo apt install -y kubeadm=1.29.0-00
sudo apt-mark hold kubeadm
# Drain control plane
kubectl drain controlplane --ignore-daemonsets
# Upgrade control plane
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.29.0
# Upgrade kubelet and kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt install -y kubelet=1.29.0-00 kubectl=1.29.0-00
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# Uncordon
kubectl uncordon controlplane
# Worker node upgrade
kubectl drain worker01 --ignore-daemonsets --delete-emptydir-data
# SSH to worker node
sudo apt-mark unhold kubeadm
sudo apt update && sudo apt install -y kubeadm=1.29.0-00
sudo apt-mark hold kubeadm
sudo kubeadm upgrade node
sudo apt-mark unhold kubelet kubectl
sudo apt install -y kubelet=1.29.0-00 kubectl=1.29.0-00
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# Exit worker node
kubectl uncordon worker01
etcd Backup and Restore:
# Backup etcd
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# Verify backup
ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot.db
# Restore etcd
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
--data-dir=/var/lib/etcd-restore
# Update etcd manifest to use new data directory
vim /etc/kubernetes/manifests/etcd.yaml
# Change --data-dir=/var/lib/etcd-restore
Manage cluster nodes:
# View nodes
kubectl get nodes
kubectl get nodes -o wide
# Describe node
kubectl describe node worker01
# Cordon node (mark unschedulable)
kubectl cordon worker01
# Drain node (evict pods)
kubectl drain worker01 --ignore-daemonsets --delete-emptydir-data
# Uncordon node
kubectl uncordon worker01
# Delete node
kubectl delete node worker01
# Taint node
kubectl taint nodes worker01 key=value:NoSchedule
kubectl taint nodes worker01 key=value:NoExecute
# Remove taint
kubectl taint nodes worker01 key=value:NoSchedule-
Domain 2: Workloads & Scheduling
Deployments:
# Create deployment
kubectl create deployment nginx --image=nginx --replicas=3
# Scale deployment
kubectl scale deployment nginx --replicas=5
# Update image
kubectl set image deployment/nginx nginx=nginx:1.21
# Rollout status
kubectl rollout status deployment/nginx
# Rollout history
kubectl rollout history deployment/nginx
# Rollback
kubectl rollout undo deployment/nginx
kubectl rollout undo deployment/nginx --to-revision=2
# Edit deployment
kubectl edit deployment nginx
# Autoscale
kubectl autoscale deployment nginx --min=2 --max=10 --cpu-percent=80
ConfigMaps and Secrets:
# Create ConfigMap
kubectl create configmap app-config \
--from-literal=DB_HOST=mysql \
--from-literal=DB_PORT=3306
kubectl create configmap nginx-config --from-file=nginx.conf
# Create Secret
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secretpass
kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
# Use in pod
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: app
image: myapp:1.0
envFrom:
- configMapRef:
name: app-config
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
volumeMounts:
- name: config
mountPath: /etc/config
volumes:
- name: config
configMap:
name: nginx-config
DaemonSets and Static Pods:
# Create DaemonSet
kubectl create deployment logging --image=fluentd --dry-run=client -o yaml > ds.yaml
# Edit kind: DaemonSet, remove replicas
# Static pod (place in /etc/kubernetes/manifests/)
cat > /etc/kubernetes/manifests/static-pod.yaml <
Resource Management:
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
Domain 3: Services & Networking
Services:
# ClusterIP (default)
kubectl expose deployment nginx --port=80 --target-port=80
# NodePort
kubectl expose deployment nginx --type=NodePort --port=80
# LoadBalancer
kubectl expose deployment nginx --type=LoadBalancer --port=80
# Create service from YAML
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
NetworkPolicies:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: production
spec:
podSelector:
matchLabels:
app: database
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 3306
egress:
- to:
- podSelector:
matchLabels:
app: monitoring
ports:
- protocol: TCP
port: 9090
DNS and CoreDNS:
# Check CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns
# CoreDNS ConfigMap
kubectl get configmap coredns -n kube-system -o yaml
# Test DNS resolution
kubectl run test-dns --image=busybox --rm -it -- nslookup kubernetes.default
# Service DNS format
# ..svc.cluster.local
Domain 4: Storage
PersistentVolumes and PersistentVolumeClaims:
# PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data
---
# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
# Use in Pod
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-data
StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
Domain 5: Troubleshooting
Cluster Component Troubleshooting:
# Check node status
kubectl get nodes
kubectl describe node worker01
# Check kubelet logs
sudo journalctl -u kubelet -f
sudo systemctl status kubelet
# Check kube-apiserver
kubectl get pods -n kube-system
kubectl logs kube-apiserver-controlplane -n kube-system
# Check cluster info
kubectl cluster-info
kubectl get cs # component status (deprecated)
# Check certificates
kubeadm certs check-expiration
Pod Troubleshooting:
# Check pod status
kubectl get pods
kubectl get pods -o wide
kubectl describe pod myapp
# Check logs
kubectl logs myapp
kubectl logs myapp -c container-name
kubectl logs myapp --previous
# Debug with exec
kubectl exec -it myapp -- /bin/bash
kubectl exec myapp -- cat /etc/config/app.conf
# Debug with ephemeral container
kubectl debug myapp -it --image=busybox --target=myapp
# Events
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events -n kube-system
Network Troubleshooting:
# Test DNS
kubectl run test --image=busybox --rm -it -- nslookup kubernetes.default
# Test connectivity
kubectl run test --image=busybox --rm -it -- wget -O- http://service-name
# Check endpoints
kubectl get endpoints service-name
# Check network plugins
kubectl get pods -n kube-system | grep -i network
Critical kubectl Command Mastery
Time-Saving Imperative Commands
# Create resources quickly
kubectl run nginx --image=nginx --port=80
kubectl create deployment web --image=nginx --replicas=3
kubectl expose deployment web --port=80 --target-port=80
# Generate YAML
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml
kubectl create deployment web --image=nginx --dry-run=client -o yaml > deploy.yaml
# Quick edits
kubectl edit deployment web
kubectl set image deployment/web nginx=nginx:1.21
kubectl scale deployment web --replicas=5
# Labels and selectors
kubectl label pods myapp env=prod
kubectl get pods -l env=prod
kubectl get pods --show-labels
# Annotations
kubectl annotate pods myapp description="Web server"
# Resource usage
kubectl top nodes
kubectl top pods
kubectl top pods --containers
# Copy files
kubectl cp myapp:/app/config.yaml ./config.yaml
kubectl cp ./data.txt myapp:/tmp/
Context and Namespace Management
# View contexts
kubectl config get-contexts
kubectl config current-context
# Switch context (CRITICAL for exam)
kubectl config use-context cluster1
# Set default namespace
kubectl config set-context --current --namespace=production
# Work with namespaces
kubectl get pods -n kube-system
kubectl get pods -A # All namespaces
kubectl create namespace dev
Exam-Specific Aliases
Set these at the beginning of the exam:
alias k=kubectl
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kgn='kubectl get nodes'
alias kdp='kubectl describe pod'
alias kds='kubectl describe service'
alias kex='kubectl exec -it'
alias klo='kubectl logs'
export do="--dry-run=client -o yaml"
Study Resources
Official CNCF Resources
Recommended Courses
Hands-On Practice
- 🔬 Killer.sh - Included free with exam, hardest practice available
- 🔬 KodeKloud CKA Labs - Lightning Labs for speed practice
- 🔬 Kind, Minikube, or kubeadm - Build local clusters for practice
Practice Exams
- 📝 Killer.sh Simulator - Free with registration, most realistic
- 📝 KodeKloud Mock Exams - Part of course
8-Week Study Plan
Week 1-2: Cluster Architecture & Installation
- Install Kubernetes with kubeadm
- Understand cluster components
- Practice cluster upgrades
- Master RBAC configuration
- Lab Time: 15-20 hours
Week 3-4: Workloads & Scheduling
- Master Deployments, DaemonSets, StatefulSets
- Configure resource requests/limits
- Practice scheduling (taints, tolerations, affinity)
- Work with ConfigMaps and Secrets
- Lab Time: 15-20 hours
Week 5-6: Networking & Services
- Create all Service types
- Implement Ingress controllers
- Configure NetworkPolicies
- Troubleshoot DNS and connectivity
- Lab Time: 15-20 hours
Week 7: Storage & Troubleshooting
- Implement PV and PVC
- Configure StorageClasses
- Master troubleshooting techniques
- Practice etcd backup/restore
- Lab Time: 15-20 hours
Week 8: Speed Drills & Mock Exams
- Take Killer.sh exam (2 hours)
- Complete time-boxed scenarios (6-8 minutes each)
- Review weak areas
- Speed drill kubectl commands
- Take Killer.sh again
- Practice Time: 20-25 hours
Exam Strategies
Time Management
- 1 Read all questions first (5 minutes) - Identify easy wins
- 2 Do easy questions first (60 minutes) - Bank points quickly
- 3 Tackle medium questions (40 minutes) - Work through challenges
- 4 Attempt hard questions (15 minutes) - Give best effort
Critical Exam Tips
- 1 Always verify context first:
kubectl config use-context
kubectl config current-context # Verify
- 1 Use imperative commands - Don't write YAML from scratch
- 2 Verify your work:
kubectl get
kubectl describe
kubectl logs # For workload issues
-
1
Bookmark important docs during exam:
- Pod specification examples
- NetworkPolicy examples
- RBAC examples
- etcd backup commands
-
2
Don't spend >8 minutes on one question - Flag and move on
Common Mistakes to Avoid
- 1 ❌ Working in wrong context - Always verify!
- 2 ❌ Not checking your work - Verify resources are running
- 3 ❌ Writing YAML from scratch - Use imperative + dry-run
- 4 ❌ Ignoring partial credit - Attempt every question
- 5 ❌ Overthinking - Keep solutions simple
- 6 ❌ Not using documentation - It's allowed, use it!
Practice Questions
Practice with hands-on Kubernetes cluster administration scenarios.
Frequently Asked Questions
CKA if you manage clusters. CKAD if you develop applications. Most administrators take CKA first.
Very challenging. Requires solid Kubernetes knowledge and speed under pressure. Pass rate ~40-50% for first-time takers.
Yes, you must know how to upgrade clusters with kubeadm and understand cluster components.
Yes! kubernetes.io is fully accessible. Practice finding information quickly.
Partial credit exists. Attempt every question even if incomplete. Don't leave anything blank.
Yes, intentionally harder. Scoring 60%+ on Killer.sh means you're ready for the real exam.
Basic understanding helps. Know how to use crictl for runtime troubleshooting.
1-2 years recommended, but dedicated learners can pass with 3-4 months of intensive study and lab practice.
Your exam includes one free retake. If you fail both attempts, must purchase again ($395).
3 years. After that, recertify by retaking the exam.
CKA Success Formula:
- 1 Hands-on practice - 80+ hours minimum in real clusters
- 2 kubectl mastery - Know imperative commands by heart
- 3 Speed drills - Practice under time constraints
- 4 Troubleshooting skills - Learn to debug quickly
- 5 Documentation navigation - Know where to find examples fast
CKA is the gold standard for Kubernetes administration certification. It proves you can actually manage production Kubernetes clusters, not just answer questions about them!
CertPractice Team
Expert certification guides and study tips