Bài này sẽ hướng dẫn bạn dựng một cụm Kubernetes hoàn chỉnh chạy trên máy local (dùng VMware/VirtualBox hoặc bất kỳ hypervisor nào bạn thích) chỉ trong vòng 30-45 phút.

Phiên bản sử dụng:
- Ubuntu Server 22.04 LTS
- Kubernetes v1.32.x (stable mới nhất)
- Containerd làm CRI
- Flannel làm CNI
- Ingress-NGINX (NodePort)
- Local-path-provisioner + NFS làm storage demo
Chuẩn bị máy ảo (VM)
Tạo 3 VM Ubuntu 22.04 (tối thiểu):
- k8s-master: 2 CPU, 4GB RAM, 20GB disk
- k8s-worker-01: 2 CPU, 4GB RAM, 20GB disk
- k8s-worker-02: 2 CPU, 4GB RAM, 20GB disk
Cấu hình network: NAT hoặc Bridged đều được, miễn là 3 máy ping được nhau. Gợi ý hostname + IP tĩnh (ví dụ):
k8s-master 192.168.1.100
k8s-worker-01 192.168.1.101
k8s-worker-02 192.168.1.102
Thêm vào /etc/hosts trên cả 3 máy:
sudo tee -a /etc/hosts <<EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-worker-01
192.168.1.102 k8s-worker-02
EOF
Bước 1: Cấu hình chung (chạy trên TẤT CẢ 3 máy)
# Update hệ thống
sudo apt update && sudo apt upgrade -y
# Tắt swap (bắt buộc)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# Tắt ufw
sudo ufw disable
# Cho phép iptables thấy bridged traffic
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
# Load module br_netfilter
sudo modprobe br_netfilter
Bước 2: Cài containerd (tất cả 3 máy)

# Cài các gói cần thiết
sudo apt install -y ca-certificates curl gnupg lsb-release
# Cài containerd
sudo apt install -y containerd
# Cấu hình containerd dùng systemd cgroup (rất quan trọng với Kubernetes)
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# Sửa file config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# Restart containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
Bước 3: Cài kubeadm, kubelet, kubectl (tất cả 3 máy)

# Thêm repo Kubernetes chính thức
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/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.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Bước 4: Khởi tạo Master Node (chỉ chạy trên k8s-master)

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=k8s-master
Sau khi init thành công sẽ thấy dòng join command, lưu lại (sẽ dùng cho worker).
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
Kiểm tra:
kubectl get nodes
# STATUS sẽ là NotReady (chưa có CNI)
Bước 5: Cài Flannel CNI (trên master)
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
kubectl get pods -n kube-system
kubectl get nodes # giờ phải là Ready
Bước 6: Join Worker node (chạy trên worker-01 và worker-02)
Dùng lệnh mà kubeadm init đã in ra, ví dụ:
sudo kubeadm join k8s-master:6443 --token abcdef.1234567890abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Kiểm tra trên master:
kubectl get nodes
# Phải thấy 3 node Ready
Bước 7: Cài Ingress-NGINX (NodePort mode – phù hợp môi trường local)
# Thêm Helm repo (nếu chưa có Helm thì cài trước)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Cài bằng Helm (dùng DaemonSet + hostNetwork để dễ truy cập từ host)
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.kind=DaemonSet \
--set controller.hostNetwork=true \
--set controller.service.enabled=false
Truy cập Ingress từ máy host qua IP của bất kỳ node nào + NodePort (thường là 30080 hoặc 30443).
Bước 8: Storage demo (optional nhưng rất hữu ích)
Cách 1: Local Path Provisioner (tự động tạo PV cho PVC)
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
Cách 2: NFS Server đơn giản (chạy trên master hoặc máy riêng)
Trên master:
sudo apt install -y nfs-kernel-server
sudo mkdir -p /mnt/nfs_storage
sudo chown nobody:nogroup /mnt/nfs_storage
echo "/mnt/nfs_storage *(rw,sync,no_wdelay,no_root_squash)" | sudo tee /etc/exports
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
Tạo PV:
# nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 192.168.1.100 # IP của master
path: /mnt/nfs_storage
kubectl apply -f nfs-pv.yaml
Hoàn tất!
Bây giờ bạn đã có một cụm Kubernetes đầy đủ chức năng chạy local:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 10m v1.32.x
k8s-worker-01 Ready <none> 5m v1.32.x
k8s-worker-02 Ready <none> 4m v1.32.x
Link quan trọng:
- Local Path Provisioner: https://github.com/rancher/local-path-provisioner
- Kubernetes docs: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
- Ingress-NGINX: https://kubernetes.github.io/ingress-nginx/
Theo dõi cái bài viết khác: Thien Nguyen Thai
