Triển khai Ứng dụng & Vận hành GitOps
1. Khởi động Application Gốc (Root App)
Phần tiêu đề “1. Khởi động Application Gốc (Root App)”Sau khi cụm k3s đã hoàn tất bootstrap, toàn bộ chu trình GitOps được kích hoạt bằng lệnh nạp application gốc:
kubectl apply -k cluster/bootstrap/root-appApplication root-app sẽ đồng bộ thư mục cluster/bootstrap/children/, lập tức sinh ra:
platform: Triển khai cert-manager và ClusterIssuer vào namespacecert-manager.apps: Một ApplicationSet tự động theo dõi toàn bộ thư mục con trongcluster/apps/*.
2. Quy trình thêm ứng dụng mới vào cụm
Phần tiêu đề “2. Quy trình thêm ứng dụng mới vào cụm”Nhờ cơ chế Git directory generator của ApplicationSet (path: cluster/apps/*), việc đưa một dịch vụ mới lên cụm không đòi hỏi bạn phải chỉnh sửa bất kỳ cấu hình nào trên ArgoCD.
Cấu trúc thư mục ứng dụng chuẩn
Phần tiêu đề “Cấu trúc thư mục ứng dụng chuẩn”Để đưa một ứng dụng tên my-service vào hệ thống:
cluster/apps/my-service/├── kustomization.yaml├── deployment.yaml├── service.yaml├── ingress.yaml└── secret.sops.yaml # Tuỳ chọn: secret runtime đã được mã hoá SOPSVí dụ mẫu: demo-nginx
Phần tiêu đề “Ví dụ mẫu: demo-nginx”Trong repository đã có sẵn ứng dụng mẫu tại cluster/apps/demo-nginx/:
- Phục vụ trang HTML tuỳ biến qua ConfigMap.
- Secret mã hoá bằng SOPS trong
secret.sops.yaml. - Ingress trỏ domain
demo-nginx.timi.io.vnvới annotation tự động cấp phát TLS:cert-manager.io/cluster-issuer: letsencrypt-production
Commit và đẩy code lên GitHub:
git add cluster/apps/my-servicegit commit -m "feat: onboard my-service via GitOps"git push origin mainTrong vòng 3 phút (hoặc ngay lập tức nếu bạn bấm nút Refresh trên giao diện ArgoCD UI), ArgoCD sẽ tự động nhận diện thư mục mới, tạo Application tương ứng và deploy pod lên k3s.
3. Kiểm thử cơ chế Tự phục hồi (Self-Healing)
Phần tiêu đề “3. Kiểm thử cơ chế Tự phục hồi (Self-Healing)”ArgoCD được bật đồng thời tính năng tự đồng bộ (auto-sync) và tự phục hồi khi có sai lệch (selfHeal: true).
Bài test 1: Xoá pod thủ công
Phần tiêu đề “Bài test 1: Xoá pod thủ công”Xoá thử pod đang chạy của demo app:
kubectl delete pod -l app=demo-nginx -n demo-nginxHiện tượng: ReplicaSet lập tức tạo lại pod mới ngay sau vài giây.
Bài test 2: Sửa đổi trái phép trạng thái cụm
Phần tiêu đề “Bài test 2: Sửa đổi trái phép trạng thái cụm”Dùng lệnh kubectl để thay đổi số lượng replica ngoài luồng Git:
kubectl scale deployment demo-nginx --replicas=5 -n demo-nginxHiện tượng: ArgoCD phát hiện số replica trên cụm (5) không khớp với khai báo trên Git (replicas: 1), hệ thống sẽ lập tức can thiệp và scale ngược lại về 1.
4. Chiến lược Rollback ứng dụng
Phần tiêu đề “4. Chiến lược Rollback ứng dụng”Trong quy chuẩn GitOps, mọi thao tác rollback phải được thực hiện thông qua lịch sử commit của Git thay vì gõ lệnh trên cụm:
# Revert lại commit bị lỗi trên Gitgit revert <commit-sha>git push origin mainArgoCD sẽ tự động đồng bộ lại trạng thái ổn định trước đó, đảm bảo lịch sử thay đổi luôn được lưu trữ minh bạch.
5. Monitoring (VictoriaMetrics + Grafana)
Phần tiêu đề “5. Monitoring (VictoriaMetrics + Grafana)”Monitoring thuộc tầng platform (cluster/platform/) — deploy trong
Application platform, sắp xếp bằng sync-wave: victoria-metrics (0) rồi
grafana (1):
| Thành phần | Chart (pin version) | Thành phần |
|---|---|---|
victoria-metrics |
victoria-metrics-k8s-stack 0.95.0 (VictoriaMetrics v1.153.0) |
VM operator + VMSingle (lưu trữ/truy vấn, PVC 20Gi, retention 1 tháng) + VMAgent + kube-state-metrics + node-exporter; scrape kubelet/cAdvisor và các thành phần control-plane của k3s |
grafana |
grafana 13.2.7 (Grafana 13.2.3) |
Giao diện Grafana tại https://grafana.timi.io.vn, datasource trỏ VMSingle, dashboards nhận qua sidecar |
Ghi chú vận hành:
- Chart được pin trong mục
helmCharts:củakustomization.yamltừng app, inflate bằng--enable-helm. Nâng cấp = bumpversion:, chạymake validaterồi push. Chart Grafana mới nhất nằm ởhttps://grafana-community.github.io/helm-charts(version chart bám theo version app); repo cũgrafana.github.io/helm-chartschỉ có Grafana 12.x. - Bắt buộc
includeCrds: truevới chart victoria-metrics — kustomize helm inflation sẽ bỏ qua thư mụccrds/của chart nếu thiếu. - Mật khẩu admin Grafana:
sops -d cluster/platform/grafana/secret.sops.yaml. - Dashboards được sync-job của k8s-stack tạo thành ConfigMap và Grafana sidecar tự
nhận; datasource phải giữ
uid: VictoriaMetrics. - Chứng chỉ webhook của VM operator do cert-manager cấp
(
admissionWebhooks.certManager.enabled: true) — tránh cert tự ký ngẫu nhiên khiến app luôn OutOfSync.
Kiểm tra:
kubectl -n victoria-metrics get podskubectl -n victoria-metrics port-forward svc/vmsingle-vm 8428curl 'localhost:8428/api/v1/query?query=up'kubectl -n grafana get pods,ingress