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:
- https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm
- https://jhooq.com/14-steps-to-install-kubernetes-on-ubuntu-18-04-and-16-04/
- https://www.youtube.com/watch?v=o6bxo0Oeg6o
- https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-50-nodes-or-less