Dự án & IAM
Dự án, thành viên, tài khoản dịch vụ, khoá API và vai trò — nền tảng cho mọi dịch vụ.
Dự án là gì?
Một dự án là đơn vị cô lập và sở hữu cơ bản trong Mikademy Cloud — tương đương với một project trên GCP hay một tài khoản AWS. Mọi dịch vụ khác (Kinetic, Dev Box, Bucket, Engines và Registry) đều tạo tài nguyên của mình bên trong một dự án, và việc tính phí cùng hạn ngạch được theo dõi theo từng dự án.
Một dự án mang lại cho bạn ba điều:
- Sự cô lập — mỗi dự án được hậu thuẫn bởi namespace Kubernetes riêng của nó,
project-<project-id>, nên workload, secret và mạng được tách biệt khỏi các dự án khác. - Hạn ngạch (quota) — một
ResourceQuotagiới hạn lượng CPU, bộ nhớ và dung lượng đĩa mà namespace có thể tiêu thụ, nên một dự án không bao giờ làm cạn tài nguyên của dự án khác. - Kiểm soát truy cập (IAM) — thành viên, tài khoản dịch vụ và vai trò đều được giới hạn trong phạm vi dự án. Ai được làm gì được quyết định ở đây, một lần, cho mọi dịch vụ.
id của dự án do bạn chọn, là duy nhất trên toàn hệ thống, và không thể thay đổi sau khi đã tạo. Nó là một nhãn DNS-1123 —^[a-z]([-a-z0-9]*[a-z0-9])?$, tối đa 30 ký tự — bởi vì nó trở thành một phần của tên namespace và của mọi URL trong console. displayName thân thiện với con người có thể được đổi bất kỳ lúc nào.
Tạo một dự án
Bất kỳ ai cũng có thể tự tạo dự án. Từ console, mở bộ chuyển dự án ở thanh trên cùng và chọn Create project, rồi cung cấp:
| Field | Type | Description |
|---|---|---|
id | string | id duy nhất, không thể thay đổi của bạn. Nhãn DNS-1123, ≤ 30 ký tự. Trở thành hậu tố của namespace. |
displayName | string | Tên thân thiện hiển thị khắp console. Có thể chỉnh sửa sau. |
Người gọi tạo ra dự án sẽ tự động trở thành chủ sở hữu của nó. Một dự án tự tạo được cấp phát với hạn ngạch mặc định bên dưới; quản trị viên nền tảng có thể nâng nó lên sau từ các trang quản trị.
| Resource | Default |
|---|---|
cpu | 2 |
memory | 4Gi |
disk | 10Gi |
Bộ chuyển dự án
Bộ chuyển ở thanh trên cùng liệt kê mọi dự án bạn sở hữu hoặc là thành viên. Chọn một dự án sẽ lưu lựa chọn của bạn vào cookiemc_project và tải lại console giới hạn trong phạm vi dự án đó. Nếu bạn chưa có dự án nào, bạn sẽ được nhắc tạo một dự án.Mô hình URL theo dự án đang hoạt động
Mọi trang trong console đều được giới hạn theo dự án đang hoạt động và id của nó xuất hiện đầu tiên trong đường dẫn: /<project>/<service>. Ví dụ, trang thành viên IAM cho một dự án tên là demo-01 là:
/demo-01/iam/members
/demo-01/iam/service-accounts
/demo-01/iam/rolesMục IAM của console có ba trang con — Members, Service accounts và Roles. Chuyển dự án chỉ đơn giản là tráo đoạn đầu tiên, nên bạn có thể đánh dấu một liên kết sâu và nó luôn nằm đúng dự án.
Thành viên
Một thành viên là một người dùng Keycloak đã được cấp một hoặc nhiều vai trò trên dự án. Chủ sở hữu luôn là một thành viên với vai trò owner và được hiển thị đầu tiên trong danh sách.
Để thêm một thành viên, hãy vào /<project>/iam/members và nhấn Add member:
- Subject — tên người dùng Keycloak hiện có cần thêm. Nếu tên người dùng không tồn tại bạn sẽ nhận được lỗi
400. - Roles — một hoặc nhiều id vai trò (xem Vai trò bên dưới). Một thành viên có thể giữ nhiều vai trò cùng lúc.
Sau này bạn có thể đổi vai trò của một thành viên hoặc loại bỏ họ hoàn toàn. Quản lý thành viên đòi hỏi vai trò owner hoặc editor.
Chủ sở hữu là đặc biệt
Ràng buộc của chủ sở hữu dự án không thể chỉnh sửa và chủ sở hữu không thể bị loại bỏ khỏi dự án. Để bàn giao một dự án, một quản trị viên nền tảng phải gán lại quyền sở hữu.Vai trò
Việc phân quyền dựa trên vai trò. Có hai nhóm vai trò: vai trò phạm vi toàn dự án cấp quyền truy cập rộng, và vai trò theo từng dịch vụ ủy quyền cho một dịch vụ duy nhất. Toàn bộ danh mục có sẵn từ GET /iam/roles.
Vai trò dự án
| Role | Grants |
|---|---|
owner | Toàn quyền kiểm soát dự án, bao gồm xóa nó và quản lý IAM. Chỉ có đúng một chủ sở hữu. |
editor | Đọc và ghi mọi tài nguyên trên mọi dịch vụ, cộng thêm quản lý IAM (thành viên, tài khoản dịch vụ, khóa) và đổi tên dự án. |
viewer | Quyền chỉ đọc đối với dự án và tài nguyên của nó. |
Vai trò theo từng dịch vụ
Mỗi dịch vụ cũng định nghĩa một vai trò admin và một vai trò viewer. Vai trò <service>.admin cho phép một thành viên quản lý đầy đủ chỉ riêng một dịch vụ đó mà không biến họ thành editor toàn dự án — lý tưởng để ủy quyền, chẳng hạn, lưu trữ cho một người và hàm cho một người khác.
| Role | Delegates |
|---|---|
kinetic.admin / kinetic.viewer | Quản lý / đọc các hàm và tác vụ Kinetic. |
devbox.admin / devbox.viewer | Quản lý / đọc các workspace Dev Box. |
storage.admin / storage.viewer | Quản lý / đọc lưu trữ đối tượng Bucket. |
engines.admin / engines.viewer | Quản lý / đọc các phiên bản Engines (database, cache, queue). |
registry.admin / registry.viewer | Quản lý / đọc các image và pull secret của Registry. |
Ủy quyền một dịch vụ đơn lẻ
Để cho phép ai đó chỉ chạy Bucket mà không động đến thứ gì khác, hãy thêm họ làm thành viên với vai trò duy nhấtstorage.admin. Họ sẽ có thể quản lý bucket và đối tượng nhưng sẽ không thể tạo hàm, chỉnh sửa IAM, hay xóa dự án.owner / editor / viewer) là những gì backend thực thi cho việc phân quyền ở cấp dự án ngay lúc này.Tài khoản dịch vụ
Một tài khoản dịch vụ (SA) là một danh tính máy được giới hạn trong đúng một dự án. Hãy dùng nó cho các pipeline CI, cron job, hay bất kỳ tự động hóa nào cần gọi API mà không cần con người đăng nhập. Khác với thành viên, một SA xác thực bằng khóa API do Mikademy Cloud cấp — chứ không phải bằng Keycloak.
Mỗi SA có một email danh tính ổn định theo dạng <sa-name>@<project-id>.sa.mikademy.local. Tạo một SA từ /<project>/iam/service-accounts:
| Field | Type | Description |
|---|---|---|
name | string | Nhãn DNS-1123, duy nhất trong dự án. Không thể thay đổi. |
displayName | string | Tên thân thiện hiển thị trong console. |
roles | string[] | Các id vai trò mà SA giữ — cùng danh mục như thành viên. |
Tạo một SA không tạo ra một khóa. Bạn cấp khóa riêng (xem bên dưới). Quản lý tài khoản dịch vụ đòi hỏi owner hoặc editor. Xóa một SA cũng xóa tất cả khóa của nó.
Khóa API
Một khóa API xác thực một tài khoản dịch vụ. Khóa có định dạng mksa_<random>. Backend chỉ lưu một mã băm SHA-256 của khóa cộng với một prefix ngắn (12 ký tự đầu, dùng để tra cứu) — nó không bao giờ lưu chính khóa đó.
Khóa chỉ được hiển thị đúng một lần
Khi bạn tạo một khóa, toàn bộ giá trị văn bản thuần được trả về một lần, tại thời điểm tạo, và không bao giờ khôi phục được sau đó. Hãy sao chép ngay và lưu nó vào một trình quản lý bí mật. Nếu bạn làm mất, hãy thu hồi khóa và cấp một khóa mới.Cấp một khóa từ trang chi tiết của tài khoản dịch vụ, hoặc qua API. Các lệnh liệt kê sau đó chỉ hiển thị prefix, thời điểm tạo, thời điểm dùng lần cuối và cờ vô hiệu hóa — không bao giờ là văn bản thuần. Để xoay vòng hoặc vô hiệu một khóa, hãy thu hồi nó; SA vẫn hoạt động với các khóa khác của nó.
Gửi một khóa theo một trong hai cách sau:
# Preferred dedicated header
X-API-Key: mksa_xxxxxxxxxxxxxxxxxxxx
# …or as a bearer token (the mksa_ prefix is detected automatically)
Authorization: Bearer mksa_xxxxxxxxxxxxxxxxxxxxVí dụ API (với tư cách người dùng)
Địa chỉ cơ sở của API backend là https://api.<base-domain> và mọi đường dẫn đều nằm dưới /api/v1. Một người dùng đã đăng nhập xác thực bằng một bearer token OIDC:Authorization: Bearer <session-token>. Các ví dụ bên dưới giả định $TOKEN và $BASE đã được thiết lập.
BASE=https://api.example.com/api/v1
TOKEN=<your-session-token>Liệt kê các dự án của bạn
curl -s "$BASE/projects" \
-H "Authorization: Bearer $TOKEN"[
{
"id": "demo-01",
"displayName": "Demo One",
"owner": "alice",
"myRole": "owner",
"phase": "Ready",
"namespace": "project-demo-01",
"createdAt": "2026-06-30T10:00:00Z"
}
]Tạo một dự án
curl -s -X POST "$BASE/projects" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"demo-01","displayName":"Demo One"}'Trả về 201 kèm dự án mới (đã áp dụng hạn ngạch mặc định). Trả về 409 nếu id đã bị chiếm hoặc 400 nếu nó không hợp lệ.
Thêm một thành viên
curl -s -X POST "$BASE/projects/demo-01/members" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"subject":"bob","roles":["editor"]}'subject phải là một tên người dùng Keycloak hiện có (nếu không thì 400).
Tạo một tài khoản dịch vụ
curl -s -X POST "$BASE/projects/demo-01/service-accounts" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"ci-deployer","displayName":"CI Deployer","roles":["kinetic.admin"]}'Cấp một khóa API
curl -s -X POST \
"$BASE/projects/demo-01/service-accounts/<sa-id>/keys" \
-H "Authorization: Bearer $TOKEN"{
"id": "f0c1...",
"key": "mksa_3Hf9Qk2Lp...full-plaintext...",
"prefix": "mksa_3Hf9Qk",
"createdAt": "2026-06-30T10:05:00Z"
}Để thu hồi nó sau này: DELETE /projects/demo-01/service-accounts/<sa-id>/keys/<key-id> (trả về 204).
Xác thực với tư cách một tài khoản dịch vụ
Khi bạn đã có một khóa mksa_, tự động hóa của bạn gọi cùng API đó mà không cần một token người dùng. Gửi khóa qua X-API-Key (hoặc dưới dạng bearer token). SA chỉ có thể hành động trong phạm vi dự án của chính nó, với các vai trò ràng buộc với nó.
KEY=mksa_3Hf9Qk2Lp...
# List the SA's project resources using the key
curl -s "$BASE/projects/demo-01/service-accounts" \
-H "X-API-Key: $KEY"
# Equivalent, as a bearer token
curl -s "$BASE/projects/demo-01/service-accounts" \
-H "Authorization: Bearer $KEY"IAM liên quan thế nào đến mọi dịch vụ
IAM là cánh cổng đứng trước toàn bộ Mikademy Cloud. Để quản lý tài nguyên của bất kỳ dịch vụ nào bạn cần hoặc một vai trò owner/editor toàn dự án, hoặc vai trò admin của dịch vụ đó. Một viewer (dự án hoặc theo từng dịch vụ) chỉ có thể đọc.
| Service | Manage requires |
|---|---|
Kinetic — functions & jobs | owner / editor / kinetic.admin |
Dev Box — dev containers | owner / editor / devbox.admin |
Bucket — object storage | owner / editor / storage.admin |
Engines — db / cache / queue | owner / editor / engines.admin |
Registry — container images | owner / editor / registry.admin |
Billing — quota & plans | owner / editor |
Xem hướng dẫn riêng của từng dịch vụ để biết chi tiết: Kinetic, Dev Box, Bucket, Engines, Registry và Billing.
Thực hành tốt nhất
Cấp đặc quyền tối thiểu và xoay vòng khóa
- Ưu tiên vai trò hẹp nhất mà vẫn hoạt động được. Ủy quyền một dịch vụ bằng
<service>.adminthay vì trao raeditor. - Dùng một tài khoản dịch vụ cho mỗi workload để bạn có thể thu hồi hoặc kiểm toán từng cái độc lập — đừng chia sẻ khóa giữa các pipeline.
- Xoay vòng khóa định kỳ: cấp một khóa mới, triển khai nó, rồi thu hồi khóa cũ. Vì các khóa độc lập với nhau, bạn có thể luân chuyển mà không gián đoạn.
- Lưu khóa trong một trình quản lý bí mật, không bao giờ trong mã nguồn. Console chỉ hiển thị một khóa một lần.
- Dành riêng
ownercho một hoặc hai người đáng tin cậy — vai trò này có thể xóa dự án.
Khắc phục sự cố & những điểm cần lưu ý
Những lỗi thường gặp
- 403 Forbidden — bạn không phải là thành viên của dự án, hoặc vai trò của bạn quá thấp cho hành động đó (quản lý IAM hoặc đổi tên cần
owner/editor; xóa cầnowner). Hãy nhờ một chủ sở hữu cấp đúng vai trò. - 404 trên một dự án — id sai, hoặc bạn không có quyền truy cập; API trả về
403/404thay vì để lộ dự án nào tồn tại. - Mất khóa API — khóa chỉ được hiển thị một lần và lưu dưới dạng mã băm. Chúng không bao giờ lấy lại được. Hãy thu hồi và cấp một khóa mới.
- Không thể loại bỏ chủ sở hữu — ràng buộc của chủ sở hữu là cố định; bạn không thể xóa hay hạ cấp nó. Việc thay đổi quyền sở hữu phải qua một quản trị viên nền tảng.
- 409 khi tạo — id dự án (hoặc tên SA) đã bị chiếm; id là duy nhất trên toàn hệ thống và không thể thay đổi, nên hãy chọn cái khác.
- 400 khi thêm một thành viên —
subjectphải là một tên người dùng Keycloak hiện có trước khi bạn có thể ràng buộc một vai trò vào nó.