0
0
Lập trình
Admin Team
Admin Teamtechmely

Hành Trình Thiết Lập Cụm Kubernetes Trên Ubuntu 24.04

Đăng vào 1 tháng trước

• 6 phút đọc

Hành Trình Thiết Lập Cụm Kubernetes Trên Ubuntu 24.04

Hoặc: Cách tôi học được rằng đôi khi khởi động lại là giải pháp tốt nhất

Thiết lập Kubernetes lẽ ra phải đơn giản, đúng không? Tuy nhiên, như tôi đã phát hiện hôm nay, thực tế có những kế hoạch khác. Đây là hành trình khắc phục sự cố của tôi khi thiết lập cụm Kubernetes hai nút trên Ubuntu 24.04, bao gồm tất cả các rào cản mà tôi gặp phải và cách khắc phục chúng.

Vấn Đề Ban Đầu: Vấn Đề Với Kho Gói

Rào cản đầu tiên của tôi xuất hiện ngay khi cố gắng cài đặt kubectlkubelet:

Copy
sudo apt install kubectl kubelet kubeadm
# Lỗi: không tìm thấy chương trình kubectl và kubelet

Cách Khắc Phục: Cập Nhật URL Kho Gói

Vấn đề là Google đã thay đổi URL kho gói của họ vào năm 2024, nhưng nhiều hướng dẫn vẫn tham chiếu đến các URL cũ packages.cloud.google.com. Đây là cách chính xác cho Ubuntu 24.04:

Copy
# Xóa bất kỳ mục kho cũ nào
sudo rm -f /etc/apt/sources.list.d/kubernetes.list
sudo rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Thêm kho Kubernetes chính thức hiện tại
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

# Thêm khóa GPG chính thức (lưu ý URL đã cập nhật)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Thêm kho

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

# Cập nhật và cài đặt
sudo apt-get update
sudo apt-get install -y kubectl kubelet kubeadm
sudo apt-mark hold kubelet kubeadm kubectl

Vấn Đề Thứ Hai: Nhầm Lẫn Socket CRI

Khi chạy kubeadm init, tôi gặp:

Copy
error: define which one you wish to use by setting crisocket field for kubeadm

Điều này xảy ra khi bạn có nhiều runtime container được cài đặt. Ubuntu 24.04 có thể có cả Docker và containerd.

Cách Khắc Phục: Chọn Runtime Container Của Bạn

Tôi đã chọn containerd (được khuyến nghị cho Kubernetes hiện đại):

Copy
# Cài đặt và cấu hình containerd
sudo apt-get install -y containerd

# Tạo cấu hình đúng với CRI được kích hoạt
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# Đảm bảo plugin CRI không bị vô hiệu hóa
sudo sed -i 's/disabled_plugins = \["cri"\]/disabled_plugins = []/g' /etc/containerd/config.toml

# Kích hoạt và khởi động
sudo systemctl enable --now containerd

# Sử dụng socket CRI rõ ràng
sudo kubeadm init --cri-socket unix:///var/run/containerd/containerd.sock

Vấn Đề Thứ Ba: Lỗi API Runtime CRI v1

Ngay cả sau khi cài đặt containerd, tôi vẫn gặp:

Copy
failed to create new CRI runtime service: validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService

Cách Khắc Phục: Cấu Hình Containerd Đúng Cách

Cấu hình mặc định của containerd đôi khi có plugin CRI bị vô hiệu hóa. Chìa khóa là tạo một cấu hình đúng:

Copy
# Dừng containerd
sudo systemctl stop containerd

# Xóa cấu hình xấu
sudo rm /etc/containerd/config.toml

# Tạo cấu hình đúng
sudo containerd config default | sudo tee /etc/containerd/config.toml

# Kích hoạt SystemdCgroup (cần thiết cho Ubuntu 24.04)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# Đảm bảo plugin CRI được kích hoạt
grep -A5 -B5 disabled_plugins /etc/containerd/config.toml

# Khởi động lại
sudo systemctl start containerd

Kiểm tra với:

Copy
sudo crictl version

Vấn Đề Thứ Tư: Vấn Đề Giải Quyết Tên Máy Tính

Trong quá trình kubeadm init, tôi gặp lỗi về kubelet không thể truy cập tên máy tính. Ubuntu 24.04 thiết lập giải quyết tên máy tính với:

  • 127.0.0.1 cho localhost
  • 127.0.1.1 cho tên máy của bạn

Nhưng 127.0.1.1 không thể truy cập từ các máy khác!

Cách Khắc Phục: Sử Dụng Địa Chỉ IP Mạng Thực

Copy
# Tìm địa chỉ IP mạng thực của bạn
ip route get 8.8.8.8 | grep -oP 'src \K\S+'

# Cập nhật /etc/hosts để sử dụng IP thực thay vì 127.0.1.1
sudo sed -i 's/127.0.1.1/192.168.1.244/' /etc/hosts

# Khởi tạo với IP thực của bạn
sudo kubeadm init --cri-socket unix:///var/run/containerd/containerd.sock --apiserver-advertise-address=192.168.1.244

Vấn Đề Thứ Năm: Cổng Đã Được Sử Dụng

Ngay cả sau khi kubeadm reset, tôi vẫn gặp lỗi "cổng 6443 đang được sử dụng".

Cách Khắc Phục: Dọn Dẹp Kỹ Lưỡng

Copy
# Reset với socket CRI được chỉ định
sudo kubeadm reset --force --cri-socket unix:///var/run/containerd/containerd.sock

# Dọn dẹp mọi thứ
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/etcd/
sudo rm -rf /var/lib/kubelet/
sudo rm -rf ~/.kube/
sudo rm -rf /etc/cni/net.d/

# Đặt lại iptables
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo iptables -X

# Giết bất kỳ tiến trình nào đang treo
sudo pkill -f kube-apiserver
sudo pkill -f etcd
sudo pkill -f kubelet

# Khởi động lại các dịch vụ
sudo systemctl restart containerd
sudo systemctl restart kubelet

Vấn Đề Thứ Sáu: Kết Nối Mạng Nút Làm Việc

Khi cố gắng tham gia nút làm việc của tôi, tôi gặp:

Copy
error execution phase preflight: couldn't validate the identity of the API server - failed to request cluster info configmap: the client timed out waiting for headers

Nút làm việc không thể truy cập được control plane, mặc dù tôi đã sử dụng địa chỉ IP đúng.

Nguyên Nhân Căn Bản: Độ Phức Tạp Mạng

Đây là nơi mọi thứ trở nên phức tạp. Tôi có:

  • Tailscale chạy trên control plane nhưng không phải trên nút làm việc
  • Các vấn đề tường lửa có thể xảy ra
  • Những phức tạp về mạng VM

Giải Pháp Cuối Cùng: Đôi Khi Khởi Động Lại Là Tốt Nhất

Sau nhiều giờ gỡ lỗi kết nối mạng, xung đột runtime container và các vấn đề cấu hình, tôi nhận ra một điều quan trọng: không sao nếu bắt đầu lại.

Thay vì tiếp tục gỡ lỗi một thiết lập phức tạp với nhiều phần chuyển động, cách tiếp cận tốt hơn là:

  1. Bắt đầu với một VM sạch
  2. Thiết lập Tailscale trước (trước bất kỳ thành phần Kubernetes nào)
  3. Sử dụng một runtime container duy nhất ngay từ đầu
  4. Sử dụng IP Tailscale cho tất cả giao tiếp cụm

Điều này loại bỏ:

  • Các vấn đề định tuyến mạng
  • Các phức tạp về tường lửa
  • Nhầm lẫn về địa chỉ IP
  • Các xung đột runtime container

Những Bài Học Quan Trọng

  1. Google đã thay đổi URL kho Kubernetes vào năm 2024 - sử dụng các URL mới pkgs.k8s.io
  2. Ubuntu 24.04 cần kích hoạt SystemdCgroup cho containerd
  3. Luôn chỉ định socket CRI khi bạn có nhiều runtime container
  4. Sử dụng địa chỉ IP mạng thực của bạn, không phải 127.0.1.1 cho các cụm nhiều nút
  5. Dọn dẹp kỹ lưỡng là điều cần thiết khi đặt lại kubeadm
  6. Các vấn đề kết nối mạng là khó gỡ lỗi nhất - hãy xem xét sử dụng mạng overlay như Tailscale ngay từ đầu
  7. Bắt đầu lại với một kế hoạch tốt hơn là sửa chữa một thiết lập rối ren

Bài Học Quan Trọng Nhất

Đừng cảm thấy tồi tệ khi bắt đầu lại! Kubernetes có đường cong học tập dốc, và các vấn đề mạng có thể thực sự phức tạp ngay cả với các nhà phát triển có kinh nghiệm. Đôi khi con đường nhanh nhất đến thành công là một tờ giấy trắng với những bài học đã học.

Việc làm cho control plane hoạt động (mà tôi đã làm!) thực sự là phần khó nhất. Việc tham gia nút làm việc nên đơn giản khi mạng đã được sắp xếp đúng cách.


Bạn đã gặp phải những thách thức thiết lập Kubernetes tương tự chưa? Rào cản lớn nhất của bạn là gì? Hãy chia sẻ trải nghiệm của bạn trong phần bình luận!

Thẻ

kubernetes #ubuntu #devops #khắcphục #containerization #mạng

Nội dung bài viết

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào