Cài đặt ArgoCD và cấu hình Repository Git cho Manifest
Trước tiên, chúng ta cần triển khai ArgoCD vào cluster Kubernetes đã chuẩn bị ở các phần trước để làm trung tâm điều phối GitOps.
Mục đích là tạo namespace riêng và deploy các component core của ArgoCD (API server, Repo server, Application controller) để quản lý trạng thái cluster.
Kết quả mong đợi là ArgoCD chạy ổn định với 3 Pod trong namespace argocd và expose dịch vụ để truy cập Web UI.
Đầu tiên, tạo namespace argocd để cô lập các tài nguyên của ArgoCD.
kubectl create namespace argocd
Kiểm tra namespace đã được tạo thành công.
kubectl get namespace argocd
Thêm repository Helm chính thức của ArgoCD vào hệ thống.
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
Triển khai ArgoCD bằng Helm với cấu hình mặc định, đảm bảo expose qua LoadBalancer hoặc NodePort tùy hạ tầng.
helm install argocd argo/argo-cd \
--namespace argocd \
--set controller.replicas=1 \
--set server.service.type=LoadBalancer \
--set server.ingress.enabled=false \
--set repoServer.replicas=1
Chờ khoảng 1-2 phút để các Pod khởi tạo xong. Kiểm tra trạng thái các Pod.
kubectl get pods -n argocd
Tất cả Pod phải có trạng thái RUNNING và READY 1/1.
Lấy password mặc định của admin để truy cập giao diện web.
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
Sau đó lấy IP hoặc hostname của dịch vụ ArgoCD server.
kubectl -n argocd get svc argocd-server
Truy cập http://:443 (cần cấu hình SSL nếu dùng HTTPS) để login với user "admin" và password vừa lấy.
Thiết lập Git Repository chứa Manifests
Chúng ta cần tạo một repository Git (ví dụ trên GitHub/GitLab) để lưu trữ các file YAML định nghĩa ứng dụng Backstage và Crossplane.
Mục đích là tạo cấu trúc thư mục chuẩn cho GitOps: tách biệt code ứng dụng và định nghĩa hạ tầng (Infrastructure as Code).
Kết quả mong đợi là repository Git có cấu trúc thư mục rõ ràng chứa các manifest YAML hợp lệ.
Tạo thư mục local trên máy phát triển hoặc CI runner để chứa manifests.
mkdir -p idp-gitops-repo/{argocd-apps,backstage,crossplane}
cd idp-gitops-repo
Tạo file manifest cho Backstage (ví dụ: Deployment và Service) trong thư mục tương ứng. Đây là ví dụ đơn giản hóa.
cat > backstage/backstage-deployment.yaml
Tạo file manifest cho Crossplane (ví dụ: ProviderConfig hoặc Composition) trong thư mục crossplane.
cat > crossplane/crossplane-provider.yaml
Lưu ý: File trên là ví dụ về tài nguyên được quản lý bởi Crossplane (CNPG). Trong thực tế, bạn sẽ dùng tài nguyên của Crossplane như ProviderConfig hoặc Composition.
Tạo file Application của ArgoCD để chỉ định nơi sync từ Git.
cat > argocd-apps/backstage-app.yaml
Thay thế URL repository bằng link thực tế của bạn. Lưu ý phần `path` trỏ vào thư mục `backstage`.
Tạo file Application cho Crossplane resources.
cat > argocd-apps/crossplane-app.yaml
Đẩy toàn bộ thư mục lên Git repository.
git init
git add .
git commit -m "Initial commit: IDP manifests for Backstage and Crossplane"
git branch -M main
git remote add origin https://github.com/your-org/idp-gitops-repo.git
git push -u origin main
Kiểm tra trên GitHub/GitLab để đảm bảo file đã được push thành công.
Cấu hình ArgoCD để tự động Sync với Git Repository
Bước này kết nối ArgoCD với repository Git vừa tạo để nó có thể đọc và sync các manifest.
Mục đích là cấu hình Git credentials (SSH key hoặc Token) để ArgoCD có quyền đọc repository, đặc biệt nếu repo là private.
Kết quả mong đợi là ArgoCD hiển thị repository trong danh sách và có thể import Application mà không bị lỗi authentication.
Truy cập Web UI của ArgoCD, vào mục Settings -> Repositories.
Nhấn "Add Repository", chọn loại Git (SSH hoặc HTTPS). Nếu dùng HTTPS, nhập URL repo, username và password (hoặc Personal Access Token).
Nếu dùng SSH (khuyến nghị cho CI/CD), cần tạo SSH key mới trong ArgoCD UI.
Trong UI ArgoCD, chọn "Add Repository" -> "SSH", nhập URL repo (ví dụ: git@github.com:org/repo.git). Nhấn "Generate SSH Key" để ArgoCD tạo cặp key.
Sao chép public key được hiển thị (bắt đầu bằng ssh-rsa).
Dán public key này vào phần "Deploy keys" của repository trên GitHub/GitLab (Settings -> Deploy Keys). Đánh dấu "Write access" nếu cần push (tuy nhiên trong GitOps thường chỉ cần Read access cho ArgoCD).
Nhấn "Save" trong ArgoCD UI. Repository sẽ chuyển trạng thái thành "Healthy" hoặc "Synced".
Bây giờ, import các Application vào ArgoCD.
Vào trang chủ ArgoCD UI, nhấn "New App".
Cấu hình như sau:
- Application Name: backstage
- Project: default
- Sync Policy: Auto
- Source: Repo URL (chọn repo đã add), Target Revision: main, Path: backstage
- Destination: Cluster URL (https://kubernetes.default.svc), Namespace: idp
Nhấn "Create". ArgoCD sẽ tự động phát hiện và sync file `backstage-deployment.yaml` vào cluster.
Lặp lại tương tự cho Crossplane resources:
- Application Name: crossplane-resources
- Path: crossplane
- Namespace: idp
Kiểm tra trạng thái sync trong UI. Trạng thái phải là "Synced" và "Healthy".
Thiết lập quy trình CI/CD để đẩy code từ Pipeline vào Git
Chúng ta cần thiết lập pipeline (ví dụ GitHub Actions hoặc GitLab CI) để tự động đẩy code vào Git khi developer merge code vào branch chính.
Mục đích là đảm bảo bất kỳ thay đổi nào về cấu hình hoặc code đều được ghi vào Git trước khi ArgoCD sync xuống cluster, tuân thủ nguyên tắc Git as Source of Truth.
Kết quả mong đợi là khi merge code vào branch `main`, pipeline tự động chạy và commit changes vào repository GitOps.
Tạo file workflow `.github/workflows/deploy.yml` trong repository GitOps (hoặc trong repo code nguồn nếu dùng pattern GitOps 2.0).
Ở đây chúng ta giả định pattern GitOps 1.0: CI build image -> Tag image -> Update manifest trong repo GitOps -> ArgoCD sync.
cat > .github/workflows/update-manifests.yml
Lưu ý: Thay thế `your-docker-hub-repo` bằng tên repository thực tế của bạn. Cần tạo Secrets `DOCKER_USER` và `DOCKER_PASS` trong GitHub Settings -> Secrets.
Để tránh vòng lặp vô tận (CI push -> ArgoCD sync -> CI trigger), dòng commit message có tag `[skip ci]` hoặc cấu hình `.gitlab-ci.yml` để skip CI khi commit từ bot.
Khi pipeline chạy xong, ArgoCD sẽ phát hiện thay đổi trong Git repository (do commit từ CI) và tự động sync lại cluster với image mới.
Cấu hình ArgoCD để quản lý cả Backstage và Crossplane Resources
Bây giờ chúng ta cần mở rộng ArgoCD để không chỉ quản lý Deployment mà còn quản lý các Custom Resources (CRDs) của Crossplane.
Mục đích là đảm bảo ArgoCD hiểu và sync đúng các tài nguyên hạ tầng ảo (Virtual Resources) như Database, Storage, Network được định nghĩa bởi Crossplane.
Kết quả mong đợi là các tài nguyên Crossplane (ví dụ: PostgreSQL Cluster) được tạo tự động trong cluster khi sync từ Git.
Đảm bảo Crossplane đã được cài đặt (từ Phần 3) và các Provider tương ứng (ví dụ: CNPG, AWS, Azure) đã được deploy.
Cấu trúc manifest trong Git đã có sẵn file `crossplane/crossplane-provider.yaml` (hoặc file CRD tương ứng).
Trong ArgoCD UI, kiểm tra Application `crossplane-resources`. Nếu file YAML hợp lệ, ArgoCD sẽ liệt kê các resource bên trong.
Quan trọng: ArgoCD cần quyền RBAC để tạo các CRDs này. Đảm bảo ServiceAccount của ArgoCD (thường là `argocd-application-controller`) có quyền `create`, `update`, `delete` đối với các CRD của Crossplane trong namespace `idp`.
Tạo Role và RoleBinding để cấp quyền cho ArgoCD quản lý Crossplane CRDs.
cat > argocd-apps/argocd-rbac-crossplane.yaml
Thêm file này vào thư mục `argocd-apps` trong Git repository và push lên.
Tạo Application mới trong ArgoCD để sync file RBAC này trước, hoặc thêm nó vào cùng Application `crossplane-resources` nếu cấu trúc thư mục cho phép.
Tốt nhất là tạo một Application riêng cho Infrastructure Configs (RBAC, Namespace) để chạy trước.
cat > argocd-apps/idp-infra-config.yaml
Import file `idp-infra-config.yaml` vào ArgoCD UI. Nó sẽ tự động tạo Role và RoleBinding cần thiết.
Sau khi RBAC được cấp, quay lại Application `crossplane-resources`. Nhấn "Sync" nếu nó đang ở trạng tháiOutOfSync.
Kiểm tra trong Kubernetes CLI xem tài nguyên Crossplane đã được tạo chưa.
kubectl get clusters.postgresql.cnpg.io -n idp
Nếu Crossplane đã hoạt động, bạn sẽ thấy trạng thái của tài nguyên này chuyển từ "Creating" sang "Ready" sau khi Crossplane provision xong hạ tầng thực tế (ví dụ: tạo instance PostgreSQL trên cloud).
Verify Kết Quả
Để xác nhận toàn bộ quy trình GitOps đã hoạt động, thực hiện các bước kiểm tra sau:
Kiểm tra trạng thái tổng thể của ArgoCD.
argocd app list
Tất cả 3 applications (backstage, crossplane-resources, idp-infra-config) phải có trạng thái Health: Healthy và Sync Status: Synced.
Kiểm tra Pod của Backstage đã chạy.
kubectl get pods -n idp -l app=backstage
Pod phải ở trạng thái Running.
Kiểm tra tài nguyên Crossplane (Database) đã được tạo.
kubectl describe cluster.idp-db -n idp
Trong phần Events, bạn sẽ thấy Crossplane đã tạo tài nguyên hạ tầng (Managed Resource) thành công.
Thực hiện test thay đổi: Sửa file `backstage-deployment.yaml` trong Git (ví dụ: tăng replicas từ 1 lên 2), commit và push.
sed -i 's/replicas: 1/replicas: 2/g' idp-gitops-repo/backstage/backstage-deployment.yaml
git add .
git commit -m "test: scale backstage to 2 replicas"
git push origin main
Chờ 1-2 phút, vào ArgoCD UI, bạn sẽ thấy Application `backstage` chuyển sang "OutOfSync". Nhấn "Sync" hoặc nếu cấu hình Auto-Sync, nó sẽ tự động sync. Sau đó kiểm tra số lượng Pod.
kubectl get pods -n idp -l app=backstage
Bạn sẽ thấy 2 Pod đang chạy, xác nhận quy trình GitOps đã hoạt động trọn vẹn từ Git đến Cluster.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Internal Developer Platform (IDP) với Backstage, Crossplane và GitOps trên Kubernetes để tối ưu trải nghiệm phát triển phần mềm
« Phần 3: Cấu hình Crossplane để quản lý tài nguyên hạ tầng
Phần 5: Tích hợp Backstage với Crossplane và GitOps »