Bỏ qua đến nội dung chính
Về trang chủ
Tech tools-cli tools-selfhost 6 phút đọc

Đột Phá 💥 hay Lời Cảnh Báo ⚠️? Kỹ Sư ngrok 'Port' Kubernetes Lên Trình Duyệt Web Bằng AI: Câu Chuyện Về webernetes

Kỹ sư Sam Rose tại ngrok đã tạo ra webernetes, một phiên bản Kubernetes được 'port' một phần sang TypeScript để chạy trực tiếp trong trình duyệt web, sử dụng rộng rãi Mô hình Ngôn ngữ Lớn (LLM) nhưng kèm theo quy trình rà soát và kiểm thử nghiêm ngặt để đảm bảo chất lượng, mở ra tiềm năng lớn cho nội dung tương tác về Kubernetes.

Tier 2 · nguồn 99% độ tin cậy Auto-priority
Nguồn gốc ngrok.com

Sam Rose, Chuyên gia Giáo dục Phát triển cấp cao tại ngrok, vừa công bố một dự án đầy tham vọng mang tên webernetes 🌐 – một phần phiên bản của Kubernetes được 'port' sang TypeScript, cho phép các cụm chạy ngay trong trình duyệt web. Đây không chỉ là một thành tựu kỹ thuật đáng nể mà còn là một minh chứng sống động về khả năng và giới hạn của AI trong phát triển phần mềm.

Trong vòng hai tháng, Sam Rose đã tạo ra gần 100.000 dòng mã, trải rộng trên 629 tệp với 552 commit, tất cả đều được hỗ trợ bởi LLM. Webernetes, theo Sam, thực sự thực hiện nhiều chức năng cốt lõi của một cụm Kubernetes thực thụ: từ quản lý vòng đời pod, DNS và mạng cụm, thu gom rác container, cấp phát IP, đến theo dõi các DeploymentReplicaSet.

webernetes: Bản chất là gì? 🤔

Nhiều người lầm tưởng rằng Sam đã biên dịch Kubernetes sang WebAssembly (Wasm). Tuy nhiên, câu trả lời là không. Một chương trình Go “hello, world!” biên dịch sang Wasm đã nặng khoảng 540KiB (nén), trong khi webernetes chỉ nặng khoảng 140KiB (nén). Việc biên dịch toàn bộ Kubernetes sang Wasm sẽ tiêu tốn hàng megabyte dữ liệu và gặp phải các lỗi biên dịch do Kubernetes gọi các API cấp hệ thống không khả dụng trong trình duyệt.

Thay vào đó, webernetes là sự kết hợp của nhiều thành phần được port:

* Một phần của nhị phân kubelet của Kubernetes, đủ để chạy và thăm dò các pod. * Các phiên bản 'port' của nhiều bộ điều khiển (controllers) Kubernetes như bộ lập lịch pod, bộ điều khiển namespace, kube-proxy, bộ điều khiển triển khai, v.v. * Một giao diện mạng container (CNI) dựa trên trình duyệt, cho phép các pod giao tiếp với nhau qua một mạng mô phỏng. * Một runtime container dựa trên trình duyệt, mà kubelet tương tác qua Giao diện Runtime Container (CRI) để chạy các container. * Một API để tương tác với cụm webernetes, thực hiện các thao tác như áp dụng manifest và theo dõi tài nguyên.

Để giữ cho webernetes nhỏ gọn, nó không kéo các image thực từ Docker Hub hay các registry khác. Thay vào đó, nó có registry riêng dựa trên trình duyệt và bạn định nghĩa image bằng API TypeScript. Điều này làm cho webernetes trở thành một công cụ lý tưởng để tạo nội dung tương tác và mang tính giáo dục về Kubernetes, chứ không phải là một bản phân phối sẵn sàng cho sản xuất.

Chìa khóa để không 'ẩu tả': Rà soát thủ công và Kiểm thử toàn diện 🛠️

Việc gần như toàn bộ mã webernetes được tạo bởi LLM khiến nhiều người nghi ngờ về chất lượng của dự án. Tuy nhiên, Sam Rose mạnh mẽ khẳng định đây không phải là “sản phẩm mì ăn liền”. Anh đã thực hiện hai việc quan trọng:

1. Rà soát từng dòng mã: Đây là công đoạn tốn thời gian nhất nhưng giúp Sam tự tin rằng phần lớn mã nguồn giống hệt với mã gốc Go của Kubernetes. 2. Tạo hàng trăm bài kiểm thử: Các bài kiểm thử này đảm bảo hành vi của webernetes chính xác như một cụm Kubernetes thực tế.

#### Vì sao phải rà soát mã nguồn do LLM tạo ra? ⚠️

Sam thừa nhận rằng các LLM, dù mạnh mẽ, vẫn “kém trong việc port mã” và liên tục mắc lỗi. Các loại lỗi phổ biến mà anh gặp phải bao gồm:

* Lối tắt: Thay vì triển khai các cấu trúc cache phức tạp của Kubernetes (LRU, expiring, FIFO), LLM thường thay thế bằng Map đơn giản, dẫn đến sai lệch về hành vi. * Quá “hữu ích”: LLM tự ý tạo ra các hàm trợ giúp không tồn tại trong mã Go gốc, gây khó khăn cho việc rà soát song song và có thể ẩn chứa những khác biệt tinh tế. * Thiếu sót: Các trường hợp kiểm thử (table tests) thường bị LLM bỏ qua một cách tùy tiện, yêu cầu phải điều chỉnh liên tục.

Điều này nhấn mạnh rằng, để có độ tin cậy vào mã do LLM tạo ra, việc rà soát thủ công là không thể thiếu.

#### Kiểm thử: Bước xác nhận cuối cùng ✅

Để đảm bảo mã hoạt động đúng trong môi trường JavaScript khác biệt so với Go, Sam đã viết 204 bài kiểm thử tích hợp. Những bài kiểm thử này chạy cùng một mã nguồn trên cả webernetes và một cụm k3s (một phiên bản Kubernetes nhẹ), sử dụng API kubernetes-client/javascript chính thức để so sánh hành vi. Ngoài ra, webernetes còn có 1.855 bài kiểm thử đơn vị, phần lớn được 'port' trực tiếp từ mã nguồn Go của Kubernetes.

Sam cho biết, khi phát hiện lỗi, việc đầu tiên anh làm là tạo một bài kiểm thử chạy đúng trên k3s và sai trên webernetes. Vòng lặp phản hồi này giúp anh và LLM hiểu và sửa chữa vấn đề hiệu quả hơn.

Sức mạnh tổng hợp giữa Con người và AI 🤝

Sam tin rằng việc rà soát và kiểm thử kỹ lưỡng là đủ để đảm bảo chất lượng cho dự án do LLM tạo ra. Anh nhận định rằng LLM bổ trợ cho điểm yếu của con người một cách hoàn hảo: chúng không mệt mỏi, gõ rất nhanh, và có thể giúp tìm ra các trường hợp biên mà con người chưa nghĩ tới. Sự kết hợp giữa khả năng thẩm định và hiểu biết sâu sắc của con người với tốc độ và sự bền bỉ của LLM đã tạo ra một bước tiến lớn trong khả năng làm việc kể từ khi Sam bắt đầu sự nghiệp vào năm 2012.

#### Phân tích dữ liệu: Chi phí và Hiệu quả Token 📈

Dự án đã tạo ra khoảng 126.000 dòng mã (chưa bao gồm TypeScript, comment và ứng dụng demo là khoảng 100.000 dòng). Biểu đồ tiêu thụ token LLM cho thấy lượng cached input tokens khổng lồ, đặc biệt là trong tuần cuối cùng khi Sam giải quyết một vấn đề lớn về Deployments cho ứng dụng demo. Anh đã sử dụng chiến lược