Cài đặt và cấu hình ArgoCD
Bước đầu tiên là triển khai ArgoCD vào cluster Kubernetes để làm trung tâm điều phối GitOps. Chúng ta sẽ cài đặt qua Helm chart chính thức để đảm bảo tính tương thích và dễ bảo trì.
Tạo namespace riêng cho ArgoCD để cách ly tài nguyên và quản lý RBAC sau này.
kubectl create namespace argocd
Thêm Helm repository chính thức của ArgoCD và cập nhật local cache.
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
Cài đặt ArgoCD vào namespace vừa tạo với giá trị mặc định. Lưu ý, mặc định ArgoCD chạy trên port 80/443, bạn cần expose qua LoadBalancer hoặc NodePort tùy hạ tầng.
helm install argocd argo/argo-cd --namespace argocd --set controller.extraArgs[0]='--application.instanceLabelKey=argocd.argoproj.io/instance'
Verify: Kiểm tra trạng thái các pod trong namespace argocd, tất cả phải ở trạng thái Running.
kubectl get pods -n argocd
Để truy cập UI ban đầu, bạn cần lấy password admin mặc định và decode nó. Sau đó dùng kubectl port-forward để map port 80 của pod api-server về local machine.
argocd admin initial-password -n argocd
kubectl port-forward svc/argocd-server -n argocd 8080:80
Truy cập http://localhost:8080, login với username admin và password vừa decode. Tại đây bạn sẽ thấy dashboard trống, chưa có kết nối nào.
Cấu trúc Git Repository cho GitOps
Chúng ta cần chuẩn bị repository Git (GitLab, GitHub, hoặc Gitea) với cấu trúc cây thư mục rõ ràng để tách biệt Infrastructure (Crossplane) và Application (K8s Manifests). Cấu trúc này giúp ArgoCD sync đúng phạm vi và giảm xung đột.
Tạo thư mục gốc và cấu trúc con theo chuẩn GitOps. Thư mục infrastructure chứa các manifest Crossplane (XR, Claim), thư mục applications chứa Deployment, Service, ConfigMap của ứng dụng.
mkdir -p gitops-repo/{infrastructure,applications}
cd gitops-repo
Tạo file manifest Crossplane mẫu cho việc tạo VPC, Subnet và Database. File này sẽ nằm trong thư mục infrastructure. Đây là tài nguyên Compose (Composite Resource) mà Crossplane sẽ quản lý.
File: gitops-repo/infrastructure/aws-vpc.yaml
apiVersion: aws.upbound.io/v1beta1
kind: VPC
metadata:
name: dev-vpc
namespace: crossplane
spec:
forProvider:
region: us-east-1
cidrBlock: 10.0.0.0/16
enableDnsSupport: true
enableDnsHostnames: true
---
apiVersion: aws.upbound.io/v1beta1
kind: Subnet
metadata:
name: dev-subnet-public
namespace: crossplane
spec:
forProvider:
region: us-east-1
vpcIdSelector:
matchLabels:
crossplane.io/composite: dev-vpc
cidrBlock: 10.0.1.0/24
availabilityZone: us-east-1a
mapPublicIpOnLaunch: true
---
apiVersion: aws.upbound.io/v1beta1
kind: RDS
metadata:
name: dev-postgres
namespace: crossplane
spec:
forProvider:
region: us-east-1
engine: postgres
instanceClass: db.t3.micro
allocatedStorage: 20
dbSubnetGroup:
nameSelector:
matchLabels:
crossplane.io/composite: dev-subnet-public
publiclyAccessible: false
storageEncrypted: true
Tạo file manifest ứng dụng mẫu trong thư mục applications. File này mô tả một ứng dụng web đơn giản chạy trên K8s.
File: gitops-repo/applications/web-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: dev-app
spec:
replicas: 2
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-app-svc
namespace: dev-app
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 80
type: ClusterIP
Commit và push toàn bộ cấu trúc này lên remote repository Git. Đây là nguồn sự thật (Source of Truth) duy nhất.
cd gitops-repo
git init
git add .
git commit -m "Initial GitOps structure: Crossplane infra and K8s app"
git remote add origin
git push -u origin main
Verify: Kiểm tra trên web interface của Git provider (GitHub/GitLab) xem 2 file yaml đã được push thành công chưa.
Cấu hình ArgoCD Application để Sync Crossplane
Bây giờ cần cấu hình ArgoCD để nó nhận diện repository Git vừa tạo và tự động sync các manifest. Chúng ta sẽ tạo 2 đối tượng Application trong ArgoCD: một cho Infrastructure và một cho Application.
Tạo file cấu hình ArgoCD Application cho phần Infrastructure. Lưu ý phần source trỏ đúng vào thư mục infrastructure và destination trỏ vào namespace crossplane (hoặc cluster-local).
File: gitops-repo/argocd-apps/infrastructure.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: crossplane-infra
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL:
targetRevision: HEAD
path: infrastructure
destination:
server: https://kubernetes.default.svc
namespace: crossplane
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Tạo file cấu hình ArgoCD Application cho phần Application. Phần này trỏ vào thư mục applications và namespace dev-app.
File: gitops-repo/argocd-apps/applications.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: dev-applications
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL:
targetRevision: HEAD
path: applications
destination:
server: https://kubernetes.default.svc
namespace: dev-app
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Thêm thư mục argocd-apps vào git và push lên. Sau đó, vào UI của ArgoCD, nhấn nút "New App". Chọn "Git Repo URL" là URL của repo bạn, và "Path" trỏ vào argocd-apps. ArgoCD sẽ tự động phát hiện các file Application manifest trong đó.
mkdir -p gitops-repo/argocd-apps
mv gitops-repo/argocd-apps/infrastructure.yaml gitops-repo/argocd-apps/
mv gitops-repo/argocd-apps/applications.yaml gitops-repo/argocd-apps/
cd gitops-repo
git add .
git commit -m "Add ArgoCD Application manifests"
git push
Verify: Vào UI ArgoCD, bạn sẽ thấy 2 ứng dụng mới: crossplane-infra và dev-applications. Trạng thái ban đầu có thể là OutOfSync hoặc Syncing.
Minh họa: Tự động tạo VPC, Subnet và Database
Khi ArgoCD sync, nó sẽ áp dụng các manifest Crossplane lên cluster. Crossplane sau đó sẽ gọi API của AWS (hoặc provider khác) để tạo tài nguyên thực tế. Quá trình này gọi là "Reconciliation".
Nhấn nút "Sync" trên UI ArgoCD cho ứng dụng crossplane-infra. Chọn chế độ Apply để bắt đầu quá trình.
Theo dõi tiến trình sync. ArgoCD sẽ báo Synced khi nó đã áp dụng YAML lên K8s. Tuy nhiên, trạng thái tài nguyên thực tế (AWS) có thể chưa ổn định. Crossplane cần thời gian để gọi API AWS.
Verify: Kiểm tra trạng thái của các tài nguyên Crossplane trong cluster. Sử dụng lệnh kubectl để xem trạng thái Ready của VPC, Subnet và RDS.
kubectl get vpc -n crossplane
kubectl get subnet -n crossplane
kubectl get rds -n crossplane
Khi các tài nguyên có trạng thái Ready, hãy vào Console AWS để kiểm tra thực tế. Bạn sẽ thấy VPC, Subnet và Database RDS đã được tạo tự động với đúng cấu hình như trong file yaml.
Tiếp tục nhấn Sync cho ứng dụng dev-applications. ArgoCD sẽ tạo namespace dev-app và triển khai Deployment/Service.
kubectl get pods -n dev-app
kubectl get svc -n dev-app
Verify: Pods phải ở trạng thái Running và Service đã được expose. Nếu bạn thay đổi số lượng replica trong file applications/web-app.yaml và push lên Git, ArgoCD sẽ tự động phát hiện sự thay đổi và sync lại sau vài giây (tùy cấu hình refresh interval).
Cấu hình Policy Engine (OPA Gatekeeper) để kiểm duyệt
Để đảm bảo an toàn, chúng ta cần ngăn chặn các thay đổi hạ tầng không tuân thủ policy (ví dụ: tạo DB public, tạo pod không có resource limits). OPA Gatekeeper sẽ intercept các request từ ArgoCD/Crossplane trước khi áp dụng lên K8s.
Cài đặt OPA Gatekeeper vào cluster. Chúng ta sử dụng Helm chart chính thức của OPA.
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update
helm install gatekeeper gatekeeper/gatekeeper-crds --namespace gatekeeper-system
helm install gatekeeper gatekeeper/gatekeeper --namespace gatekeeper-system --set installCRDs=false
Tạo một Policy Constraint để ngăn chặn việc tạo RDS có tính chất publiclyAccessible là true. Đây là policy bảo mật quan trọng cho database.
File: gitops-repo/infrastructure/opa-constraints.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sDeny
metadata:
name: deny-public-rds
spec:
match:
kinds:
- apiGroups: ["aws.upbound.io"]
kinds: ["RDS"]
constraints:
parameters:
key: spec.forProvider.publiclyAccessible
values:
- true
message: "Creating public RDS instances is forbidden by security policy. Set publiclyAccessible to false."
Tạo Constraint Template tương ứng để định nghĩa logic kiểm tra. Tuy nhiên, với K8sDeny mặc định của Gatekeeper, chúng ta có thể dùng Constraint đơn giản nếu cấu trúc JSONPath phù hợp. Nếu cần logic phức tạp hơn, hãy dùng Custom Constraint.
Push file policy lên Git và sync ArgoCD. ArgoCD sẽ cố gắng áp dụng file này, Gatekeeper sẽ chặn nếu có vi phạm trong tương lai.
cd gitops-repo
git add infrastructure/opa-constraints.yaml
git commit -m "Add OPA Gatekeeper policy for RDS security"
git push
Verify: Thử tạo một manifest RDS mới có publiclyAccessible: true và push lên Git. ArgoCD sẽ báo lỗi Policy Violation và không sync được. Kiểm tra logs của Gatekeeper để xem chi tiết lỗi.
kubectl logs -l app=gatekeeper-controller-manager -n gatekeeper-system | grep "deny-public-rds"
Để kiểm tra policy đã được áp dụng, dùng lệnh kubectl get constraints.
kubectl get constraints
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống Platform Engineering nội bộ với Crossplane, Backstage và GitOps trên hạ tầng Kubernetes để tự động hóa môi trường Dev
« Phần 2: Triển khai và cấu hình Crossplane cho Infrastructure as Code
Phần 4: Cài đặt và tùy chỉnh Backstage để tạo Developer Portal »