Chuyển đến nội dung chính
  1. Bài viết/

Mở đầu: câu chuyện về 2 cái server, port UDP và K3s

Hành trình dựng một cụm K3s hybrid cloud, bắt đầu từ một sự cố mạng dở khóc dở cười. Tài liệu thực chiến K3s từ con số 0, dành cho những ai ‘vô tình’ có 2 cái server.

Khởi nguồn của một cụm cluster bất đắc dĩ #

Mọi chuyện bắt đầu từ một sự cố có phần hơi… dở khóc dở cười.

Tôi có một dự án web cần deploy gấp. Thay vì lên mạng thuê VPS như bình thường, tôi nhắn tin cho một người anh trong ngành hỏi xem có server nào đang trống thì nhượng lại. Anh ấy quăng ngay thông tin một con server, nhiệt tình, không chút do dự.

Nhưng đời không như mơ. Trong lúc setup hạ tầng, tôi phát hiện con server này bị nhà mạng chặn hẳn kết nối UDP, cả chiều vào lẫn chiều ra. Khổ nỗi kiến trúc dự án của tôi bắt buộc phải dùng giao thức này.

Nói nhanh cho ai chưa quen: mạng máy tính có hai kiểu gửi dữ liệu phổ biến. TCP thì bắt tay đàng hoàng, mất gói thì gửi lại, đảm bảo tới nơi đủ và đúng thứ tự — đổi lại là chậm hơn. UDP thì bắn thẳng, không bắt tay, mất gói thì thôi — đổi lại là nhanh, nên hầu hết các giải pháp VPN hiện đại đều chạy trên UDP. Còn lý do nhà mạng hay khóa sẵn UDP thì cũng dễ hiểu: chính vì không cần bắt tay nên kẻ tấn công có thể giả mạo địa chỉ nguồn để dùng server của bạn khuếch đại một đợt DDoS nhắm vào người khác.

Không thể can thiệp từ phía hệ điều hành, anh bạn tôi đành tạo ticket gửi thẳng cho bộ phận kỹ thuật của nhà cung cấp để yêu cầu mở port, rồi ngồi chờ.

Dự án thì không chờ được. Tôi tặc lưỡi tự bỏ tiền túi mua luôn một con server mới tinh ở nhà cung cấp khác để chạy cho kịp tiến độ.

Sáng hôm sau, bộ phận kỹ thuật báo đã xử lý xong ticket. Nhưng họ chỉ mở UDP được cho dải IP trong nước, còn hướng bắn ra quốc tế vẫn chặn hoàn toàn.

Điều khiến tôi tá hỏa hơn cả là lúc đó tôi mới biết một sự thật: con server bị lỗi port tối qua không phải server cũ anh ấy có sẵn, mà là một con mới tinh anh ấy vừa âm thầm bỏ tiền túi mua thêm để cho tôi thuê. Và anh hoàn toàn không tính thêm bất kỳ chi phí nào, chỉ đơn thuần muốn giúp tôi cho kịp tiến độ.

Sự nhiệt tình của người anh em cộng với cái xui dính policy mạng ngay lúc đập hộp tạo ra một tình huống trớ trêu. Tất nhiên tôi không thể từ chối tấm lòng đó, đành nhận luôn.

Và thế là, từ một kẻ đang vã mồ hôi tìm chỗ chứa một cái web app, tôi đột nhiên nắm trong tay 2 con server.

Để một con gánh hết phần việc trong khi con kia cấu hình khủng nằm chơi là kiểu lãng phí không chấp nhận được. Trong đầu tôi lập tức nảy ra một kế hoạch: “Tại sao không nối hai cái máy này thành một cụm, để chúng cùng gánh tải, chia sẻ tài nguyên và dự phòng cho nhau?”

Đó chính là khởi nguồn của series này.

Tôi tìm đến Kubernetes — tiêu chuẩn vàng của hệ phân tán. Nhưng ngay ngày đầu triển khai, nó vả cho tôi một gáo nước lạnh vì quá nặng. Lý do nằm ở phần gọi là control plane: đây là bộ não của cụm, gồm các thành phần chịu trách nhiệm ghi nhớ trạng thái mong muốn và liên tục điều phối để hệ thống khớp với trạng thái đó. Nó chạy thường trực, và trên một VPS cỡ vừa thì nó ngốn gần hết RAM lẫn CPU, chẳng còn lại bao nhiêu chỗ cho chính ứng dụng cần chạy.

Giải pháp xuất hiện mang tên K3s — một bản Kubernetes đã được vắt kiệt mỡ thừa, gỡ bỏ các thành phần dành cho môi trường cloud quy mô lớn, gộp phần còn lại vào một file nhị phân duy nhất, nhưng vẫn giữ nguyên vẹn phần cốt lõi và tương thích với công cụ Kubernetes thông thường.

Đây là hành trình tôi bước từ thế giới Docker sang thế giới Kubernetes.

[!NOTE]

Dành cho anh em tò mò về kiến trúc thực tế tôi đã dựng để giải quyết bài toán mạng oái oăm trên:

  • Vì UDP bị chặn hướng quốc tế, kết nối VPN nội bộ rớt liên tục và buộc phải lùi về chạy trên TCP — vốn chậm hơn hẳn cho loại lưu lượng này. Nên tôi chọn Tailscale làm hạ tầng mạng lõi: nó dựng một mạng riêng ảo nối thẳng các máy với nhau bất kể chúng nằm ở đâu, và tự lo phần xuyên qua NAT lẫn firewall.
  • Để vượt rào và giảm độ trễ, tôi tự host luôn một DERP server ngay trên cụm K3s. DERP là máy chủ tiếp sức của Tailscale: khi hai máy không nối thẳng được với nhau, lưu lượng đi vòng qua nó — và tự host thì lưu lượng đi vòng qua máy của mình thay vì qua một server ở nửa vòng trái đất.
  • Sau khi mọi thứ thông suốt, tôi nối thẳng PC cá nhân ở nhà vào cluster này để gánh các tác vụ AI. Xài tạm GPU ở nhà giúp tiết kiệm một khoản lớn so với đi thuê ngoài.

Đúng vậy, một cụm hybrid cloud kết hợp VPS trên mây và phần cứng tại gia. Đây cũng là lần đầu tôi thực sự bắt tay nhào nặn Kubernetes cho một dự án cá nhân. Nên chuỗi bài này không chỉ là nhật ký kiến trúc, mà còn là bộ tài liệu thực chiến K3s từ con số 0, dành cho những ai vô tình cố ý có 2 cái server.