Sau 1 hồi mò mẫm cài đặt cụm kubernete cluster, ko giống như minikube cài đặt dễ dàng chỉ cần làm theo hướng dẫn, kubeadm mất 2 ngày ngồi đọc tài liệu, xem video youtube, hỏi chat GPT, stack overflow, xử lý các bug, thực sự rất lãng phí nếu không viết bài chia sẻ lại từng bước cài đặt.
Yêu cầu: cài đặt Vagrant, Virtual Box trên máy

1. Khởi tạo vagrant:

Tạo file vagrant như sau

VAGRANTFILE_API_VERSION = "2"
BOX_NAME = "generic/ubuntu2204"
PROVIDER = "virtualbox"
MEMORY = "2048"
CPUS = 2

Vagrant.configure("2") do |config|
    config.vm.box = BOX_NAME
    config.vm.provider PROVIDER do |vb|
       vb.memory = MEMORY
       vb.cpus = CPUS
    end

    config.vm.define "manager" do |manager|
        manager.vm.network :private_network, ip: "192.168.33.2"
        manager.vm.hostname = "manager"
        manager.vm.provider PROVIDER do |vb|
            vb.name = "manager"
        end
    end

    config.vm.define "worker" do |worker|
        worker.vm.network :private_network, ip: "192.168.33.2"
        worker.vm.hostname = "worker"
        worker.vm.provider PROVIDER do |vb|
            vb.name = "worker"
        end
    end
end

Sau đó tại thư mục chưa file Vagrant trên, chạy lệnh

vagrant up

2. update file /etc/host tại manager và worker

Mở 2 tab, ssh vào manager lẫn worker bằng lệnh sau

vagrant ssh manager
vagrant ssh worker

Chạy sudo -i để chuyển sang user root. Sau đó tại mỗi máy ảo, chạy lệnh sau

 echo '192.168.33.2 manager' >> /etc/hosts
 echo '192.168.33.3 worker' >> /etc/hosts

3. Cài đặt docker engine trên manager và worker

docker engine quá cơ bản rồi, chỉ cần làm theo hướng dẫn ở đây

4. Cài đặt cri-dockerd trên 2 máy ảo

Kể từ kubelet v1.24, docker engine không còn hỗ trợ cri (container runtime interface) phục vụ cho kubernetes, vì thế ta sẽ phải cài đặt cri-dockerd riêng.

B1: Cài đặt golang

apt-get update
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile

B2: Clone repo cri-dockerd

git clone https://github.com/Mirantis/cri-dockerd.git

B3: Khởi tạo cri

cd cri-dockerd
apt-get install make
make cri-dockerd

Đợi 1 thời gian, sau đó chạy từng lệnh sau

mkdir -p /usr/local/bin
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
install packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket

4. Cài đặt kubeadm, kubelet and kubectl ở 2 máy ảo

B1: Cài đặt “apt-transport-https” package

apt-get update && apt-get install -y apt-transport-https

B2: Download public key

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

B3: Bổ sung kubernate repo

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

B4: Cài đặt kubeadm, kubelet, kubectl

apt-get update && apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

5. Khởi tạo cluster:

Ở cả 2 máy ảo, tắt firewall, swapping bằng lệnh sau:

ufw disable
swapoff -a

Tại manager node:

kubeadm init --pod-network-cidr=192.168.0.0/16 --control-plane-endpoint=192.168.33.2 --cri-socket=unix:///var/run/cri-dockerd.sock

Kết quả:

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join 192.168.33.2:6443 --token 8q6s6t.y3vzwjoy5rrepuui \
        --discovery-token-ca-cert-hash sha256:0e560724583db3c39fac61c4e04784f24108a4873bc9c1a859d8f4a734c6cfd1 \
        --control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.33.2:6443 --token 8q6s6t.y3vzwjoy5rrepuui \
        --discovery-token-ca-cert-hash sha256:0e560724583db3c39fac61c4e04784f24108a4873bc9c1a859d8f4a734c6cfd1

Sau đó chạy:

export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl get po -A

Kết quả:

NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE
kube-system   coredns-5dd5756b68-f6nt9          0/1     Pending   0          3m17s
kube-system   coredns-5dd5756b68-pl8h8          0/1     Pending   0          3m17s
kube-system   etcd-manager                      1/1     Running   0          3m28s
kube-system   kube-apiserver-manager            1/1     Running   0          3m28s
kube-system   kube-controller-manager-manager   1/1     Running   0          3m28s
kube-system   kube-proxy-7rlxz                  1/1     Running   0          3m18s
kube-system   kube-scheduler-manager            1/1     Running   0          3m28s

Lý do coredns bị pending do ta chưa cài pod networking. Có rất nhiều pod network add-on cho ta cài, ở đây mình sẽ chọn calico.

curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml -O

Vào file calico.yaml bằng nano hoặc vim, tìm kiếm đoạn text “CALICO_IPV4POOL_CIDR” và uncomment đoạn sau

# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"

Sau đó chạy lệnh

kubectl apply -f calico.yaml

Đợi 1 thời gian và kết quả:

NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-7c968b5878-n4nnz   1/1     Running   0          102s
kube-system   calico-node-rcjb4                          1/1     Running   0          102s
kube-system   coredns-5dd5756b68-f6nt9                   1/1     Running   0          16m
kube-system   coredns-5dd5756b68-pl8h8                   1/1     Running   0          16m
kube-system   etcd-manager                               1/1     Running   0          16m
kube-system   kube-apiserver-manager                     1/1     Running   0          16m
kube-system   kube-controller-manager-manager            1/1     Running   0          16m
kube-system   kube-proxy-7rlxz                           1/1     Running   0          16m
kube-system   kube-scheduler-manager                     1/1     Running   0          16m

Tại worker node:

kubeadm join 192.168.33.2:6443 --token 8q6s6t.y3vzwjoy5rrepuui --discovery-token-ca-cert-hash sha256:0e560724583db3c39fac61c4e04784f24108a4873bc9c1a859d8f4a734c6cfd1 --cri-socket=unix:///var/run/cri-dockerd.sock
export KUBECONFIG=/etc/kubernetes/kubelet.conf

Xem kết quả tại manager node:

kubectl get nodes

Kết quả

NAME      STATUS   ROLES           AGE   VERSION
manager   Ready    control-plane   60m   v1.28.4
worker    Ready    <none>          52m   v1.28.4

Nguồn tham khảo: