0

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí