Dựng 1 cluster kubernetes với Kubeadm
Chuẩn bị :
Các máy ảo hoặc server có cấu hình tối thiểu 2 vCPUs 2GB RAM cho woker node và 2 vCPUs - 4 GB RAM cho master node, các máy ảo hoặc các server phải được thông mạng với nhau.
I. Cài đặt container runtime
1. Cài đặt containerd trên các node master và woker
Bước 1: Cài đặt containerd
sudo apt update
sudo apt install containerd -y
Bước 2: Tạo file cấu hình mặc định:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
Bước 3: Chỉnh sửa file cấu hình:
sudo nano /etc/containerd/config.toml
Tìm và sửa các dòng sau:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
Bước 5: Khởi động lại dịch vụ
sudo systemctl restart containerd
Bước 6: Kiểm tra trạng thái containerd
sudo systemctl status containerd
Status hiện trạng thái active (running) như hình thì containerd đã cài đặt và chạy thành công.
II. Cài đặt kubeadm, kubelet
Ở các máy ảo, tắt firewall, swapping bằng lệnh sau:
ufw disable
swapoff -a
1. Cài đặt kubeadm, kubelet ở các node
Bước 1: Cài đặt “apt-transport-https” package
apt-get update && apt-get install -y apt-transport-https
Bước 2: Download public key
curl -fsSL [https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key](https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key) | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Bước 3: 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
<aside>
💡 **Chú ý:**
+ Với v1.28 là version k8s muốn cài
</aside>
Bước 4: Cài đặt kubeadm, kubelet, kubectl
apt-get update && apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
2. Khởi tạo cluster ở node master
Bước 1: Khởi tạo cluster
kubeadm init --pod-network-cidr=192.168.0.0/16 --control-plane-endpoint=192.168.1.129 --cri-socket=unix:///run/containerd/containerd.sock
<aside>
💡 **Giải thích các tham số :**
-pod-network-cidr=192.168.0.0/16
:- Xác định dải địa chỉ IP cho mạng pod trong cluster.
- Trong trường hợp này, nó dùng dải 192.168.0.0/16, cho phép khoảng 65,536 địa chỉ IP.
- Quan trọng cho việc cấu hình plugin mạng (như Calico, Flannel) sau này.
-control-plane-endpoint=
192.168.1.129:- Xác định địa chỉ IP hoặc hostname mà các thành phần khác sẽ sử dụng để kết nối tới control plane.
- Hữu ích khi bạn muốn thiết lập high availability cho control plane.
- Trong trường hợp này, 192.168.1.129 là địa chỉ IP của node master.
-cri-socket=unix:///run/containerd/containerd.sock
:- Chỉ định đường dẫn tới Unix socket của Container Runtime Interface (CRI).
- Đối với containerd, đường dẫn mặc định là
/run/containerd/containerd.sock
. - Nó cho kubeadm biết cần sử dụng containerd làm container runtime thay vì Docker.
Một số lỗi thường gặp
root@node-master:~# kubeadm init --pod-network-cidr=192.168.0.0/16 --control-plane-endpoint=192.168.1.129 --cri-socket=unix:///run/containerd/containerd.sock
I0905 11:00:19.609910 4406 version.go:256] remote version is much newer: v1.31.0; falling back to: stable-1.28
[init] Using Kubernetes version: v1.28.13
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
Hướng dẫn sửa một số lỗi thường gặp:
**** Lỗi: [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist**
Để sửa:
sudo modprobe br_netfilter
sudo sysctl net.bridge.bridge-nf-call-iptables=1
** Lỗi: [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
:
sudo sysctl net.ipv4.ip_forward=1
echo "net.bridge.bridge-nf-call-iptables=1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Sau khi sửa các lỗi trên thì chạy lại lệnh khởi tạo cluster ở trên.
Kết quả:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get po -A
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ả:
3. Thêm worker node vào cluster trên các node worker
Chạy lệnh sau để thêm node woker vào cluser
kubeadm join 192.168.1.129:6443 --token n25frf.tpys1y9a1hpsdrzy \
--discovery-token-ca-cert-hash sha256:39381c9cb504145058657e81dca874f2d0e378b97bda335ca31a489ffce81a10 \
--cri-socket=unix:///run/containerd/containerd.sock
Kết quả ở node woker:
Đợi 1 thời gian khoảng vài phút rồi quay lại node master để kiểm tra
kubectl get nodes
** Tài liệu tham khảo:
https://techmaster.vn/posts/37882/cach-khoi-tao-cum-kubernete-su-dung-kubeadm
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/install-containerd-on-ubuntu-22-04.html
All rights reserved