Dev Box
Container lập trình trên cloud — VS Code trên trình duyệt (code-server), lưu trữ bền vững và mở cổng ứng dụng.
Dev Box là gì?
Dev Box là một container phát triển trên cloud có tính bền vững, chạy code-server — VS Code đầy đủ ngay trên trình duyệt. Mỗi box có ổ đĩa riêng (một PVC được mount tại /home/coder), một URL IDE riêng tư và một mật khẩu được sinh tự động. Bạn có thể khởi động và dừng nó theo nhu cầu, chạy terminal bên trong, và publish các port cho những ứng dụng bạn đang xây dựng.
Các tình huống sử dụng phổ biến:
- Một môi trường phát triển nhất quán, có thể chia sẻ, đi theo dự án của bạn — không cần cài đặt gì trên laptop.
- Chỉnh sửa code từ bất kỳ trình duyệt nào, kể cả máy tính bảng và những máy bị khóa cấu hình chặt.
- Chạy và xem trước một web app, API hay notebook và mở port của nó qua HTTPS.
- Build container image từ source của bạn bằng tính năng build của Registry.
IDE có thể truy cập tại https://<id>.ide.<project>.<base-domain>. Mức sử dụng CPU và bộ nhớ được tính vào quota dự án của bạn và được áp dụng bởi vòng lặp tính phí; ổ đĩa của box được tính vào quota Disk của dự án.
Điều kiện tiên quyết
- Một dự án (xem Dự án & IAM). Dev Box tồn tại bên trong một dự án duy nhất.
- Vai trò owner hoặc editor, hoặc quyền
devbox.admin, để tạo và quản lý các box. Các thành viên khác có thể xem nhưng không thể thay đổi chúng. - Còn đủ quota Disk và CPU / bộ nhớ cho kích thước bạn chọn (xem Tính phí).
Tạo một Dev Box
Trong console, mở dự án của bạn và vào Dev Box (route /<project>/devbox). Nhấn Create và điền vào:
- ID — một tên theo chuẩn DNS-1123 (chữ thường, chữ số và dấu gạch ngang, tối đa khoảng 40 ký tự). Nó trở thành một phần của host IDE và không thể thay đổi về sau.
- Storage size — ổ đĩa cho
/home/coder: 5, 10, 20 hoặc 50 Gi. - Giới hạn CPU / bộ nhớ (tùy chọn) — giới hạn tài nguyên cho container.
Bạn cũng có thể tạo một box qua API bằng một lệnh POST:
curl -X POST \
https://api.<base-domain>/projects/<project>/devboxes \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": "my-box",
"storageSize": "10Gi",
"resources": { "cpu": "2", "memory": "4Gi" }
}'Phần thân (body) của request chấp nhận:
| Field | Type | Description |
|---|---|---|
id | string | Tên theo chuẩn DNS-1123, duy nhất trong dự án, ≤ ~40 ký tự. Bắt buộc. |
storageSize | string | Kích thước PVC như "5Gi", "10Gi", "20Gi" hoặc "50Gi". Được tính vào quota Disk của dự án. |
resources.cpu | string | Giới hạn CPU tùy chọn, ví dụ "2" (số core) hoặc "500m". Một số trần ở đây nghĩa là số core. |
resources.memory | string | Giới hạn bộ nhớ tùy chọn. BẮT BUỘC kèm đơn vị, ví dụ "4Gi". Một số "4" trần nghĩa là 4 byte. |
Chọn dung lượng lưu trữ và tài nguyên
Chọn dung lượng lưu trữ dựa trên những gì bạn sẽ giữ trong /home/coder — các repo, dependency (node_modules, virtualenv), cache build và mọi dữ liệu. Ổ đĩa được định kích thước một lần lúc tạo.
Dung lượng lưu trữ không thể thu nhỏ
Bạn có thể yêu cầu một volume lớn hơn về sau, nhưng không bao giờ thu nhỏ được ổ đĩa của Dev Box. Hãy bắt đầu một cách dè dặt (5 hoặc 10 Gi) và chỉ tăng khi cần.Giới hạn tài nguyên BẮT BUỘC phải có đơn vị
Luôn kèm đơn vị cho bộ nhớ (và cho CPU dưới một core): dùng4Gi, chứ không phải 4. Kubernetes đọc một số 4 trần là 4 byte, nên pod không bao giờ schedule được và box bị kẹt ở trạng thái Provisioning. CPU có thể là số core nguyên (2) hoặc millicore (500m).Mở IDE
Trang chi tiết (/<project>/devbox/<dbid>) có tab Overview hiển thị trạng thái, tài nguyên, URL IDE và mật khẩu. Mở IDE trong cửa sổ mới từ đó, hoặc truy cập trực tiếp tới:
https://<id>.ide.<project>.<base-domain>code-server hỏi mật khẩu của box ở lần tải đầu tiên. Trình soạn thảo của bạn mở tại /home/coder/project. Box phải ở trạng thái Running thì IDE mới phản hồi.
Mật khẩu
Mỗi box được bảo vệ bằng một mật khẩu sinh ngẫu nhiên lưu trong một Secret. Trên tab Overview bạn có thể hiện nó (để dán vào màn hình đăng nhập code-server) và tạo lại nó.
# reveal the current password
curl https://api.<base-domain>/projects/<project>/devboxes/<dbid>/password \
-H "Authorization: Bearer $TOKEN"
# => { "password": "..." }
# generate a new one (restarts the pod)
curl -X POST \
https://api.<base-domain>/projects/<project>/devboxes/<dbid>/password \
-H "Authorization: Bearer $TOKEN"Khởi động, dừng & vòng đời provisioning
Một Dev Box có thể được khởi động và dừng từ phần header trang chi tiết. Dừng sẽ scale nó về không pod (giải phóng CPU/bộ nhớ nhưng vẫn giữ ổ đĩa và host IDE). Khởi động đưa pod duy nhất trở lại. Phase phản ánh trạng thái hiện tại:
| Phase | Ý nghĩa |
|---|---|
Stopped | Bạn đã dừng box; số replica là 0. Ổ đĩa và mật khẩu được giữ nguyên. |
Provisioning | Pod đang khởi động (hoặc volume đang bind). IDE chưa sẵn sàng. |
Running | Pod đã sẵn sàng và IDE phản hồi. |
Suspended | Vòng lặp tính phí đã dừng box vì dự án vượt quota CPU/bộ nhớ. |
Khởi động hoặc dừng qua API bằng cách patch cờ running:
curl -X PATCH \
https://api.<base-domain>/projects/<project>/devboxes/<dbid> \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "running": false }'Cùng endpoint PATCH này cũng thay đổi kích thước tài nguyên — gửi một object resources (nhớ kèm đơn vị) để đổi giới hạn CPU hoặc bộ nhớ.
Terminal trên web (CLI)
Tab CLI cho bạn một terminal ngay trong trình duyệt — một phiên xterm kết nối qua WebSocket thẳng vào pod của box. Bạn nhận được:
- Nhiều tab terminal vào cùng một box.
- Tải lên và tải xuống file đến và từ pod.
- Một nút mở trong cửa sổ mới để có terminal toàn màn hình.
Dùng nó cho git, cài đặt package, chạy các lệnh build, hay bất cứ thứ gì bạn làm trong một shell. Box phải ở trạng thái Running thì terminal mới kết nối được.
Mở các port ứng dụng
Khi chạy một ứng dụng bên trong box, hãy bind nó vào 0.0.0.0:<port> (không phải localhost) để nền tảng có thể định tuyến tới nó. Trên tab Expose, thêm một expose service với một ID và port mà ứng dụng của bạn lắng nghe. Nền tảng publish nó qua HTTPS tại:
https://<sid>.<id>.ide.<project>.<base-domain>trong đó <sid> là ID của expose và <id> là ID của box. Thêm hoặc xóa expose bất cứ lúc nào; xóa một cái sẽ dọn route của nó. Expose có thể được cấu hình ngay cả khi box đang dừng — chúng có hiệu lực khi box chạy.
# list exposes
curl https://api.<base-domain>/projects/<project>/devboxes/<dbid>/exposes \
-H "Authorization: Bearer $TOKEN"
# publish port 8080 under the id "web"
curl -X POST \
https://api.<base-domain>/projects/<project>/devboxes/<dbid>/exposes \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "id": "web", "port": 8080 }'
# remove an expose
curl -X DELETE \
https://api.<base-domain>/projects/<project>/devboxes/<dbid>/exposes/web \
-H "Authorization: Bearer $TOKEN"| Field | Type | Description |
|---|---|---|
id | string | Tên an toàn DNS cho expose, duy nhất trong box. Trở thành nhãn host ngoài cùng bên trái. |
port | int | Port mà ứng dụng của bạn bind bên trong box, 1–65535. Được định tuyến như target port. |
ip | string | Tùy chọn, chỉ lưu để tham khảo; định tuyến dùng selector của pod box. |
Lưu trữ bền vững
Ổ đĩa của box là một volume ReadWriteOnce được mount tại /home/coder. Nó không bao giờ bị xóa khi dừng hay khởi động lại — các file, công cụ đã cài và cấu hình của bạn vẫn tồn tại qua các chu kỳ khởi động/dừng, việc tạo lại mật khẩu và các lần suspend do tính phí. Volume chỉ bị xóa khi bạn xóa Dev Box.
/home/coder (thư mục dự án mặc định là /home/coder/project). Bất cứ thứ gì ghi ra ngoài đường dẫn đó — ví dụ các bản cài đặt cấp hệ thống trong /usr — sẽ mất khi pod khởi động lại. Mức dùng đĩa được đo bằng du bên trong pod.Build image từ code của bạn
Dev Box là nơi tự nhiên để phát triển một service rồi đưa nó ra thực tế. Khi code của bạn build và chạy được trong box, dùng tính năng build của Registry để biến source đó thành một container image trong registry riêng tư của dự án. Từ đó bạn có thể triển khai nó như một function Kinetic. Xem tài liệu Registry để biết cấu hình build và pull secret.
Tham chiếu API
Tất cả endpoint nằm dưới nhóm project và yêu cầu một bearer token. Các endpoint đọc mở cho mọi thành viên dự án; các thao tác ghi yêu cầu vai trò owner/editor hoặc devbox.admin.
| Method & path | Mục đích |
|---|---|
GET /projects/{id}/devboxes | Liệt kê các Dev Box (id, storage, cpu/bộ nhớ, running, phase, url, exposeCount). |
POST /projects/{id}/devboxes | Tạo một box (id, storageSize, resources tùy chọn). |
GET /projects/{id}/devboxes/{dbid} | Lấy một box: url, phase, resources, storageSize, exposes. |
PATCH /projects/{id}/devboxes/{dbid} | Khởi động/dừng (running) hoặc thay đổi kích thước tài nguyên. |
DELETE /projects/{id}/devboxes/{dbid} | Xóa box, ổ đĩa và Secret mật khẩu của nó. |
GET /projects/{id}/devboxes/{dbid}/password | Hiện mật khẩu hiện tại. |
POST /projects/{id}/devboxes/{dbid}/password | Tạo lại mật khẩu (khởi động lại pod). |
GET/POST /projects/{id}/devboxes/{dbid}/exposes | Liệt kê hoặc thêm expose. |
DELETE …/exposes/{sid} | Xóa một expose. |
# list every Dev Box in the project
curl https://api.<base-domain>/projects/<project>/devboxes \
-H "Authorization: Bearer $TOKEN"
# get one box, including its url and exposes
curl https://api.<base-domain>/projects/<project>/devboxes/<dbid> \
-H "Authorization: Bearer $TOKEN"
# delete the box (disk + password are removed too)
curl -X DELETE \
https://api.<base-domain>/projects/<project>/devboxes/<dbid> \
-H "Authorization: Bearer $TOKEN"{
"id": "my-box",
"storageSize": "10Gi",
"cpu": "2",
"memory": "4Gi",
"running": true,
"suspended": false,
"phase": "Running",
"url": "https://my-box.ide.<project>.<base-domain>",
"exposeCount": 1
}Tính phí & quota
Một Dev Box đang chạy tiêu thụ CPU và bộ nhớ được tính vào quota dự án của bạn, được lấy mẫu liên tục khi nó chạy. Yêu cầu ổ đĩa của nó được tính vào quota Disk của dự án — volume bị giới hạn cứng lúc tạo, và thanh disk trên trang Tính phí phản ánh tổng dung lượng đã cam kết.
Tự động suspend khi vượt quota
Nếu dự án vượt quota CPU hoặc bộ nhớ, vòng lặp tính phí sẽ suspend tài nguyên dùng nhiều nhất cho đến khi bạn trở lại dưới quota — và đó có thể là một Dev Box. Một box bị suspend hiển thị phaseSuspended với 0 replica; nó tự động được khôi phục khi mức dùng giảm xuống dưới quota. Hãy nâng quota hoặc dừng các workload khác để tránh điều này. Xem Tính phí để biết chi tiết.Xử lý sự cố
Kẹt ở Provisioning
Hầu như luôn là một giới hạn tài nguyên không có đơn vị. Một giới hạn bộ nhớ là4 nghĩa là 4 byte, nên pod không bao giờ schedule được. Hãy sửa box và đặt một đơn vị thật (4Gi), rồi khởi động lại. Cũng nên xác nhận dự án còn quota Disk trống — một yêu cầu volume vượt quota sẽ bị từ chối.IDE trả về 502 / 503
Một lỗi 502 ngay sau khi khởi động thường nghĩa là pod chưa Ready — hãy đợi phase đạtRunning rồi tải lại. Một lỗi 503 dai dẳng nghĩa là box đang Stopped hoặc Suspended: hãy khởi động nó, hoặc giải quyết tình trạng vượt quota.Một ứng dụng đã expose không truy cập được
Đảm bảo ứng dụng của bạn bind0.0.0.0:<port> chứ không phải 127.0.0.1, rằng port của expose khớp, và rằng box đang Running.Mẹo
- Dừng các box bạn không dùng — một box đã dừng giải phóng quota CPU/bộ nhớ trong khi vẫn giữ tất cả file của bạn.
- Giữ mọi thứ quan trọng dưới
/home/coderđể nó tồn tại qua các lần khởi động lại. - Dùng tính năng tải lên/tải xuống của tab CLI để chuyển file nhanh thay vì commit các file dùng một lần vào git.
- Bind các dev server vào
0.0.0.0ngay từ đầu để việc expose một port chỉ còn một cú nhấp. - Khi một service sẵn sàng đưa ra thực tế, hãy build nó vào Registry và triển khai với Kinetic.