1. Tổng quan về dự án Helmfile và giá trị cốt lõi
Nếu bạn đã làm việc lâu dài trong hệ sinh thái Kubernetes, chắc hẳn bạn đã từng trải qua những khó khăn khi quản lý hàng chục hoặc hàng trăm bản phát hành Helm (Helm Release), đặc biệt là khi phải quản lý trên nhiều môi trường (phát triển, thử nghiệm, sản xuất). Việc quản lý các tệp values.yaml rời rạc và việc chạy lệnh helm install/upgrade thủ công có thể trở thành một cơn ác mộng vận hành. Helmfile giải quyết vấn đề này bằng cách đưa ra một cách tiếp cận khai báo giúp quản lý dễ dàng hơn.
Helmfile là một công cụ để triển khai và quản lý các biểu đồ Helm (Helm Chart) theo kiểu khai báo. Nó không thay thế Helm mà hoạt động như một "bộ điều phối" và "quản lý trạng thái". Bạn có thể coi nó như Terraform cho Helm trong lĩnh vực Kubernetes: bạn viết một hoặc nhiều tệp helmfile.yaml, định nghĩa tất cả các bản phát hành Helm mong muốn trong cụm của mình, sau đó chạy lệnh helmfile apply để Helmfile tự động đồng bộ trạng thái hiện tại với trạng thái mong muốn.
2. Thiết kế cốt lõi và kiến trúc của Helmfile
2.1 Quản lý trạng thái khai báo: Từ "làm gì" đến "là gì"
Helmfile nâng cao tính khai báo so với Helm. Thay vì chỉ định các lệnh cụ thể như helm install my-app ./chart -f values.yaml, Helmfile yêu cầu bạn mô tả trạng thái mong muốn của cụm: nên có một bản phát hành tên my-app sử dụng biểu đồ ./chart với cấu hình từ values.yaml. Helmfile sẽ đảm bảo trạng thái thực tế khớp với trạng thái mong muốn.
Cơ chế này dựa trên hai thành phần chính: plugin helm-diff và engine tính toán trạng thái của Helmfile. Khi chạy helmfile apply, Helmfile sẽ gọi helm-diff để so sánh trạng thái hiện tại của mỗi bản phát hành với mục tiêu được định nghĩa trong helmfile.yaml. Dựa vào kết quả so sánh, Helmfile sẽ quyết định cần thực hiện helm upgrade, helm install hay helm uninstall.
2.2 Mô-đun hóa và tái sử dụng: Xây dựng thư viện cơ sở hạ tầng như mã
Khi ứng dụng của bạn trở nên phức tạp, việc duy trì một tệp helmfile.yaml lớn có thể khó khăn. Helmfile cung cấp các cơ chế "tham chiếu" và "mẫu" để giải quyết vấn đề này.
1. Phân tách môi trường và kế thừa tệp giá trị:
# helmfile.yaml
environments:
production:
values:
- env/production/values.yaml
staging:
values:
- env/staging/values.yaml
releases:
- name: mywebapp
namespace: {{ .Environment.Name }}
chart: stable/nginx-ingress
values:
- "values/{{ .Environment.Name }}/ingress-values.yaml"
- {{ .Values | toYaml | nindent 8 }}
Trong ví dụ này, {{ .Environment.Name }} và {{ .Values }} là biến mẫu. Khi chạy helmfile -e production apply, Helmfile sẽ render mẫu và tạo cấu hình cụ thể cho môi trường production.
2. Sử dụng bases để kế thừa cấu hình:
# base.yaml
repositories:
- name: prometheus-community
url: https://prometheus-community.github.io/helm-charts
- name: bitnami
url: https://charts.bitnami.com/bitnami
# helmfile.yaml
bases:
- ./base.yaml
releases:
- name: prometheus
chart: prometheus-community/prometheus
Điều này giúp tránh việc định nghĩa lại các kho lưu trữ ở nhiều nơi.
3. Mô-đun hóa nâng cao với helmfiles:
# helmfile.yaml
helmfiles:
- path: ./monitoring/helmfile.yaml
values:
- ./monitoring/env/{{ .Environment.Name }}/values.yaml
- path: ./logging/helmfile.yaml
3. Cài đặt và khởi tạo Helmfile từ đầu
3.1 Cài đặt nhị phân Helmfile
Đảm bảo rằng bạn đã cài đặt các phụ thuộc cần thiết cho Helmfile, bao gồm Helm và plugin helm-diff.
Có nhiều cách để cài đặt Helmfile:
- Tải trực tiếp nhị phân:
wget https://github.com/helmfile/helmfile/releases/download/v1.1.0/helmfile_1.1.0_linux_amd64.tar.gz
tar -zxvf helmfile_1.1.0_linux_amd64.tar.gz
sudo mv helmfile /usr/local/bin/
helmfile --version
- Sử dụng trình quản lý gói:
- macOS (Homebrew):
brew install helmfile - Linux (một số bản phân phối):
- Arch:
pacman -S helmfile - openSUSE Tumbleweed:
zypper in helmfile - Windows (Scoop):
scoop install helmfile - Công cụ quản lý phiên bản (mise):
mise use -g helmfile@latest
- Sử dụng image container:
docker pull ghcr.io/helmfile/helmfile:latest
docker run --rm -v $(pwd):/work -v ~/.kube:/root/.kube -w /work ghcr.io/helmfile/helmfile:latest apply
3.2 Khởi tạo môi trường Helmfile
Chạy lệnh sau trong thư mục dự án của bạn:
helmfile init
Lệnh này sẽ kiểm tra và cài đặt các plugin cần thiết cho Helmfile, chủ yếu là helm-diff.
3.3 Quy hoạch cấu trúc dự án
Một cấu trúc dự án rõ ràng là chìa khóa để sử dụng Helmfile hiệu quả:
my-helmfile-project/
├── helmfile.yaml # Tệp nhập chính
├── environments/ # Cấu hình môi trường
│ ├── production/
│ │ └── values.yaml # Biến toàn cục cho môi trường production
│ └── staging/
│ └── values.yaml # Biến toàn cục cho môi trường staging
├── releases/ # Định nghĩa các bản phát hành
│ ├── nginx-ingress.yaml
│ ├── cert-manager.yaml
│ └── my-app/
│ ├── helmfile.yaml # Ứng dụng phức tạp có thể có helmfile riêng
│ └── values/
│ ├── common.yaml
│ ├── production.yaml
│ └── staging.yaml
├── charts/ # Các biểu đồ phát triển cục bộ (tùy chọn)
│ └── my-custom-chart/
└── vendor/ # Các biểu đồ từ xa được kéo bởi `helmfile deps` (tùy chọn)
4. Thực hành sâu hơn: Viết và quản lý cấu hình Helmfile phức tạp
4.1 Viết tệp helmfile.yaml đầu tiên
Bắt đầu với ví dụ đơn giản nhất, triển khai Prometheus:
# helmfile.yaml
repositories:
- name: prometheus-community
url: https://prometheus-community.github.io/helm-charts
releases:
- name: cluster-monitoring
namespace: monitoring
chart: prometheus-community/prometheus
version: ~25.0.0
values:
- ./values/prometheus/alertmanager-persistence.yaml
- ./values/prometheus/server-persistence.yaml
set:
- name: alertmanager.persistentVolume.storageClass
value: "fast-ssd"
- name: server.persistentVolume.storageClass
value: "fast-ssd"
Sau khi lưu tệp, chạy helmfile apply. Helmfile sẽ thêm kho lưu trữ prometheus-community, kiểm tra và tạo namespace nếu cần, so sánh trạng thái hiện tại với định nghĩa và áp dụng các thay đổi.
4.2 Sử dụng nhãn để nhóm và triển khai chọn lọc
Khi có nhiều bản phát hành, bạn có thể không muốn triển khai tất cả cùng một lúc. Chức năng labels của Helmfile rất hữu ích:
releases:
- name: ingress-nginx
namespace: ingress-nginx
chart: ingress-nginx/ingress-nginx
version: 4.0.0
labels:
component: infrastructure
tier: network
- name: cert-manager
namespace: cert-manager
chart: jetstack/cert-manager
version: v1.11.0
labels:
component: infrastructure
tier: security
- name: my-backend-api
namespace: app
chart: ./charts/my-api
labels:
component: application
tier: backend
Bạn có thể chọn các bản phát hành để hoạt động bằng nhãn:
# Chỉ triển khai lớp cơ sở hạ tầng
helmfile -l component=infrastructure apply
# Chỉ triển khai các thành phần liên quan đến mạng
helmfile -l tier=network apply
# Triển khai tất cả trừ ứng dụng back-end
helmfile -l component!=application apply
5. Lưu lượng vận hành, vấn đề thường gặp và kỹ thuật khắc phục sự cố
5.1 Lưu lượng GitOps chuẩn
- Phát triển cục bộ: Sửa đổi
helmfile.yamlhoặc các tệpvalues.yamlliên quan trên nhánh tính năng. - Kiểm tra và Diff: Chạy
helmfile diff --context 5để xem chi tiết các thay đổi. - Áp dụng thay đổi: Nếu mọi thứ ổn, chạy
helmfile apply. - Gửi và hợp nhất: Gửi các thay đổi lên Git.
- Dòng CI/CD: Cấu hình dòng CI/CD để tự động thực hiện
helmfile applytrên cụm đích sau khi hợp nhất vào nhánh chính.
5.2 Bảng tra cứu nhanh các lệnh phổ biến
| Lệnh | Mô tả | Tham số phổ biến |
|---|---|---|
helmfile apply |
Đồng bộ trạng thái cụm với trạng thái khai báo | -e ENV, -l LABEL, --skip-diff |
helmfile diff |
Hiển thị sự khác biệt giữa trạng thái hiện tại và khai báo | --context N, --detailed-exitcode |
helmfile sync |
Tương đương với apply |
Tương tự apply |
helmfile destroy |
Xóa tất cả bản phát hành đã khai báo | -e, -l |
helmfile list |
Liệt kê tất cả bản phát hành được định nghĩa trong helmfile.yaml |
-e, -l |
helmfile status |
Hiển thị trạng thái của các bản phát hành đã triển khai | -e, -l |
helmfile deps |
Cập nhật phụ thuộc (tải biểu đồ về vendor) |
|
helmfile lint |
Chạy helm lint trên biểu đồ cục bộ |
-e, -l |
helmfile template |
Render mẫu và xuất ra danh sách tài nguyên Kubernetes | --output-dir DIR |
Helmfile,Kubernetes,GitOps,Helm