Bài 2. Thiết lập K8s Lab trên VM với Kubeadm
Yêu cầu
- 2 VM (Ubuntu 22.04): 1 Control Plane + 1 Worker
- RAM tối thiểu: CP 2GB, Worker 1GB
- CPU: 2 core mỗi máy
- Network: Các VM ping được nhau
Bước 1: Cài đặt chung (chạy trên CẢ 2 VM)
1.1 Tắt swap (K8s yêu cầu)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab # tắt swap vĩnh viễn
1.2 Cấu hình kernel modules
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
1.3 Cấu hình sysctl cho networking
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
1.4 Cài container runtime (containerd)
# Cài containerd
sudo apt update
sudo apt install -y containerd
# Tạo config mặc định
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# QUAN TRỌNG: Bật SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
1.5 Cài kubeadm, kubelet, kubectl
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# Thêm GPG key của Google
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# Thêm repo
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # giữ phiên bản, không auto-upgrade
Lưu ý version: Dùng
v1.30ở trên. Kiểm tra phiên bản mới nhất tại: https://kubernetes.io/releases/
Bước 2: Khởi tạo Control Plane (chỉ trên máy CP)
2.1 Lấy IP của máy CP
ip addr show # tìm IP nội bộ, ví dụ 10.0.0.10
2.2 Chạy kubeadm init
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=<IP-CUA-CP>
Giải thích:
--pod-network-cidr: Dải IP cho Pod (phải khớp với CNI plugin, dùng 10.244.0.0/16 cho Flannel)--apiserver-advertise-address: IP của máy CP để worker kết nối đến
2.3 Khi init thành công, output sẽ có 2 phần quan trọng:
Phần 1 — Cấu hình kubectl cho user thường:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Phần 2 — Lệnh join worker (LƯU LẠI NGAY):
kubeadm join <IP-CP>:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
→ Copy lệnh này, lát chạy trên worker!
2.4 Cài CNI Network Plugin (Flannel)
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
Kiểm tra:
kubectl get nodes
# Phải thấy node ở trạng thái Ready (có thể mất ~1 phút)
Bước 3: Join Worker Node (trên máy Worker)
Chạy lệnh join đã copy từ bước trên:
sudo kubeadm join <IP-CP>:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
Về máy CP kiểm tra:
kubectl get nodes
# Output mong đợi:
# NAME STATUS ROLES AGE VERSION
# cp Ready control-plane 5m v1.30.x
# worker1 Ready <none> 1m v1.30.x
Bước 4: Cài tab-completion & alias (trên CP)
# Bash completion cho kubectl
sudo apt install -y bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
# Alias tiện lợi
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc
source ~/.bashrc
Troubleshooting thường gặp
| Lỗi | Cách fix |
|---|---|
Node NotReady |
Kiểm tra CNI plugin đã cài chưa: kubectl get pods -n kube-flannel |
container runtime is not running |
Kiểm tra containerd: sudo systemctl status containerd |
| Worker không join được | Kiểm tra firewall, port 6443 phải mở giữa worker → CP |
| Quên token join | Trên CP: kubeadm token create --print-join-command |
Kiểm tra nhanh cluster
# Xem tất cả node
kubectl get nodes -o wide
# Xem tất cả pod hệ thống
kubectl get pods -A
# Xem thông tin cluster
kubectl cluster-info
⏭️ Bài tiếp: https://viblo.asia/p/bai-3-pod-deployment-chay-app-dau-tien-18J2ej0a4YK — Pod, Deployment, và app đầu tiên
All rights reserved