+3

Series ArgoCD Thực chiến #3: Đóng gói bằng Helm & Ra lệnh cho Kẻ thực thi

1. Nỗi đau của YAML thuần và Sự cứu rỗi của Helm

Nếu chỉ dùng file YAML thuần của Kubernetes, bạn sẽ đối mặt với bài toán đa môi trường (Multi-environment) cực kỳ đau đầu.

  • Môi trường Staging (Test): Chỉ cần chạy 1 Pod Nginx, cấu hình RAM 256MB để tiết kiệm tiền server.
  • Môi trường Production (Chạy thật): Cần chạy 5 Pods Nginx, RAM 2GB để gánh hàng ngàn lượt quẹt thẻ.

Nếu dùng YAML thuần, bạn phải copy-paste ra 2 thư mục khác nhau. Đổi một biến môi trường là phải sửa ở 2 nơi. Rất dễ sai sót!

Helm giải quyết việc này thế nào? Helm biến file YAML thành một "Khuôn đúc" (Template). Những giá trị thay đổi được rút ra một file cấu hình gọi là values.yaml. Bạn chỉ cần giữ 1 bản Template duy nhất, và tạo ra 2 file values-staging.yaml và values-prod.yaml.

2. Tổ chức kho code chuẩn GitOps

Hãy mở cái Git Repository mà bạn đã kết nối với ArgoCD ở Bài 2 ra. Chúng ta sẽ tạo một cấu trúc thư mục như sau cho service lõi của hệ thống AFC:

afc-backend-repo/
├── charts/
│   └── afc-core-api/             <-- Tên Helm Chart của chúng ta
│       ├── Chart.yaml            <-- Khai báo thông tin Chart (Tên, phiên bản)
│       ├── templates/            
│       │   ├── deployment.yaml   <-- Khuôn đúc cho Pods (Có chứa các biến như {{ .Values.replicaCount }})
│       │   └── service.yaml      <-- Khuôn đúc cho Network
│       ├── values-staging.yaml   <-- Cấu hình cho môi trường Test (replicaCount: 1)
│       └── values-prod.yaml      <-- Cấu hình cho môi trường Thật (replicaCount: 5)

ArgoCD cực kỳ thông minh, nó có thể đọc hiểu cấu trúc Helm này một cách tự nhiên (Native) mà không cần bạn phải cài thêm bất kỳ plugin nào vào cụm K8s!

3. Khởi tạo "Bản Giao Kèo" (ArgoCD Application)

ArgoCD đã kết nối với Git, nhưng làm sao nó biết phải lấy thư mục nào, deploy vào Namespace nào trên Kubernetes? Chúng ta cần định nghĩa một Application CRD (Custom Resource Definition).

Đây là cách bạn ra lệnh cho ArgoCD. Tạo một file tên là afc-prod-app.yaml trên máy tính của bạn và dán nội dung này vào:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: afc-core-api-production
  namespace: argocd
spec:
  # 1. THÔNG TIN DỰ ÁN TRÊN ARGO
  project: default
  
  # 2. NGUỒN GỐC (SOURCE) - Lấy code từ đâu?
  source:
    repoURL: 'https://github.com/hieu-nguyen/afc-backend-repo.git' # Link repo Git của bạn
    targetRevision: main # Nhánh cần theo dõi
    path: charts/afc-core-api # Đường dẫn tới thư mục chứa Helm chart
    helm:
      # Báo cho ArgoCD biết hãy dùng file values này để render
      valueFiles:
        - values-prod.yaml 

  # 3. ĐÍCH ĐẾN (DESTINATION) - Deploy vào đâu?
  destination:
    server: 'https://kubernetes.default.svc' # Deploy thẳng vào cụm K8s đang chứa ArgoCD
    namespace: afc-production # Tên Namespace trên K8s muốn chạy ứng dụng

  # 4. CHÍNH SÁCH ĐỒNG BỘ (SYNC POLICY)
  syncPolicy:
    automated: # Bật tự động đồng bộ
      prune: true # Nếu xóa code trên Git, ArgoCD sẽ xóa Pod trên server (Cực kỳ quan trọng)
      selfHeal: true # Tự động sửa lỗi nếu có ai cố tình sửa cấu hình trực tiếp trên server
    syncOptions:
      - CreateNamespace=true # Tự động tạo Namespace nếu chưa có

4. Bấm nút kích hoạt và Tận hưởng ma thuật

Mọi thứ đã chuẩn bị xong. Mở Terminal và áp dụng "Bản giao kèo" này vào ArgoCD:

kubectl apply -f afc-prod-app.yaml

Ngay khoảnh khắc bạn gõ lệnh này, hãy nhanh tay quay lại giao diện Web UI của ArgoCD (truy cập localhost:8080 như bài trước).

Bạn sẽ thấy một khối vuông mang tên afc-core-api-production xuất hiện. Trạng thái của nó sẽ chuyển từ OutOfSync sang Syncing, và cuối cùng là một màu xanh lá cây tuyệt đẹp: Healthy.

Nhấp vào khối vuông đó, bạn sẽ thấy một sơ đồ mạng nhện (Topology) cực kỳ hoành tráng! ArgoCD vẽ ra chính xác cấu trúc hệ thống của bạn: Từ Helm Chart đẻ ra Deployment, từ Deployment đẻ ra ReplicaSet, và từ đó tỏa ra 5 cái Pod đang chạy thực tế trên server.

Bạn không cần gõ bất kỳ lệnh kubectl create nào, không cần chui vào server. Chỉ cần đẩy code lên Git, ArgoCD đã tự động kéo và dựng lên toàn bộ hệ thống lõi cho các trạm Metro!

Tổng kết Bài 3

Bạn đã chính thức làm chủ quy trình Deploy chuẩn GitOps. Việc kết hợp giữa sự linh hoạt của Helm Chart và khả năng tự động hóa giám sát của ArgoCD đã tạo ra một dây chuyền phân phối phần mềm an toàn, minh bạch và nhàn hạ nhất cho Backend Engineer.

Tuy nhiên, hiện tại ArgoCD chỉ mới bắt được sự thay đổi của cấu hình (file YAML trên Git). Khi bạn sửa code (ví dụ code PHP/Golang), hệ thống CI build ra một cái Docker Image mới (ví dụ từ v1.0 lên v2.0), làm sao để ArgoCD biết mà tự động cập nhật?

Ở Bài 4, bạn muốn chúng ta giải quyết bài toán này bằng cách cấu hình ArgoCD Image Updater (Để Argo tự "ngửi" thấy Image mới trên Docker Hub và tự cập nhật), hay muốn học cách triển khai tính năng Blue/Green Deployment với Argo Rollouts (Deploy phiên bản mới chạy song song bản cũ, test ok mới chuyển traffic sang)?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí