Quản Lý Triển Khai Helm Chart Đa Môi Trường Với Helmfile

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

Thẻ: helmfile Kubernetes Helm DevOps ci-cd

Đăng vào ngày 13 tháng 6 lúc 00:03