night-watch là một CLI nhỏ viết bằng Go để “đóng/mở” (scale) tất cả Kubernetes Deployments trong một namespace theo 2 chế độ:
- sleep: giảm replica về 1
- wake: tăng replica lên 3
Mục tiêu: giúp bạn nhanh chóng tiết kiệm tài nguyên khi “ngủ” và khôi phục khi “thức” (demo/lab/cluster nội bộ).
Lưu ý: Hiện tại namespace đang được fix cứng trong code là
sre-mart.
- Đọc kubeconfig (mặc định:
~/.kube/config). - Kết nối tới Kubernetes API bằng
client-go. - List tất cả Deployments trong namespace.
- Update
spec.replicascho từng Deployment theo mode.
- Go (theo
go.mod:go 1.25.0) - Kubeconfig hợp lệ (có thể truy cập cluster)
- Tài khoản trong kubeconfig cần có quyền:
listdeploymentsgetdeploymentsupdatedeployments
Nếu chạy trong cluster (Pod) thay vì kubeconfig local, bạn sẽ cần chỉnh code để dùng InClusterConfig().
go run main.go --mode=sleepgo run main.go --mode=wake
go build -o night-watch ../night-watch --mode=sleep
--kubeconfig(string): đường dẫn kubeconfig- default:
~/.kube/config(nếu tìm thấy home dir)
- default:
--mode(string):sleephoặcwake- default:
sleep
- default:
Ví dụ:
./night-watch --kubeconfig=/path/to/config --mode=wake
sleep→ set replicas = 1 cho mọi Deployment trong namespacewake→ set replicas = 3 cho mọi Deployment trong namespace- Namespace:
sre-mart(đang hard-code)
Lỗi này xảy ra nếu code gọi flag.Parse() trước khi khai báo flag mode. Phiên bản hiện tại đã fix bằng cách khai báo toàn bộ flags trước rồi flag.Parse() đúng 1 lần.
Go không có package chuẩn tên async. Dự án dùng sync.WaitGroup.
Bạn có thể thấy log kiểu:
client-side throttling
Đây là hành vi bình thường khi gửi nhiều request tới API server trong thời gian ngắn.
Nếu gặp lỗi forbidden, hãy đảm bảo user/serviceAccount có đủ quyền list/get/update Deployments trong namespace mục tiêu.
- Thêm flag
--namespacethay vì hard-codesre-mart - Cho phép set
--sleep-replicasvà--wake-replicas - Thêm dry-run (
--dry-run) và confirm (--yes) - Thêm concurrency limit để giảm throttling
Xem file LICENSE (nếu repo có). Nếu chưa có, bạn có thể thêm license theo nhu cầu (MIT/Apache-2.0/etc.).