Công nghệ IT
Hướng dẫn cài đặt Kubernetes Master-Node trên Ubuntu 24.04.2
imageimage
Thoại Kỳ
08-07-2025
37 lượt xem

Hướng dẫn cài đặt Kubernetes Master-Node trên Ubuntu 24.04.2 bằng Script

Bộ hướng dẫn này cung cấp các script tự động để thiết lập một cụm Kubernetes cơ bản gồm một Master và một Node trên các máy ảo Ubuntu 24.04.2. Quá trình này được chia thành ba giai đoạn chính, mỗi giai đoạn được thực hiện thông qua một shell script riêng biệt nhằm đảm bảo sự rõ ràng và hiệu quả.

🥇Chuẩn bị:

Bạn sẽ cần tạo 3 file trên (hoặc trực tiếp trên các máy ảo và sau đó copy giữa chúng):

  • -common_setup.sh: Chứa tất cả các lệnh chuẩn bị ban đầu cần chạy trên cả Master và Node.
  • -master_setup.sh: Chứa các lệnh dành riêng cho việc khởi tạo Master (chỉ chạy trên máy Master).
  • -node_join.sh: Chứa các lệnh để Node tham gia vào cluster (chỉ chạy trên máy Node).

🥈 Quy trình thực thi:

1.common_setup.sh(Chạy trên cả Master và Node)

Tạo file này và dán nội dung sau vào:

#!/bin/bash

# --- BẮT ĐẦU SCRIPT CHUẨN BỊ CHUNG CHO KUBERNETES ---

echo "Đang bắt đầu quá trình chuẩn bị chung cho Kubernetes..."

# 1. Cập nhật hệ thống
echo "1. Cập nhật hệ thống..."
sudo apt update -y
sudo apt upgrade -y

# 2. Tắt Swap
echo "2. Tắt Swap..."
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 3. Vô hiệu hóa Firewall (UFW)
echo "3. Vô hiệu hóa Firewall (UFW)..."
sudo ufw disable

# 4. Vô hiệu hóa SELinux (hoặc AppArmor)
echo "4. Vô hiệu hóa AppArmor..."
sudo systemctl disable apparmor --now
sudo apt purge apparmor -y

# 5. Cấu hình Sysctl cho Kubernetes
echo "5. Cấu hình Sysctl cho Kubernetes..."
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

# 6. Cài đặt Container Runtime (Containerd)
echo "6. Cài đặt Container Runtime (Containerd)..."
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=\"$(dpkg --print-architecture)\" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  \"$(. /etc/os-release && echo "$VERSION_CODENAME")\" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y containerd.io

sudo containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

sudo systemctl restart containerd
sudo systemctl enable containerd

# 7. Thêm kho lưu trữ Kubernetes và cài đặt kubeadm, kubelet, kubectl
echo "7. Thêm kho lưu trữ Kubernetes và cài đặt kubeadm, kubelet, kubectl..."
sudo apt update
sudo apt install -y apt-transport-https
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

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

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

echo "--- QUÁ TRÌNH CHUẨN BỊ CHUNG ĐÃ HOÀN TẤT ---"
echo "Vui lòng đặt hostname và chỉnh sửa /etc/hosts thủ công, sau đó REBOOT máy!"

2.master_setup.sh (Chỉ chạy trên Master)

Quan trọng: Trước khi chạy script này, bạn cần ĐẶT HOSTNAME cho Master (k8s-master) và CHỈNH SỬA /etc/hosts trên Master để có IP của Master và Node. Sau đó, ĐẢM BẢO BẠN ĐÃ KHỞI ĐỘNG LẠI MÁY MASTER SAU KHI CHẠY common_setup.sh.

Tạo file này và dán nội dung sau vào:

#!/bin/bash

# --- BẮT ĐẦU SCRIPT CÀI ĐẶT MASTER KUBERNETES ---

echo "Đang khởi tạo Kubernetes Master..."

# Khởi tạo kubeadm. Ghi lại lệnh kubeadm join được xuất ra!
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 2. Cấu hình Kubectl cho người dùng thông thường
echo "2. Cấu hình Kubectl cho người dùng hiện tại..."
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 3. Cài đặt Pod Network Add-on (CNI - Flannel)
echo "3. Cài đặt Pod Network Add-on (Flannel)..."
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

echo "--- QUÁ TRÌNH CÀI ĐẶT MASTER ĐÃ HOÀN TẤT ---"
echo "Kiểm tra trạng thái các Pods và Nodes:"
echo "kubectl get pods -n kube-system"
echo "kubectl get nodes"
echo ""
echo "!!! QUAN TRỌNG: LƯU LẠI LỆNH 'kubeadm join' ĐƯỢC IN RA KHI CHẠY 'kubeadm init' Ở TRÊN !!!"
echo "Bạn sẽ cần lệnh đó để tham gia Node vào cluster."

Nhớ thay thế <Địa_chỉ_IP_của_Master> bằng IP thực tế của máy Master của bạn.

3. node_join.sh (Chỉ chạy trên Node)

Quan trọng: Trước khi chạy script này, bạn cần ĐẶT HOSTNAME cho Node (k8s-node) và CHỈNH SỬA /etc/hosts trên Node để có IP của Master và Node. Sau đó, ĐẢM BẢO BẠN ĐÃ KHỞI ĐỘNG LẠI MÁY NODE SAU KHI CHẠY common_setup.sh.

Tạo file này và dán nội dung sau vào:

#!/bin/bash

# --- BẮT ĐẦU SCRIPT THAM GIA NODE VÀO KUBERNETES CLUSTER ---

echo "Đang chuẩn bị tham gia Node vào Kubernetes Cluster..."

# Lệnh 'kubeadm join' được lấy từ output của 'kubeadm init' trên Master.
# THAY THẾ DÒNG DƯỚI ĐÂY BẰNG LỆNH THỰC TẾ CỦA BẠN!
# Ví dụ: sudo kubeadm join 192.168.76.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
KUBEADM_JOIN_COMMAND="<THAY_THẾ_LỆNH_KUBEADM_JOIN_CỦA_BẠN_TẠI_ĐÂY>"

if [ "$KUBEADM_JOIN_COMMAND" = "<THAY_THẾ_LỆNH_KUBEADM_JOIN_CỦA_BẠN_TẠI_ĐÂY>" ]; then
    echo "LỖI: Bạn cần thay thế placeholder trong node_join.sh bằng lệnh 'kubeadm join' thực tế từ Master."
    exit 1
fi

echo "Đang thực thi lệnh tham gia Node: $KUBEADM_JOIN_COMMAND"
sudo $KUBEADM_JOIN_COMMAND

echo "--- QUÁ TRÌNH THAM GIA NODE ĐÃ HOÀN TẤT ---"
echo "Vui lòng kiểm tra trạng thái Node từ máy Master bằng lệnh: kubectl get nodes"

Quan trọng: Bạn phải thay thế dòng KUBEADM_JOIN_COMMAND="..." bằng lệnh kubeadm join thực tế mà bạn nhận được khi chạy kubeadm init trên máy Master.

4. Kiểm tra Cluster (trên Master):

Sau khi Node đã tham gia, quay lại máy Master.

Kiểm tra trạng thái Node:

kubectl get nodes

Bạn sẽ thấy cả hai Node (Master và Worker) đều ở trạng thái Ready.

Xoá Sạch Kubernetes và Mọi Dữ liệu Liên Quan

Bạn cần thực hiện các bước sau trên TẤT CẢ CÁC NODE mà bạn muốn xóa Kubernetes

Bước 1: Reset Kubernetes Components

Lệnh kubeadm reset sẽ dừng các dịch vụ Kubernetes và cố gắng dọn dẹp cấu hình.

sudo kubeadm reset -f

kubeadm reset: Khởi động lại các thành phần Kubernetes về trạng thái ban đầu.

-f (force): Buộc reset mà không cần xác nhận.

Bước 2: Gỡ bỏ các gói Kubernetes

Sử dụng apt purge để gỡ bỏ các gói Kubernetes và các file cấu hình liên quan của chúng. autoremove sẽ loại bỏ các gói phụ thuộc không còn cần thiết.

sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni
sudo apt-get autoremove -y

Bước 3: Xóa Dữ liệu và Thư mục Cấu hình Còn Sót Lại

Đây là bước cực kỳ quan trọng để đảm bảo không còn bất kỳ dấu vết nào của cài đặt cũ có thể gây ra xung đột trong tương lai.

# Xóa thư mục cấu hình chính của Kubernetes
sudo rm -rf /etc/kubernetes/

# Xóa dữ liệu và cấu hình của Kubelet
sudo rm -rf /var/lib/kubelet/*

# Xóa cấu hình của Container Network Interface (CNI)
sudo rm -rf /etc/cni/net.d/*

# Xóa dữ liệu của Etcd (CHỈ LÀM TRÊN NODE MASTER CŨ NẾU BẠN MUỐN XÓA HOÀN TOÀN TRẠNG THÁI CỤM)
# Nếu bạn đang dọn dẹp worker node hoặc không muốn mất dữ liệu etcd trên master, bỏ qua lệnh này.
sudo rm -rf /var/lib/etcd

# Xóa cấu hình kubectl cho người dùng hiện tại
sudo rm -rf $HOME/.kube

Bước 4: Xóa Container Runtime và Dữ liệu của nó (Tùy chọn)

Nếu bạn muốn xóa sạch cả Docker/containerd và mọi image, container, volume đã tạo, hãy thực hiện bước này. Nếu bạn muốn giữ lại runtime để sử dụng cho mục đích khác ngoài Kubernetes, bạn có thể bỏ qua.

Chọn một trong hai tùy thuộc vào Container Runtime bạn đang sử dụng:

Nếu bạn dùng containerd:

sudo systemctl stop containerd
sudo apt-get purge -y containerd.io
sudo rm -rf /var/lib/containerd

Nếu bạn dùng Docker:

sudo systemctl stop docker
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker

Bước 5: Xóa các Quy tắc IPTables

Các quy tắc tường lửa cũ do Kubernetes hoặc CNI tạo ra có thể tồn tại và gây ra lỗi mạng cho các cài đặt mới.

sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t raw -F && sudo iptables -t mangle -F
sudo iptables -X && sudo iptables -t nat -X && sudo iptables -t raw -X && sudo iptables -t mangle -X

Bước 6: Kiểm tra và Tắt Swap

Kubernetes yêu cầu swap phải được tắt. Hãy chắc chắn nó đã bị tắt và được vô hiệu hóa vĩnh viễn trong /etc/fstab.

sudo swapoff -a
# Vô hiệu hóa swap vĩnh viễn trong /etc/fstab
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Bước 7: Xóa thủ công file nhị phân kubectl (nếu có):

Hãy tìm xem kubectl đang ở đâu và xóa nó.

which kubectl # Tìm đường dẫn của kubectl
# Ví dụ: nếu nó trả về /usr/local/bin/kubectl, thì xóa nó
sudo rm -f $(which kubectl)

Bước 8: Khởi động lại Máy chủ

Đây là bước cuối cùng và rất quan trọng để đảm bảo tất cả các thay đổi được áp dụng hoàn toàn và mọi tiến trình cũ đã dừng.

sudo reboot

Sau khi bạn đã thực hiện tất cả các bước này trên mọi node mà bạn muốn xóa Kubernetes, các node của bạn sẽ hoàn toàn sạch sẽ và sẵn sàng cho một cài đặt mới từ đầu.