[Kubernetes Series] Cài đặt Kubernetes Cluster Local trên Ubuntu 22.04

3 min read

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:

Theo dõi cái bài viết khác: Thien Nguyen Thai

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *