Cài Kubernetes lab bằng kubeadm / K3s
🎯 Mục tiêu: Bootstrap cluster Kubernetes 1 control plane + 2 worker node trên VM Linux; xác minh cluster healthy bằng kubectl.
🧰 Công cụ / nền tảng: Ubuntu 22.04 LTS (3 VM: 2 vCPU, 2 GB RAM mỗi node), kubeadm v1.29+ hoặc K3s v1.28+, kubectl, containerd.
📦 Chuẩn bị: 3 VM có IP tĩnh (ví dụ: 192.168.100.10 control, 192.168.100.11–12 worker), SSH key giữa các node, tắt swap, bật IP forwarding.
▶️ Phương án A — kubeadm (tất cả 3 node):
# === CHẠY TRÊN TẤT CẢ 3 NODE ===
# 1. Tắt swap vĩnh viễn
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
# 2. Bật modules kernel cần thiết
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 3. Cấu hình sysctl
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
# 4. Cài containerd
sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# Đổi SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
# 5. Cài kubeadm, kubelet, kubectl
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/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
# === CHẠY TRÊN CONTROL PLANE NODE ===
# 6. Init cluster (thay --pod-network-cidr nếu dùng CNI khác)
sudo kubeadm init \
--apiserver-advertise-address=192.168.100.10 \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint=192.168.100.10
# 7. Cấu hình kubectl cho user hiện tại
mkdir -p $HOME/.kube
sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 8. Lưu lệnh join (output từ kubeadm init)
# VÍ DỤ: kubeadm join 192.168.100.10:6443 --token abcdef.0123456789abcdef \
# --discovery-token-ca-cert-hash sha256:<hash>
# === CHẠY TRÊN WORKER NODE 1 VÀ 2 ===
# 9. Join cluster (dán lệnh từ bước 8)
sudo kubeadm join 192.168.100.10:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:<hash>
▶️ Phương án B — K3s (nhanh hơn, phù hợp lab nhỏ):
# === CONTROL PLANE (server) ===
curl -sfL https://get.k3s.io | sh -s - server \
--cluster-init \
--write-kubeconfig-mode 644
# Lấy token để join worker
sudo cat /var/lib/rancher/k3s/server/node-token
# Output ví dụ: K107a...::server:abc123
# === WORKER NODE 1 VÀ 2 ===
K3S_URL="https://192.168.100.10:6443"
K3S_TOKEN="<token-từ-trên>"
curl -sfL https://get.k3s.io | K3S_URL=$K3S_URL K3S_TOKEN=$K3S_TOKEN sh -
▶️ Xác minh cluster (control plane):
# Kiểm tra nodes
kubectl get nodes -o wide
# Kết quả mong đợi:
# NAME STATUS ROLES AGE VERSION
# control Ready control-plane 5m v1.29.x
# worker-01 Ready <none> 3m v1.29.x
# worker-02 Ready <none> 3m v1.29.x
# Kiểm tra pods hệ thống
kubectl get pods -n kube-system
# Kiểm tra cluster info
kubectl cluster-info
✅ Kết quả mong đợi: 3 node ở trạng thái Ready; tất cả pod trong kube-system ở trạng thái Running hoặc Completed. (Nếu node vẫn NotReady sau bước này thì cần cài CNI — xem LAB-037.)
🧹 Cleanup: Để reset node: sudo kubeadm reset -f && sudo rm -rf /etc/cni/net.d. K3s: sudo k3s-uninstall.sh (server) hoặc sudo k3s-agent-uninstall.sh (worker).