Cài Đặt Môi Trường Kubernetes 2026
Kubernetes năm 2026 đã có những thay đổi quan trọng trong stack công nghệ nền tảng. Bài học này hướng dẫn bạn xây dựng môi trường phát triển Kubernetes đầy đủ — từ yêu cầu hệ thống, cài đặt containerd 2.0, tạo cluster local, đến các công cụ CLI và dashboard hiện đại nhất.
1. Yêu Cầu Hệ Thống 2026
1.1. Hardware tối thiểu
- CPU: 4 cores (khuyến nghị 8+ cores để chạy multi-node cluster)
- RAM: 8 GB (khuyến nghị 16 GB)
- Disk: 50 GB free space (SSD được khuyến nghị)
- OS: Linux với kernel 5.15+ (Ubuntu 22.04+, Debian 12+, RHEL 9+, hoặc macOS 14+ cho local dev)
1.2. Kiểm Tra và Đảm Bảo cgroup v2
Đây là yêu cầu bắt buộc quan trọng nhất. Từ Kubernetes 1.35, cgroup v1 đã deprecated. Từ Kubernetes 1.36, chỉ cgroup v2 được hỗ trợ.
# Kiểm tra cgroup version hiện tại
stat -fc %T /sys/fs/cgroup
# Kết quả cần là: cgroup2fs
# Nếu trả về "tmpfs" -> đang dùng cgroup v1, cần upgrade OS
# Cách khác để kiểm tra
ls /sys/fs/cgroup/
# cgroup v2: chỉ thấy các file như cgroup.controllers, cgroup.procs...
# cgroup v1: thấy nhiều thư mục như cpu, memory, blkio...
# Kiểm tra kernel version
uname -r
# Cần >= 5.15 cho full cgroup v2 support
Nếu đang dùng cgroup v1, cách đơn giản nhất là upgrade OS:
# Ubuntu 20.04 -> 22.04 LTS upgrade
do-release-upgrade
# Hoặc với Debian 10 -> 12 (Bookworm)
# Cgroup v2 mặc định từ Debian 11+
# Bật cgroup v2 thủ công trên Ubuntu 20.04 (kernel boot param)
sudo grubby --update-kernel=ALL \
--args="systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all"
sudo update-grub
sudo reboot
# Sau reboot, kiểm tra lại
stat -fc %T /sys/fs/cgroup # Phải là cgroup2fs
Ubuntu 22.04 LTS và mới hơn mặc định đã dùng cgroup v2 — không cần cấu hình thêm.
2. Cài Đặt containerd 2.0
containerd 2.0 là container runtime tiêu chuẩn cho Kubernetes 2026, với native cgroup v2 support và nhiều cải tiến hiệu năng.
2.1. Cài đặt trên Ubuntu/Debian
# Xóa containerd cũ nếu có
sudo apt remove containerd containerd.io -y
# Cài đặt prerequisites
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
# Thêm Docker/containerd official GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Thêm repository
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Cài containerd 2.0
sudo apt update
sudo apt install -y containerd.io
# Kiểm tra version
containerd --version
# Phải là 2.x.x
2.2. Cấu hình containerd cho Kubernetes
# Tạo thư mục config
sudo mkdir -p /etc/containerd
# Generate default config
sudo containerd config default | sudo tee /etc/containerd/config.toml
# Bật SystemdCgroup = true (BẮT BUỘC cho Kubernetes với systemd)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' \
/etc/containerd/config.toml
# Verify thay đổi
grep SystemdCgroup /etc/containerd/config.toml
# Output phải là: SystemdCgroup = true
# Restart containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
# Kiểm tra containerd đang chạy
sudo systemctl status containerd
# Test containerd hoạt động
sudo ctr version
2.3. Cài đặt crictl (CRI CLI tool)
# Cài crictl để interact với containerd qua CRI interface
VERSION="v1.32.0"
curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/${VERSION}/crictl-${VERSION}-linux-amd64.tar.gz \
| sudo tar -xz -C /usr/local/bin
# Cấu hình crictl dùng containerd
cat <
3. Cài Đặt Kubernetes Local: Kind vs k3d vs Minikube
3.1. So Sánh Các Options
Tool
Cơ chế
Ưu điểm
Nhược điểm
kind
K8s nodes là Docker containers
Multi-node, CI-friendly, stable
Cần Docker Desktop/Engine, chậm hơn k3d
k3d
k3s (lightweight K8s) trong Docker
Nhanh nhất, nhẹ nhất, multi-node dễ
k3s có một số differences với full K8s
Minikube
VM hoặc Docker driver
Dễ dùng nhất, nhiều addons
Single-node mặc định, tốn tài nguyên hơn
Khuyến nghị 2026: Dùng kind cho CI/CD pipelines và khi cần test multi-node scenarios gần với production. Dùng k3d cho local development nhanh. Bài học này hướng dẫn cả hai.
3.2. Cài đặt và Dùng kind
# Cài kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# Trên macOS
brew install kind
# Tạo cluster đơn giản (single node)
kind create cluster --name dev
# Tạo multi-node cluster với config file
cat < kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: k8s-lab
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- role: worker
extraMounts:
- hostPath: /tmp/kind-storage
containerPath: /data
- role: worker
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
kubeProxyMode: nftables
EOF
kind create cluster --config kind-config.yaml
# Xem danh sách clusters
kind get clusters
# Xóa cluster
kind delete cluster --name k8s-lab
3.3. Cài đặt và Dùng k3d
# Cài k3d
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
# Trên macOS
brew install k3d
# Tạo cluster nhanh
k3d cluster create mycluster
# Tạo multi-node cluster
k3d cluster create k8s-lab \
--servers 1 \
--agents 2 \
--port "8080:80@loadbalancer" \
--port "8443:443@loadbalancer"
# Xem clusters
k3d cluster list
# Start/stop cluster (tiết kiệm tài nguyên khi không dùng)
k3d cluster stop k8s-lab
k3d cluster start k8s-lab
# Xóa cluster
k3d cluster delete k8s-lab
4. Cài Đặt kubectl
# Lấy latest stable version
KUBECTL_VERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)
echo "Installing kubectl $KUBECTL_VERSION"
# Download kubectl binary
curl -LO "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl"
# Verify checksum (quan trọng cho security)
curl -LO "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
# Output phải là: kubectl: OK
# Install
chmod +x kubectl
sudo mv kubectl /usr/local/bin/kubectl
# Kiểm tra
kubectl version --client
# Trên macOS
brew install kubectl
# Hoặc nếu đã cài Docker Desktop, kubectl đã được included
# Enable bash completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc
source ~/.bashrc
# Zsh completion
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
5. Essential CLI Tools 2026
5.1. k9s — Terminal UI Dashboard
k9s là terminal-based UI cho Kubernetes — cung cấp cái nhìn real-time về cluster resources, cho phép navigate, xem logs, exec vào containers, tất cả từ terminal.
# Cài k9s
# macOS
brew install k9s
# Linux
curl -sS https://webinstall.dev/k9s | bash
# Hoặc download từ GitHub releases
curl -LO https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz
tar -xzf k9s_Linux_amd64.tar.gz
sudo mv k9s /usr/local/bin/
# Chạy k9s
k9s
# Một số hotkeys trong k9s:
# :pods -> xem pods (thay bằng bất kỳ resource nào)
# :nodes -> xem nodes
# l -> xem logs của pod đang chọn
# e -> edit resource
# d -> describe resource
# ctrl+d -> xóa resource
# / -> filter/search
# ? -> help
5.2. kubectx và kubens — Context và Namespace Switching
Khi làm việc với nhiều clusters và namespaces, kubectx và kubens giúp switch nhanh chóng.
# Cài kubectx và kubens
# macOS
brew install kubectx
# Linux
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
# Với krew (kubectl plugin manager)
kubectl krew install ctx
kubectl krew install ns
# Sử dụng kubectx
kubectx # Liệt kê tất cả contexts
kubectx kind-k8s-lab # Switch sang context kind-k8s-lab
kubectx - # Switch về context trước đó
kubectx prod=kind-k8s-lab # Rename context
# Sử dụng kubens
kubens # Liệt kê tất cả namespaces
kubens kube-system # Switch sang namespace kube-system
kubens - # Switch về namespace trước đó
5.3. stern — Multi-Pod Log Streaming
stern cho phép stream logs từ nhiều Pods cùng lúc, filter theo regex, và hiển thị màu sắc theo pod.
# Cài stern
# macOS
brew install stern
# Linux
curl -LO https://github.com/stern/stern/releases/latest/download/stern_linux_amd64.tar.gz
tar -xzf stern_linux_amd64.tar.gz
sudo mv stern /usr/local/bin/
# Sử dụng stern
stern . # Stream logs tất cả pods trong namespace hiện tại
stern my-app # Stream logs tất cả pods có tên chứa "my-app"
stern my-app -n production # Trong namespace production
stern my-app --tail 50 # Chỉ 50 lines cuối mỗi pod
stern my-app --since 5m # Logs từ 5 phút trước
stern "app=nginx" --selector # Dùng label selector
stern . --container sidecar # Chỉ stream container tên "sidecar"
5.4. krew — kubectl Plugin Manager
# Cài krew
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm.*$/arm/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
# Thêm vào PATH
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> ~/.bashrc
# Tìm và cài plugins hữu ích
kubectl krew search
kubectl krew install ctx ns neat tree view-secret
# Một số plugins hữu ích 2026:
# neat -> output YAML gọn gàng hơn (bỏ managed fields)
# tree -> hiển thị owner references dạng tree
# view-secret-> decode secrets dễ dàng
# rolesum -> tóm tắt RBAC permissions
# stern -> cũng có thể cài qua krew
6. Dashboard 2026: Headlamp
Kubernetes Dashboard (kubernetes/dashboard) đã bị archived tháng 1/2026 — dự án chính thức không còn được maintain. Thay thế được khuyến nghị hiện nay là Headlamp — một web-based dashboard hiện đại, actively maintained, với UI/UX tốt hơn nhiều.
6.1. Cài đặt Headlamp với Helm
# Cài Helm trước nếu chưa có
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Thêm Headlamp Helm repo
helm repo add headlamp https://headlamp-k8s.github.io/headlamp/
helm repo update
# Cài Headlamp vào kube-system namespace
helm install headlamp headlamp/headlamp \
--namespace kube-system \
--set replicaCount=1
# Xem Headlamp pod đang chạy
kubectl get pods -n kube-system -l app.kubernetes.io/name=headlamp
# Port-forward để truy cập local
kubectl port-forward -n kube-system svc/headlamp 4466:80 &
# Truy cập: http://localhost:4466
6.2. Cấu hình Service Account Token để Login
# Tạo service account với cluster-admin permissions (chỉ dùng cho dev/lab!)
kubectl create serviceaccount headlamp-admin -n kube-system
kubectl create clusterrolebinding headlamp-admin \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:headlamp-admin
# Tạo token (Kubernetes 1.24+ dùng TokenRequest API thay vì tự động tạo)
kubectl create token headlamp-admin -n kube-system --duration=720h
# Copy token và paste vào Headlamp login page
6.3. Các Alternatives cho Headlamp
- Lens / OpenLens: Desktop application (Electron), rất phổ biến, nhiều features. OpenLens là open-source fork của Lens.
- k9s: Terminal UI, faster hơn web dashboard
- Grafana: Nếu đã có Grafana stack, dùng kubernetes plugin/dashboards
- Rancher: Full platform khi quản lý nhiều clusters
7. IDE và Editor Setup
7.1. Visual Studio Code
# Cài extensions hữu ích cho Kubernetes development
code --install-extension ms-kubernetes-tools.vscode-kubernetes-tools
code --install-extension redhat.vscode-yaml
code --install-extension ms-azuretools.vscode-docker
code --install-extension golang.go # Nếu dùng Go
code --install-extension hashicorp.terraform # Nếu dùng Terraform
Extensions cần thiết trong VS Code:
- Kubernetes (ms-kubernetes-tools): IntelliSense cho YAML manifests, cluster explorer, port-forward từ IDE
- YAML (redhat): Schema validation, autocompletion cho YAML với Kubernetes schema
- Docker: Dockerfile syntax, image management
7.2. Cấu hình YAML Schema Validation
# Thêm vào VS Code settings.json
# Settings -> Open Settings (JSON) -> thêm:
{
"yaml.schemas": {
"kubernetes": "*.yaml"
},
"yaml.customTags": [
"!reference sequence"
]
}
8. First Commands: Kiểm Tra Cluster Hoạt Động
Sau khi cài đặt xong, chạy các lệnh này để verify cluster hoạt động đúng:
# 1. Thông tin cluster
kubectl cluster-info
# Output mong đợi:
# Kubernetes control plane is running at https://127.0.0.1:XXXXX
# CoreDNS is running at https://...
# 2. Danh sách nodes và trạng thái
kubectl get nodes -o wide
# Tất cả nodes phải ở trạng thái: Ready
# 3. Kiểm tra tất cả system pods
kubectl get pods -A
# Tất cả pods phải ở trạng thái: Running hoặc Completed
# 4. Kiểm tra services hệ thống
kubectl get services -A
# 5. Kiểm tra storage classes
kubectl get storageclasses
# 6. Quick connectivity test - tạo và xóa pod test
kubectl run test-pod --image=nginx:alpine --restart=Never
kubectl get pod test-pod # Phải là Running sau ~30s
kubectl delete pod test-pod
# 7. Kiểm tra DNS hoạt động
kubectl run dns-test --image=busybox:1.36 --rm -it --restart=Never \
-- nslookup kubernetes.default.svc.cluster.local
# Phải resolve thành công
# 8. Xem resource usage (cần metrics-server)
kubectl top nodes
9. Cấu Hình kubeconfig và Multiple Clusters
# kubeconfig mặc định ở ~/.kube/config
cat ~/.kube/config
# Xem contexts hiện có
kubectl config get-contexts
# Xem context đang dùng
kubectl config current-context
# Merge nhiều kubeconfig files
export KUBECONFIG=~/.kube/config:~/.kube/config-cluster2
kubectl config view --flatten > ~/.kube/config-merged
mv ~/.kube/config-merged ~/.kube/config
# Set namespace mặc định cho context
kubectl config set-context --current --namespace=my-namespace
# Một số best practices:
# - Không dùng cluster-admin trong development thường ngày
# - Tạo dedicated service account với minimum permissions cần thiết
# - Dùng kubectx/kubens để tránh nhầm cluster/namespace
10. Tổng Kết Setup Checklist
Dưới đây là checklist để verify môi trường đã sẵn sàng:
#!/bin/bash
# Kubernetes 2026 Environment Check Script
echo "=== Checking cgroup v2 ==="
CGROUP_TYPE=$(stat -fc %T /sys/fs/cgroup)
if [ "$CGROUP_TYPE" = "cgroup2fs" ]; then
echo "✓ cgroup v2 active"
else
echo "✗ cgroup v1 detected! Upgrade required for K8s 1.36+"
fi
echo ""
echo "=== Checking containerd ==="
if command -v containerd &> /dev/null; then
echo "✓ containerd $(containerd --version | awk '{print $3}')"
else
echo "✗ containerd not found"
fi
echo ""
echo "=== Checking kubectl ==="
if command -v kubectl &> /dev/null; then
echo "✓ kubectl $(kubectl version --client --short 2>/dev/null | head -1)"
else
echo "✗ kubectl not found"
fi
echo ""
echo "=== Checking CLI Tools ==="
for tool in kind k3d helm k9s stern kubectx kubens; do
if command -v $tool &> /dev/null; then
echo "✓ $tool installed"
else
echo "- $tool not installed (optional)"
fi
done
echo ""
echo "=== Checking Cluster ==="
if kubectl cluster-info &> /dev/null; then
echo "✓ Cluster accessible"
kubectl get nodes --no-headers | awk '{print "✓ Node "$1" - "$2}'
else
echo "✗ No cluster accessible (run: kind create cluster)"
fi
Sau khi hoàn thành bài học này, bạn đã có đầy đủ môi trường để học và thực hành Kubernetes. Trong bài thực hành tiếp theo, chúng ta sẽ áp dụng tất cả những gì đã cài đặt để deploy ứng dụng thực tế đầu tiên.