Chuyển tới nội dung chính

Setup Cluster Lab bằng Vagrant

Mọi bài trong bộ ghi chú này chạy trên một cluster kubeadm gồm 1 master và 2 worker, dựng tự động bằng Vagrant trên VMware theo repo tranvix0910/k8s-vagrant. Hướng dẫn chạy được trên cả macOS và Windows; bước nào khác nhau sẽ có tab riêng cho từng hệ điều hành.

1. Kiến trúc lab​

VMIPRAMCPUVai tròDùng cho CKA?
k8s-master192.168.81.1014 GB2Control plane✅
k8s-worker1192.168.81.1024 GB2Worker✅
k8s-worker2192.168.81.1034 GB2Worker✅
ha-proxy192.168.81.1001 GB1Load balancer (HAProxy)Không bắt buộc
dev-server192.168.81.1042 GB1Máy devKhông bắt buộc
deploy-server192.168.81.1052 GB1Máy CI/CDKhông bắt buộc

Để học CKA chỉ cần 3 VM Kubernetes (12 GB RAM). Ba VM còn lại chỉ là máy Ubuntu trống, dùng cho các bài sau như HAProxy hay CI/CD.

Thành phầnPhiên bản
Boxbento/ubuntu-24.04
Kubernetes (kubelet, kubeadm, kubectl)1.30.x
Container runtimecontainerd (từ repo Docker)
CNICalico 3.30.0

2. Chuẩn bị máy host​

CầnmacOSWindows
Phần mềm ảo hóaVMware FusionVMware Workstation Pro
Vagrant ≥ 2.3✅✅
Vagrant VMware Utility✅✅
Plugin vagrant-vmware-desktop✅✅
Git✅✅
RAM trống≥ 16 GB≥ 16 GB
Ổ đĩa trống≥ 60 GB≥ 60 GB
  • Repo chỉ khai báo provider vmware_desktop, nên cần VMware (Fusion trên macOS, Workstation trên Windows). VMware Fusion và Workstation Pro hiện miễn phí cho mục đích cá nhân.
  • Vagrant VMware Utility là dịch vụ trung gian để Vagrant điều khiển VMware. Tải tại developer.hashicorp.com/vagrant/install/vmware.

Cài VMware Fusion từ trang của Broadcom, sau đó mở Terminal:

brew install --cask vagrant vagrant-vmware-utility
brew install git kubectl
vagrant plugin install vagrant-vmware-desktop
vagrant plugin list

3. Clone repo và chỉnh script​

git clone https://github.com/tranvix0910/k8s-vagrant.git
cd k8s-vagrant
k8s-vagrant/
├── Vagrantfile # khai báo 6 VM và script provision
└── scripts/
├── common.sh # chạy trên cả 3 node Kubernetes
├── master.sh # kubeadm init + Calico trên k8s-master
└── worker.sh # kubeadm join trên từng worker

3.1. Đổi dải IP Pod (khuyến nghị)​

scripts/master.sh mặc định dùng --pod-network-cidr=192.168.0.0/16. Dải này chứa luôn mạng VM 192.168.81.0/24, nên Pod IP có thể trùng với IP node. Các bài trong bộ ghi chú dùng 10.244.0.0/16, vì vậy hãy đổi trước khi chạy:

sed -i '' 's#192.168.0.0/16#10.244.0.0/16#' scripts/master.sh
grep pod-network-cidr scripts/master.sh

Với kubeadm, Calico tự đọc dải này từ cấu hình cluster, nên không cần sửa manifest Calico.

3.2. Mac Chip Apple Silicon​

scripts/common.sh cố định arch=amd64 khi thêm repo Docker. Trên Mac M1/M2/M3/M4, VM là ARM64 nên bước cài containerd sẽ lỗi. Sửa thành:

sed -i '' 's/\[arch=amd64\]/[arch=$(dpkg --print-architecture)]/' scripts/common.sh

Windows và Mac chip Intel thì bỏ qua bước này.

4. Setup Cluster​

Lệnh giống nhau trên macOS (Terminal) và Windows (PowerShell). Chạy theo thứ tự master trước, worker sau; Vagrant tạo VM tuần tự theo thứ tự tên trong lệnh:

vagrant up k8s-master k8s-worker1 k8s-worker2 --provider=vmware_desktop

Lần đầu mất khoảng 10–20 phút (tải box, cài gói). Trong lúc chạy sẽ thấy log của từng script:

[K8s Setup] Common setup for all nodes
[1/10] Adding host entries...
...
[K8s Setup] Master node READY!
...
[K8s Setup] Worker node joined successfully!

5. Kiểm Tra Cluster​

vagrant ssh k8s-master -c "sudo -u kubernetes kubectl get nodes -o wide"
NAME          STATUS   ROLES           AGE     VERSION
k8s-master Ready control-plane 6m47s v1.30.x
k8s-worker1 Ready <none> 4m6s v1.30.x
k8s-worker2 Ready <none> 3m59s v1.30.x

Node vừa join có thể NotReady vài phút trong lúc Calico khởi động. Xem các Pod hệ thống:

vagrant ssh k8s-master -c "sudo -u kubernetes kubectl get pods -n kube-system -o wide"

Bạn sẽ thấy đúng những thành phần đã học ở phần Cluster Architecture: etcd-k8s-master, kube-apiserver-k8s-master, kube-controller-manager-k8s-master, kube-scheduler-k8s-master (static pod), kube-proxy và calico-node trên mọi node (DaemonSet), cùng coredns.

Dùng kubectl ngay trên máy host (tùy chọn)​

Mạng 192.168.81.0/24 truy cập được từ máy host, nên có thể lấy file kubeconfig về và chạy kubectl trực tiếp:

mkdir -p ~/.kube
vagrant ssh k8s-master -c "sudo cat /etc/kubernetes/admin.conf" > ~/.kube/cka-lab.conf
export KUBECONFIG=~/.kube/cka-lab.conf
kubectl get nodes

6. SSH và lệnh Vagrant cơ bản​

Chạy trong thư mục chứa Vagrantfile. Các lệnh giống nhau trên macOS và Windows.

SSH vào node​

vagrant ssh k8s-master
vagrant ssh k8s-worker1
vagrant ssh k8s-worker2

Script đã tạo user kubernetes (sudo không cần mật khẩu) và cấu hình sẵn kubectl cho user này. Sau khi SSH vào master:

sudo su - kubernetes
kubectl get nodes

Chạy một lệnh mà không cần vào hẳn VM:

vagrant ssh k8s-master -c "sudo -u kubernetes kubectl get pods -A"

Lệnh Vagrant cơ bản​

ViệcLệnh
Xem trạng thái các VMvagrant status
Bật clustervagrant up k8s-master k8s-worker1 k8s-worker2
Tắt cluster (giữ nguyên dữ liệu)vagrant halt k8s-master k8s-worker1 k8s-worker2
Tạm dừng / chạy tiếp (lưu trạng thái RAM)vagrant suspend / vagrant resume
Khởi động lại một VMvagrant reload k8s-worker1
Bật các VM phụvagrant up ha-proxy dev-server deploy-server
Xóa toàn bộ clustervagrant destroy k8s-master k8s-worker1 k8s-worker2 -f
💡

vagrant up với VM đã tạo chỉ bật máy, không chạy lại script cài đặt. Muốn dựng lại cluster sạch từ đầu: vagrant destroy ... -f rồi vagrant up ... như mục 4.

7. Bước tiếp theo​

Cluster đã Ready, bắt đầu học từ Cluster Architecture.