Giới thiệu về Helmfile
Để vận hành hiệu quả trên Kubernetes, việc nắm vững Helm là bước đầu tiên cần thiết. Helm đóng vai trò là công cụ quản lý gói tiêu chuẩn, giúp đóng gói và triển khai các ứng dụng. Tuy nhiên, trong thực tế, chúng ta thường phải đối mặt với các thách thức như quản lý nhiều chart cùng lúc, phân tách cấu hình cho các môi trường khác nhau (development, staging, production) và kiểm soát phiên bản. Helmfile ra đời để giải quyết những vấn đề này.
Thông qua file khai báo helmfile.yaml, công cụ này cho phép định nghĩa trạng thái mong muốn của cụm cluster, hỗ trợ phân tách môi trường rõ ràng và tích hợp kiểm soát phiên bản chặt chẽ.
Kịch bản sử dụng thực tế
Trong các hệ thống cloud公有 (public cloud) hoặc private cloud, một sản phẩm thường cần được triển khai trên nhiều môi trường khác nhau. Mỗi môi trường sẽ có các cấu hình đặc thù như địa chỉ database, thông tin kết nối message queue, hoặc các credential bảo mật. Việc duy trì riêng biệt các file cấu hình cho từng môi trường dễ dẫn đến sai sót khi cập nhật, gây khó khăn cho đội ngũ vận hành (Ops) và tiềm ẩn rủi ro bảo mật nếu quản lý secret không đúng cách.
Giải pháp tối ưu là chuyển đổi các file部署 (deployment) thành Helm Chart và sử dụng Helmfile để quản lý tập trung. Kết hợp với plugin helm-secrets, chúng ta có thể mã hóa các thông tin nhạy cảm, đảm bảo an toàn trong quy trình CI/CD mà vẫn giảm thiểu độ phức tạp khi vận hành.
Cài đặt Helmfile
Người dùng có thể tải binary trực tiếp từ trang phát hành chính thức. Ngoài ra, để thuận tiện cho việc tích hợp vào quy trình CI/CD, Helmfile cung cấp image Docker sẵn sàng sử dụng. Dưới đây là ví dụ chạy Helmfile thông qua container:
# Đối với Helm 2
$ docker run --rm --net=host -v "${HOME}/.kube:/root/.kube" -v "${HOME}/.helm:/root/.helm" -v "${PWD}:/workspace" --workdir /workspace ghcr.io/helmfile/helmfile:v0.158.0 helmfile sync
# Đối với Helm 3
$ docker run --rm --net=host -v "${HOME}/.kube:/root/.kube" -v "${HOME}/.config/helm:/root/.config/helm" -v "${PWD}:/workspace" --workdir /workspace ghcr.io/helmfile/helmfile:v0.158.0 helmfile sync
Cấu hình helmfile.yaml
File helmfile.yaml là trái tim của công cụ, nơi khai báo toàn bộ cấu hình triển khai. Dưới đây là cấu trúc cơ bản với các thành phần chính:
# Khai báo các repository chứa chart
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
# Cấu hình bảo mật nếu cần
# certFile: path/to/cert
# keyFile: path/to/key
# username: user
# password: pass
# Đường dẫn tới binary helm cụ thể
helmBinary: /usr/local/bin/helm3
# Các thiết lập mặc định cho helm
helmDefaults:
tillerNamespace: tiller-system
tillerless: true
kubeContext: my-k8s-context
cleanupOnFail: true
args:
- "--timeout=10m"
verify: false
wait: true
timeout: 600
recreatePods: false
force: false
createNamespace: true
# Nhãn chung áp dụng cho tất cả các release
commonLabels:
managedBy: helmfile
team: devops
# Danh sách các release cần triển khai
releases:
# Ví dụ chart từ remote repository
- name: redis-cluster
namespace: data-layer
createNamespace: true
labels:
tier: database
chart: bitnami/redis
version: 17.x.x
condition: redis.enabled
missingFileHandler: Warn
values:
- config/redis-values.yaml
- password: {{ requiredEnv "REDIS_PASSWORD" | quote }}
- architecture: replication
- master:
persistence:
size: 8Gi
set:
- name: global.storageClass
value: standard
- name: auth.enabled
value: true
# Ví dụ chart từ local path
- name: nginx-ingress
namespace: networking
chart: ../charts/custom-ingress
values:
- "./values/{{ .Environment.Name }}/ingress.yaml"
wait: true
# Include các file helmfile con (hỗ trợ local và remote)
helmfiles:
- path: components/monitoring.yaml
selectors:
- name=prometheus
values:
- overrides.yaml
- path: git::https://github.com/example/charts.git@main.yaml?ref=v1.0.0
missingFileHandler: Error
# Quản lý đa môi trường
environments:
staging:
values:
- envs/staging/config.yaml
- appVersion: 0.9.0-beta
live:
values:
- envs/live/config.yaml
- appVersion: 1.0.0
secrets:
- envs/live/secrets.yaml.enc
missingFileHandler: Error
# Phân tầng cấu hình (bases)
bases:
- global-settings.yaml
- region-config.yaml
# Khai báo API versions hỗ trợ
apiVersions:
- networking.k8s.io/v1
Quy trình kiểm tra và triển khai
Sau khi hoàn thiện file cấu hình, quy trình làm việc thường bắt đầu bằng việc kiểm tra xem các template có được render chính xác hay không.
# Kiểm tra cấu trúc thư mục
$ ls
envs charts helmfile.yaml secrets
# Xem trước kết quả render template cho môi trường staging
$ helmfile -e staging template
Khi đã xác nhận cấu hình đúng, tiến hành đồng bộ trạng thái thực tế với khai báo:
helmfile -e staging sync
Quản lý từng release cụ thể
Helmfile cho phép tác động lên từng release riêng biệt thông qua cơ chế chọn lọc (selector) dựa trên labels đã khai báo.
# Cập nhật chỉ riêng service nginx-ingress
helmfile -e staging --selector tier=networking sync
# Xóa bỏ release redis-cluster
helmfile -e staging --selector tier=database delete
Xem trước các thay đổi
Trước khi áp dụng thay đổi vào cluster, nên sử dụng lệnh diff để xem xét các khác biệt giữa trạng thái hiện tại và cấu hình mới.
# Xem toàn bộ thay đổi dự kiến
helmfile -e staging --selector tier=networking diff
# Xem thay đổi với ngữ cảnh dòng code xung quanh
helmfile -e staging --selector tier=networking diff --context 5