deployed_code CNCF

CKA: Certified Kubernetes Administrator Complete Guide

Master Kubernetes cluster administration with CKA certification. Hands-on exam covering cluster management, networking, security, troubleshooting, and production operations.

calendar_today December 29, 2025 schedule 21 min read person CertPractice Team

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.

lightbulb
Who Should Take CKA?
  • 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

schedule
Duration
120 minutes (2 hours)
quiz
Questions
15-20 performance-based tasks
check_circle
Passing Score
66%
payments
Exam Fee
$395 (includes one free retake)

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

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
  • quiz
    GitHub CKA Exercises - Free practice problems
    open_in_new

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. 1 Read all questions first (5 minutes) - Identify easy wins
  2. 2 Do easy questions first (60 minutes) - Bank points quickly
  3. 3 Tackle medium questions (40 minutes) - Work through challenges
  4. 4 Attempt hard questions (15 minutes) - Give best effort

Critical Exam Tips

  1. 1 Always verify context first:
kubectl config use-context 
kubectl config current-context  # Verify
  1. 1 Use imperative commands - Don't write YAML from scratch
  2. 2 Verify your work:
kubectl get 
kubectl describe 
kubectl logs   # For workload issues
  1. 1

    Bookmark important docs during exam:

    • Pod specification examples
    • NetworkPolicy examples
    • RBAC examples
    • etcd backup commands
  2. 2

    Don't spend >8 minutes on one question - Flag and move on

Common Mistakes to Avoid

  1. 1 ❌ Working in wrong context - Always verify!
  2. 2 ❌ Not checking your work - Verify resources are running
  3. 3 ❌ Writing YAML from scratch - Use imperative + dry-run
  4. 4 ❌ Ignoring partial credit - Attempt every question
  5. 5 ❌ Overthinking - Keep solutions simple
  6. 6 ❌ Not using documentation - It's allowed, use it!

Practice Questions

info
CKA Practice Labs

Practice with hands-on Kubernetes cluster administration scenarios.

Frequently Asked Questions

quizFrequently Asked Questions
Q
CKA vs CKAD - which first?

CKA if you manage clusters. CKAD if you develop applications. Most administrators take CKA first.

Q
How hard is CKA?

Very challenging. Requires solid Kubernetes knowledge and speed under pressure. Pass rate ~40-50% for first-time takers.

Q
Do I need to know cluster installation?

Yes, you must know how to upgrade clusters with kubeadm and understand cluster components.

Q
Can I use Kubernetes documentation?

Yes! kubernetes.io is fully accessible. Practice finding information quickly.

Q
What if I don't finish?

Partial credit exists. Attempt every question even if incomplete. Don't leave anything blank.

Q
Is Killer.sh harder than real exam?

Yes, intentionally harder. Scoring 60%+ on Killer.sh means you're ready for the real exam.

Q
Do I need to know Docker/containerd?

Basic understanding helps. Know how to use crictl for runtime troubleshooting.

Q
How much cluster administration experience needed?

1-2 years recommended, but dedicated learners can pass with 3-4 months of intensive study and lab practice.

Q
What happens if I fail?

Your exam includes one free retake. If you fail both attempts, must purchase again ($395).

Q
How long is CKA valid?

3 years. After that, recertify by retaking the exam.


CKA Success Formula:

  1. 1 Hands-on practice - 80+ hours minimum in real clusters
  2. 2 kubectl mastery - Know imperative commands by heart
  3. 3 Speed drills - Practice under time constraints
  4. 4 Troubleshooting skills - Learn to debug quickly
  5. 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!

group

CertPractice Team

Expert certification guides and study tips

Ready to Get CNCF Certified?

Start practicing with our CKA question bank. Get instant feedback and track your progress.