+2

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.

image.png

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.
</aside>

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ả: image 1.png

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

image 2.png

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ả: image 3.png

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:

image 4.png

Đợi 1 thời gian khoảng vài phút rồi quay lại node master để kiểm tra

kubectl get nodes

image 5.png

** 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí