Series ngắn về cách sử dụng ArgoCD:
- Getting Started
- Core concepts
- Private Repo
- ArgoCD Architecture
- Work with Helm
- Work with Kustomize
- Resource hooks
- Secret Management with GitOps
- Application Set
- Multi Cluster
- Enterprise features (SSO)
Để dễ dàng trong việc quản lý và triển khai, thường thì chúng ta không viết tệp tin tài nguyên Kubernetes trực tiếp mà đóng gói thành gói (package) và sử dụng Helm để quản lý. Ví dụ ta cần triển khai Redis ở chế độ master-slave bằng cách viết tệp tin YAML thuần cho từng tài nguyên:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
namespace: default
spec:
serviceName: "redis"
replicas: 3 # One master and two replicas
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:latest
command: ["redis-server"]
args: ["/etc/redis/redis.conf"]
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: /data
- name: redis-config
mountPath: /etc/redis
initContainers:
- name: init-redis-config
image: busybox
command: ['sh', '-c', 'if [ "$(hostname)" == "redis-0" ]; then cp /etc/redis/master.conf /etc/redis/redis.conf; else cp /etc/redis/slave.conf /etc/redis/redis.conf; fi']
volumeMounts:
- name: redis-config
mountPath: /etc/redis
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
clusterIP: None # Headless service for StatefulSet
ports:
- port: 6379
targetPort: 6379
protocol: TCP
selector:
app: redis
---
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-configs
data:
master.conf: |
bind 0.0.0.0
protected-mode yes
port 6379
dir /data
slave.conf: |
bind 0.0.0.0
protected-mode yes
port 6379
dir /data
replicaof redis-0.default.svc.cluster.local 6379 # Point to the master instance
Thay vì phải sao chép toàn bộ tài nguyên trong tệp tin ra một tệp tin khác và sửa đổi các thông số mỗi lần triển khai, chúng ta có thể áp dụng các phương pháp quản lý cấu hình hiệu quả hơn, đó là dùng Helm.
Helm
Chúng ta có thể đóng gói toàn bộ tài nguyên vào một gói (package) và sử dụng Helm để quản lý. Đối với các công nghệ phổ biến như Redis, Postgres, ClickHouse, ... cộng đồng hỗ trợ rất nhiều, và chúng ta có thể sử dụng chúng thay vì tự viết, trừ những trường hợp đặc biệt. Dưới đây là ví dụ về cách triển khai Redis bằng Helm:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install my-redis bitnami/redis \
--set password=secretpassword \
--set replication.enabled=true \
--set replication.slaveCount=1
Mỗi khi cần triển khai một cụm mới, chúng ta chỉ cần chạy câu lệnh trên là đủ. Tuy nhiên, việc triển khai Redis bằng cách thủ công thông qua Helm CLI có thể gây khó khăn trong việc quản lý các thay đổi. ArgoCD hỗ trợ triển khai Helm thông qua việc sử dụng Application.
ArgoCD with Helm
Để triển khai Redis bằng Helm và ArgoCD, ta khai báo tệp tin redis-helm.yaml
như sau:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: redis-helm-app
namespace: argocd
spec:
project: default
source:
repoURL: 'https://charts.bitnami.com/bitnami'
chart: redis
targetRevision: 17.11.3 # Use the desired version of the chart
helm:
releaseName: redis
parameters:
- name: password
value: "your-redis-password" # Set your Redis password here
- name: replication.enabled
value: "true"
- name: replication.slaveCount
value: "2" # Number of replicas you want to create
destination:
server: 'https://kubernetes.default.svc'
syncPolicy:
automated:
prune: true
selfHeal: true
Chỗ cần thay đổi so với Application cho tệp tin tài nguyên thuần là mục source:
- repoURL: đường dẫn của kho Helm Chart
- chart: chọn chart để triển khai
- targetRevision: phiên bản
- helm:
- parameters: chỉ định các thông số ta cần truyền vào
Chạy câu lệnh apply:
kubectl apply -f redis-helm.yaml
Truy cập UI ta sẽ thấy Application cho Redis đang được tạo:
Đợi Redis tạo thành công:
GitOps
Ở trên là cách chúng ta sử dụng Application để triển khai Redis với Helm. Tuy nhiên, để quản lý toàn bộ thay đổi thông qua Git và tuân thủ đúng chuẩn GitOps, chúng ta cần thực hiện các bước tương tự như khi triển khai ứng dụng Book Info. Cụ thể, chúng ta sẽ tạo một Git Repository với hai tệp tin như bên dưới và sau đó tạo một Argo Application cho Repository đó.
├── Chart.yaml
└── values.yaml
Nội dung Chart.yaml
:
apiVersion: v2
name: redis
description: A Helm chart for redis
type: application
version: 17.11.3
dependencies:
- name: redis
version: 17.11.3
repository: https://charts.bitnami.com/bitnami
Nội dung values.yaml
:
redis:
password: your-redis-password
replication:
enabled: true
slaveCount: 2
Tham khảo https://github.com/hoalongnatsu/argocd-series/tree/main/05-gitops/gitops. Tạo tệp tin app.yaml
để khai báo Argo Application:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: redis
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/hoalongnatsu/argocd-series'
targetRevision: HEAD
path: '05-gitops/gitops'
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
Chạy lệnh apply:
kubectl apply -f app.yaml
Chờ cho Redis tạo thành công:
Bất kỳ thay đổi nào đối với Redis đều cần phải sửa tệp tin values.yaml và thực hiện merge vào Git. Việc sử dụng Helm giúp chúng ta dễ dàng triển khai ứng dụng, kết hợp với ArgoCD hỗ trợ quản lý các thay đổi của Helm Chart thông qua Git ⇒ việc quản lý và triển khai ứng dụng sẽ trở nên chuyên nghiệp hơn.
Bài tiếp theo ta sẽ tìm hiểu cách sử dụng ArgoCD với Kustomize.
Đ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