Series ngắn về cách sử dụng ArgoCD:
- Getting Started
- Core concepts
- Private Repo
- ArgoCD Architecture
- Work with Kustomize and Helm
- Resource hooks
- Application Set
- Multi Cluster
- Enterprise features (SSO)
Core concepts
Hai khái niệm chính trong ArgoCD là Application và Project:
- Application là một cấu hình mô tả trạng thái mong muốn của một ứng dụng chạy trên Kubernetes
- Project giúp tổ chức và quản lý nhiều Application, mặc định ArgoCD tạo một Project có tên là default
Application
Ta sử dụng Application để xác định Git Repository chứa các Kubernetes Resource ta muốn triển khai. Ở bài trước ta đã dùng UI của ArgoCD để tạo Application.
Cấu trúc của một Application bao gồm các trường thông tin như:
- Source: địa chỉ Git repository hoặc Helm chart chứa mã nguồn và cấu hình của ứng dụng
- Destination: cluster và namespace nơi ứng dụng sẽ được triển khai
- Project: dự án mà Application thuộc về
Để tạo Application ta có nhiều cách như tạo bằng UI, sử dụng CLI hoặc định nghĩa Application trong tệp tin YAML. Với cách dùng CLI thì ta chạy câu lệnh như sau:
argocd app create bookinfo \
--repo https://github.com/hoalongnatsu/istio-microservice-book-info \
--path . \
--dest-server https://kubernetes.default.svc \
--dest-namespace default
Tuy nhiên, việc tạo Application bằng UI hoặc CLI gây khó khăn trong quản lý và khôi phục. Ví dụ, nếu ArgoCD gặp sự cố nghiêm trọng và không có bản sao lưu, việc tạo lại toàn bộ Application sẽ tốn nhiều thời gian. Vì vậy, để triển khai ứng dụng một cách chuyên nghiệp, thông thường ta sử dụng tệp tin YAML (hoặc nâng cao hơn là dùng Application Set, sẽ được đề cập trong bài sau). Dưới đây là cách định nghĩa một Application bằng tệp tin YAML:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bookinfo
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/hoalongnatsu/istio-microservice-book-info.git'
targetRevision: HEAD
path: .
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
Cấu trúc lại cách triển khai Microservice Book Info
Trong bài trước, chúng ta đã triển khai ứng dụng Book Info, bao gồm các service sau:
- Products Service
- Details Service
- Reviews Service
- Ratings Service
Chúng ta đã đặt toàn bộ tệp tin Kubernetes YAML cho từng Service trong cùng một repository và tạo một Application duy nhất để đồng bộ hóa toàn bộ Microservice:
Việc triển khai tất cả trong một Application sẽ làm chậm quá trình Sync và gây khó khăn khi cập nhật từng Service riêng lẻ. Do đó, ta nên cấu trúc lại bằng cách tạo một Application riêng cho mỗi Service. Tham khảo repo: https://github.com/hoalongnatsu/argocd-series/tree/main/01.
.
├── apps.yaml
├── details
│ └── bookinfo-details.yaml
├── products
│ └── bookinfo-products.yaml
├── ratings
│ └── bookinfo-ratings.yaml
└── reviews
└── bookinfo-reviews.yaml
Tiếp đó ta tạo định nghĩa tệp tin YAML cho từng Application, tạo tệp tin tên là apps.yaml
như sau:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bookinfo-details
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/hoalongnatsu/argocd-series'
targetRevision: HEAD
path: '01/details'
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bookinfo-products
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/hoalongnatsu/argocd-series'
targetRevision: HEAD
path: '01/products'
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bookinfo-ratings
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/hoalongnatsu/argocd-series'
targetRevision: HEAD
path: '01/ratings'
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bookinfo-reviews
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/hoalongnatsu/argocd-series'
targetRevision: HEAD
path: '01/reviews'
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
Chạy câu lệnh apply:
k apply -f apps.yaml
application.argoproj.io/bookinfo-details created
application.argoproj.io/bookinfo-products created
application.argoproj.io/bookinfo-ratings created
application.argoproj.io/bookinfo-reviews created
Kiểm tra UI ta thấy bốn Application được tạo:
Định nghĩa Application trong YAML và sử dụng kubectl apply để tạo Application có vẻ chuyên nghiệp hơn cách tạo trên UI. Tuy nhiên, đây vẫn là một phương pháp thủ công. Ở bài về Application Set, chúng ta sẽ tìm hiểu cách tự động tạo Application cho từng Service.
Project
Argo CD Applications cung cấp một cách linh hoạt để quản lý các ứng dụng khác nhau một cách độc lập. Tuy nhiên, nó không hỗ trợ việc nhiều đội làm việc trên ArgoCD với các cấp độ truy cập khác nhau. Các đội khác nhau thường cần được cấp quyền truy cập ở các mức độ khác nhau.
Ví dụ đội phát triển Reviews Service chỉ được thấy và quản lý Reviews Service và Ratings Service trên ArgoCD. Hoặc tech lead chỉ có thể thấy và truy cập toàn bộ Application của môi trường Kubernetes Dev trên ArgoCD, còn Production thì chỉ có DevOps. Project ra đời nhằm đơn giản hóa việc quản lý và phân quyền truy cập cho nhiều Application.
Ví dụ tệp tin YAML định nghĩa Project:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: dev
namespace: argocd
spec:
description: "Project for managing applications in ArgoCD"
sourceRepos:
- '*'
destinations:
- server: 'https://kubernetes.default.svc'
namespace: '*'
roles:
- name: read-only
description: Read-only access to applications in this project
policies:
- p, role:read-only, applications, get, dev/*, allow
groups:
- role:read-only-group
- name: admin
description: Admin access to applications in this project
policies:
- p, role:admin, applications, *, dev/*, allow
groups:
- role:admin-group
Bài tiếp theo ta sẽ tìm hiểu về cách kết nối ArgoCD tới Private Repo.
Điểm hẹn ngân hàng số Vikki by HDBank
Loạt bài viết ngắn chia sẻ về kiến trúc hạ tầng của hệ thống ngân hàng trên Cloud (AWS). Đây chỉ là những kiến thức mình học được thông qua sản phẩm NGÂN HÀNG SỐ VIKKI của bên mình, nên kiến trúc có thể phù hợp và không phù hợp với doanh nghiệp của các bạn.
- AWS Account Management
- Provisioning Infrastructure for Multi AWS Accounts
- Networking for Multi AWS Accounts
- Kubernetes for Multi AWS Accounts: Kubernetes Infrastructure for Scale
- Kubernetes for Multi AWS Accounts: Kubernetes Cross Cluster Communication
- Chaos Engineering
- On-call
- Core Banking on Cloud
- Security Consider