Từ chứng chỉ Anthropic đến nền tảng FinOps: Nhật ký "Vibe Coding" với dự án Sentinel
Khởi đầu chỉ là một khóa học Claude Code, tác giả đã xây dựng thành công Sentinel — một nền tảng observability và FinOps cho Kubernetes sử dụng Go và PostgreSQL. Bài viết này là nhật ký phát triển, so sánh giữa Claude và Gemini, và những bài học quan trọng về việc sử dụng AI trong kiến trúc phần mềm.

Bài viết này không phải là một hướng dẫn kỹ thuật. Đó là một nhật ký.
Câu chuyện về việc tôi bắt đầu một ngày chỉ muốn tìm hiểu Claude Code, nhưng lại kết thúc với một nền tảng observability và FinOps cho Kubernetes hoàn chỉnh, chạy trên Go, PostgreSQL và dashboard thời gian thực — mà không hề có bất kỳ kế hoạch trước nào.
Ngày 1: Chứng chỉ và $5 tín dụng
Mọi chuyện bắt đầu khi tôi quyết định tham gia khóa học chính thức của Anthropic trên Skilljar: Claude Code in Action. Khóa học miễn phí, có chứng chỉ, và tôi mất vài giờ để hoàn thành.
Khóa học yêu cầu API key từ Anthropic Platform để chạy các ví dụ bằng JavaScript. Tôi tạo key, khởi chạy server cục bộ và nhận được thông báo:
error: Your credit balance is too low to access the Anthropic API.
"Nhưng khóa học là miễn phí mà..."
Không hẳn vậy. Khóa học miễn phí, nhưng các lệnh gọi API tiêu thụ tín dụng thật. Đó là hai việc riêng biệt — và nền tảng không làm rõ điều này. Tôi đã phải mua $5 tín dụng, xóa cache và phiên, tạo lại key, và mọi thứ mới hoạt động.
Bài học 1: Thương mại luôn thắng. Nhưng $5 đủ dùng khá lâu với Haiku.
Ngay trong ngày có chứng chỉ trên tay, tôi bắt tay vào thực hành.
Vẫn trong Ngày 1: v1.0 ra đời
Ý tưởng rất đơn giản: Một tác nhân Claude Code để giám sát cluster Kubernetes và tự động tạo runbook. Không cần code thủ công, chỉ cần chỉ đạo.
Tôi triển khai kube-prometheus-stack trên Minikube bằng Helm:
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set grafana.adminPassword=admin123
Sáu pods khởi chạy cùng lúc. Grafana với các dashboard sẵn có. Prometheus thu thập các chỉ số thực tế từ chiếc i7-14900HX của tôi.
Sau đó, tôi tạo cấu trúc cơ bản với các lệnh slash trong Markdown tại .claude/commands/:
| Lệnh | Chức năng |
|---|---|
/sentinel | Điều phối viên chính |
/collect-metrics | Tác nhân con A — truy vấn Prometheus qua PromQL |
/analyze-pods | Tác nhân con B — kiểm tra pods qua kubectl |
/correlate | Tác nhân con C — phân loại mức độ nghiêm trọng |
File CLAUDE.md trở thành bộ nhớ hoạt động của tác nhân: các endpoint, ngưỡng (thresholds), namespaces, mẫu runbook.
Tôi chạy /sentinel lần đầu tiên và nó tạo ra kết quả sau:
Severidade: WARNING CPU: 11.4% ✅ || Memória: 45.1% ✅ || Disco: 17.65% ✅ 64 Warning events được xác định là tàn dư từ lần restart node trước đó storage-provisioner: BackOff gần đây — cần giám sát
Dashboard Sentinel
Tác nhân đã tự tách biệt nhiễu khỏi tín hiệu. Nó xác định rằng 64 sự kiện Warning là tàn dư từ việc reboot Minikube — không phải là bất thường thực sự. Điều này không có trong prompt. Đó là sự suy luận của mô hình.
v1.0 trên GitHub. Cùng ngày với chứng chỉ.
Ngày 2: v1.1 và khởi động tự động
Điểm gây phiền toái lớn nhất của v1.0 là vận hành: mỗi khi mở Claude Code, tôi phải nhớ khởi chạy ba port-forwards thủ công trước khi chạy bất kỳ lệnh nào.
Tôi đã tạo /startup — một tác nhân kiểm tra xem Prometheus, Grafana và AlertManager có thể truy cập được không và chỉ khởi chạy các port-forwards còn thiếu, chạy ngầm, với thử lại tối đa 10 lần:
╔══════════════════════════════════════════╗ ║ Sentinel — Startup ║ ╚══════════════════════════════════════════╝ Prometheus (localhost:9090) → ✅ STARTED Grafana (localhost:3000) → ✅ STARTED AlertManager (localhost:9093) → ✅ STARTED
Tôi cũng mở rộng /analyze-pods để giám sát nhiều namespace song song: default, monitoring và kube-system — với kết quả được nhóm theo namespace và tương quan nguyên nhân gốc rễ chéo.
Kết quả trông như sau:
| Namespace | Tổng | Không khỏe |
|---|---|---|
| default | 0 | 0 |
| monitoring | 6 | 0 (tất cả đang Running) |
| kube-system | 8 | 0 (tất cả đang Running) |
Và tác nhân thậm chí còn xác định được storage-provisioner với 21 lần restart so với mức trung bình 8 của các pod khác — phát tín hiệu về thành phần thực sự bất thường mà không cần bất kỳ hướng dẫn rõ ràng nào.
v1.1 trên GitHub. Ngày 2.
Tuần của Gemini: Khi Claude Code gặp sự cố
Vào tuần sau, Anthropic gặp phải sự hạn chế nghiêm trọng về token ảnh hưởng đến cộng đồng toàn cầu. Claude Code trở nên gần như không thể sử dụng được cho các phiên dài.
Tôi đã chuyển sang Gemini. Nó hoạt động tốt trong một thời gian — và正是在 khoảng thời gian này, Sentinel bắt đầu có các tính năng phức tạp hơn: Go agent, tích hợp PostgreSQL, dashboard.
Nhưng khi dự án phát triển, các vấn đề bắt đầu nảy sinh:
- UI của dashboard: Gemini tạo ra HTML hoạt động nhưng có sự không nhất quán về mặt thị giác mà tôi cần sửa thủ công.
- Bảo mật mã nguồn: Tôi tìm thấy các mẫu trong mã được tạo khiến tôi lo ngại — thiếu xác thực đầu vào, thiếu header bảo mật, các truy vấn SQL không được làm sạch (sanitize) đầy đủ.
Khi Claude Code hoạt động trở lại, tôi đã chuyển ngược lại. Chi phí trên mỗi phiên cao hơn và cửa sổ ngữ cảnh nhỏ hơn — nhưng chất lượng và độ tin cậy của mã được tạo ra, đặc biệt là các vấn đề bảo mật, là điều đáng giá.
Sentinel sinh ra trên Gemini. Nhưng lại lớn lên trên Claude Code.
Phiên bản v2.0: Khi trở thành nền tảng
Bước ngoặt xảy ra với một câu hỏi: "E nếu tôi đã có dữ liệu được thu thập trước khi gọi Claude thì sao?"
Các lệnh slash truy vấn Prometheus và kubectl theo thời gian thực mỗi khi thực thi. Điều này hoạt động, nhưng lại chậm và không lưu trạng thái (stateless) — không có lịch sử, không có xu hướng, không có FinOps thực sự.
Giải pháp: Một Go agent chạy liên tục trong nền.
// Coleta a cada 10 segundos
// Persiste no PostgreSQL
// Expõe API REST para o Claude consumir
Với client-go gốc, tác nhân thu thập chỉ số CPU, bộ nhớ và lãng phí (waste) theo pod, lưu giữ trong giao dịch batch trên PostgreSQL và cung cấp ba điểm cuối (endpoints):
| Endpoint | Mô tả |
|---|---|
GET /api/summary | Trạng thái cluster: nodes, pods, CPU |
GET /api/metrics | Chỉ số theo pod: mức dùng CPU, lãng phí |
GET /api/history | Lịch sử chi phí 30 phút gần nhất |
Claude Code chuyển sang tiêu thụ các endpoints này thông qua /incident thay vì thực hiện truy vấn trực tiếp. Sự tách biệt tầng thực sự: Go thu thập, Claude phân tích.
Dashboard bao gồm: Bản đồ sức khỏe Node (honeycomb), Phân bố Pod (donut chart), Tình lãng phí (Waste Intelligence) với cơ hội tiết kiệm theo pod, và Timeline tài chính ROI so sánh Ngân sách với Thực tế trong 30 phút qua.
Harness: Coi đầu ra của LLM là đầu vào không đáng tin cậy
Một quyết định kiến trúc mà tôi tự hào: harness/validador_saida.py.
Mọi báo cáo được tạo bởi Claude Code đều phải vượt qua một "người gác cổng" (gatekeeper) trước khi được ghi vào đĩa. Bộ xác nhận sẽ chặn:
| Quy tắc | Ví dụ bị chặn |
|---|---|
| Lệnh phá hủy | rm -rf, kubectl delete, DROP TABLE, fork bomb |
| Cấu trúc bắt buộc | Báo cáo thiếu ## Resumo Executivo sẽ bị từ chối |
| Kích thước tối thiểu | Nội dung dưới 100 ký tự bị từ chối |
if result.returncode != 0:
return {
"status": "error",
"message": f"Validador bloqueou a gravação: {result.stderr.strip()}",
"file": None,
}
Nếu bộ xác nhận từ chối, tệp sẽ không được tạo. Đơn giản vậy thôi.
Điều này không phải là chứng cuồng loạn (paranoia) — đó là kiến trúc sản xuất. Bất kỳ hệ thống nào sử dụng LLM để tạo hành động trên cơ sở hạ tầng đều cần một người gác cổng.
Vibe coding có ý nghĩa gì trong thực tế
Vibe coding không phải là "để AI làm mọi thứ". Đó là một hình thức làm việc cụ thể:
Bạn định nghĩa CÁI GÌ. AI quyết định NHƯ THẾ NÀO.
Ở mỗi bước, tôi biết kết quả mình muốn:
- "Tôi muốn startup kiểm tra dịch vụ và khởi tạo các port-forwards còn thiếu"
- "Tôi muốn phân tích được nhóm theo namespace với tương quan nguyên nhân gốc rễ"
- "Tôi muốn một gatekeeper chặn các lệnh phá hủy trước khi ghi"
Tác nhân thực hiện. Tôi xem xét, đặt câu hỏi, điều hướng lại.
Điều khiến tôi ngạc nhiên: không có lúc nào tôi viết một dòng code nào của Go agent, dashboard, hay harness. Nhưng mọi quyết định kiến trúc đều là của tôi. AI là người đồng đội không bao giờ ngủ và không bao giờ phàn nàn về việc refactor.
Điều rõ ràng về Claude Code
Điểm mạnh:
- Chất lượng và tính nhất quán của mã được tạo ra, đặc biệt là trong Go.
- Suy luận về bảo mật — các header HTTP đúng, làm sạch dữ liệu, quyền hạn của tệp.
- Khả năng duy trì ngữ cảnh dự án qua
CLAUDE.md. - Các tác nhân con song song thực sự thực thi song song.
Hạn chế thực tế:
- Cửa sổ ngữ cảnh nhỏ hơn đối thủ — các dự án lớn yêu cầu
/compactthường xuyên. - Chi phí trên mỗi token cao hơn — liên quan trong các phiên dài.
- Sự không ổn định về token xảy ra tuần trước cho thấy sự phụ thuộc hoàn toàn vào một nhà cung cấp duy nhất là rủi ro thực sự.
Lịch trình hành trình
| Ngày | Mốc |
|---|---|
| 8 mar 2026 | Chứng chỉ Claude Code in Action — Anthropic/Skilljar |
| 8 mar 2026 | v1.0: slash commands + Prometheus + K8s |
| 9 mar 2026 | v1.1: khởi động tự động + nhiều namespaces |
| Tuần 2 | Chuyển sang Gemini tạm thời — hạn chế token toàn cầu Anthropic |
| Tuần 2-3 | v2.0: Go agent + PostgreSQL + dashboard + harness |
| Tuần 3 | Quay lại Claude Code + đổi tên thành Sentinel |
Trạng thái hiện tại
Dự án là mã nguồn mở, giấy phép Apache 2.0:
👉 github.com/boccato85/Sentinel
Stack công nghệ đầy đủ:
- Minikube / Kubernetes v1.35.1
- kube-prometheus-stack
- Go agent với
client-go - PostgreSQL
- Claude Code 2.1.76
- MCP Servers (Prometheus + kubectl)
Nếu bạn làm việc với SRE, CloudOps hoặc FinOps và muốn khám phá Claude Code trong thực tế, đây là một điểm bắt đầu thực sự — không phải là một bài hello world.
Dự án này là một phần của lộ trình cá nhân: CKA → Claude Code → MLOps. Nếu muốn theo dõi, hãy theo dõi tôi tại dev.to.
Bài viết liên quan

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026

Công nghệ
Spotify thắng kiện 322 triệu USD từ nhóm pirate Anna's Archive nhưng đối mặt với bài toán thu hồi
16 tháng 4, 2026
