Cài đặt ArgoCD qua Helm và Cấu hình Giao diện
Đầu tiên, chúng ta cần thêm repository Helm chính thức của ArgoCD để truy cập vào các bản phát hành mới nhất.
helm repo add argo https://argoproj.github.io/argo-helm
Kết quả mong đợi: Thông báo "repository 'argo' added" xuất hiện trên terminal.
Tiếp theo, cập nhật repository để lấy metadata mới nhất.
helm repo update
Kết quả mong đợi: Danh sách các chart được cập nhật hiển thị.
Triển khai ArgoCD vào namespace riêng biệt (tên mặc định là argocd) bằng Helm.
kubectl create namespace argocd
helm install argocd argo/argo-cd --namespace argocd
Kết quả mong đợi: Các resource Kubernetes như Deployment, Service, ConfigMap được tạo thành công trong namespace argocd.
Để truy cập vào giao diện web ArgoCD, ta cần expose service loại NodePort hoặc LoadBalancer. Ở đây ta dùng NodePort cho môi trường phát triển.
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
Kết quả mong đợi: Service argocd-server được cập nhật loại NodePort.
Lấy password mặc định của admin để đăng nhập lần đầu.
kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d; echo
Kết quả mong đợi: Một chuỗi ký tự ngẫu nhiên (password) được in ra màn hình.
Kiểm tra trạng thái các pod của ArgoCD.
kubectl get pods -n argocd
Kết quả mong đợi: Tất cả các pod (argocd-applicationset-controller, argocd-cm, argocd-repo-server, argocd-server) đều ở trạng thái Running.
Thiết lập Kết nối giữa ArgoCD và Git Repository (App-of-Apps)
Trước khi cấu hình trong ArgoCD, ta cần tạo một cấu trúc repository Git theo mô hình App-of-Apps. Cấu trúc này giúp quản lý nhiều ứng dụng con từ một ứng dụng cha duy nhất.
Tạo thư mục làm việc cho dự án GitOps.
mkdir -p ~/gitops-repo/{apps,environments/{dev,prod}}
cd ~/gitops-repo
Khởi tạo repository Git.
git init
git config user.email "admin@example.com"
git config user.name "Admin"
Kết quả mong đợi: Repository Git được tạo sẵn sàng.
Tạo file định nghĩa ứng dụng cha (App-of-Apps) để ArgoCD tự động phát hiện các ứng dụng con. File này sẽ trỏ vào thư mục environments.
Đường dẫn: ~/gitops-repo/apps/app-of-apps.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: app-of-apps
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/tên-kho-git-của-bạn/tên-kho.git
targetRevision: HEAD
path: environments
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
selfHeal: true
Kết quả mong đợi: File YAML được tạo, chú ý thay thế "https://github.com/tên-kho-git-của-bạn/tên-kho.git" bằng đường dẫn Git thật của bạn.
Tạo file cấu hình môi trường Dev trong thư mục environments/dev. Đây sẽ là ứng dụng con đầu tiên.
Đường dẫn: ~/gitops-repo/environments/dev/app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sample-app-dev
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/tên-kho-git-của-bạn/tên-kho.git
targetRevision: HEAD
path: apps/sample-app
kustomize:
namePrefix: dev-
images:
- name: sample-app
newName: registry.example.com/sample-app
newTag: latest
destination:
server: https://kubernetes.default.svc
namespace: dev
syncPolicy:
automated:
prune: true
selfHeal: true
Kết quả mong đợi: File định nghĩa ứng dụng sample-app cho môi trường Dev được tạo.
Cam kết (commit) toàn bộ cấu trúc vào Git.
git add .
git commit -m "Initial commit: App-of-Apps structure"
Kết quả mong đợi: Code được lưu vào local git repository.
Quay lại giao diện web ArgoCD (hoặc dùng CLI), kết nối ArgoCD với Git repository vừa tạo.
argocd repo add https://github.com/tên-kho-git-của-bạn/tên-kho.git --upstream-https-only
Kết quả mong đợi: Thông báo "Repository added successfully".
Tạo ứng dụng cha (App-of-Apps) trong ArgoCD để kích hoạt quá trình sync.
argocd app create app-of-apps --repo https://github.com/tên-kho-git-của-bạn/tên-kho.git --path apps/app-of-apps --dest-server https://kubernetes.default.svc --dest-namespace argocd
Kết quả mong đợi: ArgoCD tạo ứng dụng "app-of-apps" và bắt đầu sync.
Kiểm tra trạng thái sync của ứng dụng cha.
argocd app get app-of-apps
Kết quả mong đợi: Trạng thái Sync là "Synced" và Health là "Healthy". ArgoCD đã tự động phát hiện và tạo ứng dụng con "sample-app-dev" từ thư mục environments/dev.
Cấu hình Ứng dụng Mẫu và Tự động Sync
Bây giờ ta tạo một ứng dụng mẫu đơn giản (ví dụ: Nginx) để minh họa quy trình tự động hóa.
Tạo thư mục cho ứng dụng mẫu.
mkdir -p ~/gitops-repo/apps/sample-app
Tạo file deployment mẫu cho Nginx.
Đường dẫn: ~/gitops-repo/apps/sample-app/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
labels:
app: sample-app
spec:
replicas: 1
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
Kết quả mong đợi: File deployment YAML được tạo.
Tạo file service mẫu cho Nginx.
Đường dẫn: ~/gitops-repo/apps/sample-app/service.yaml
apiVersion: v1
kind: Service
metadata:
name: sample-app
labels:
app: sample-app
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
app: sample-app
Kết quả mong đợi: File service YAML được tạo.
Cam kết thay đổi vào Git.
cd ~/gitops-repo
git add .
git commit -m "Add sample-app manifests"
Kết quả mong đợi: Commit thành công.
ArgoCD sẽ tự động phát hiện thay đổi trong Git (nếu đã bật auto-sync) và triển khai ứng dụng này vào cluster.
Kiểm tra trạng thái của ứng dụng con "sample-app-dev".
argocd app get sample-app-dev
Kết quả mong đợi: Trạng thái Sync là "Synced", Health là "Healthy", và số lượng resource được quản lý tăng lên.
Xác nhận ứng dụng đã chạy trên Kubernetes.
kubectl get pods -n dev
Kết quả mong đợi: Pod "sample-app-..." (có thể có prefix dev- tùy cấu hình kustomize) đang ở trạng thái Running.
Sử dụng Kustomize để Quản lý Môi trường Dev và Prod
Để tách biệt cấu hình giữa Dev và Prod mà không cần nhân bản file YAML, ta sử dụng Kustomize.
Tạo thư mục Kustomize cho môi trường Prod trong Git.
mkdir -p ~/gitops-repo/environments/prod
Tạo file kustomization.yaml cho môi trường Prod. File này sẽ trỏ về thư mục manifests gốc và áp dụng các overlay riêng.
Đường dẫn: ~/gitops-repo/environments/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../apps/sample-app
namePrefix: prod-
commonLabels:
environment: production
images:
- name: nginx
newName: registry.example.com/nginx
newTag: 1.21-alpine
patches:
- target:
kind: Deployment
name: sample-app
patch: |-
- op: replace
path: /spec/replicas
value: 3
Kết quả mong đợi: File kustomization.yaml được tạo, cấu hình 3 replicas và tag image stable cho Prod.
Tạo file Application cho môi trường Prod để ArgoCD quản lý.
Đường dẫn: ~/gitops-repo/environments/prod/app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sample-app-prod
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/tên-kho-git-của-bạn/tên-kho.git
targetRevision: HEAD
path: environments/prod
kustomize:
namePrefix: prod-
destination:
server: https://kubernetes.default.svc
namespace: prod
syncPolicy:
automated:
prune: true
selfHeal: true
Kết quả mong đợi: File định nghĩa ứng dụng Prod được tạo.
Tạo namespace prod trong Kubernetes để chứa ứng dụng.
kubectl create namespace prod
Kết quả mong đợi: Namespace prod được tạo.
Cam kết toàn bộ cấu hình mới vào Git.
git add .
git commit -m "Add Prod environment with Kustomize overlay"
Kết quả mong đợi: Commit thành công.
ArgoCD (qua App-of-Apps) sẽ tự động sync và tạo ứng dụng "sample-app-prod".
Kiểm tra trạng thái ứng dụng Prod.
argocd app get sample-app-prod
Kết quả mong đợi: Trạng thái Sync là "Synced", Health là "Healthy".
Xác nhận cấu hình Kustomize đã áp dụng đúng (3 replicas, prefix prod-).
kubectl get pods -n prod
Kết quả mong đợi: Có 3 pod chạy với tên bắt đầu bằng "prod-sample-app".
Kiểm tra số lượng pod để so sánh sự khác biệt giữa Dev (1 replica) và Prod (3 replicas).
kubectl get pods -n dev
kubectl get pods -n prod
Kết quả mong đợi: Namespace dev có 1 pod, namespace prod có 3 pod.
Verify Tổng thể Hệ thống
Kiểm tra danh sách tất cả các ứng dụng đang được ArgoCD quản lý.
argocd app list
Kết quả mong đợi: Danh sách hiển thị 3 ứng dụng: app-of-apps, sample-app-dev, sample-app-prod đều ở trạng thái "Synced" và "Healthy".
Kiểm tra chi tiết cấu hình Kustomize đã render ra thế nào trong ArgoCD.
argocd app get sample-app-prod --yaml
Kết quả mong đợi: Output YAML hiển thị manifest đã được Kustomize biến đổi (có 3 replicas, tag image mới, prefix prod-).
Thực hiện một thay đổi nhỏ trên file manifest gốc để test tự động sync.
cd ~/gitops-repo/apps/sample-app
echo " env:" >> deployment.yaml
echo " - name: TEST_VAR" >> deployment.yaml
echo " value: 'updated'" >> deployment.yaml
git add .
git commit -m "Add env var to sample-app"
Kết quả mong đợi: Commit thành công.
Chờ khoảng 30 giây và kiểm tra trạng thái sync của cả Dev và Prod.
argocd app list
Kết quả mong đợi: Cả hai ứng dụng Dev và Prod đều chuyển trạng thái từ "Synced" sang "OutOfSync" và sau đó quay lại "Synced" tự động.
Xác nhận biến môi trường đã được cập nhật trên pod.
kubectl exec -n dev deployment/sample-app-dev -- env | grep TEST_VAR
kubectl exec -n prod deployment/prod-sample-app -- env | grep TEST_VAR
Kết quả mong đợi: Biến TEST_VAR xuất hiện trong cả 2 môi trường với giá trị "updated".
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống CI/CD an toàn và tự động hóa cho Kubernetes với ArgoCD, Tekton và HashiCorp Vault
« Phần 3: Xây dựng pipeline CI với Tekton
Phần 5: Tích hợp Vault vào pipeline CI và quy trình deploy »