0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Khắc Phục Lỗi Helm Template: Học Hỏi Quý Giá

Đăng vào 3 tuần trước

• 3 phút đọc

Chủ đề:

#kubernetes#helm

Giới Thiệu

Khi làm việc với Helm để đóng gói các triển khai Kubernetes, tôi đã gặp một vài vấn đề khó khăn nhưng thú vị. Việc ghi lại những vấn đề này không chỉ giúp tôi mà còn hy vọng cũng sẽ hữu ích cho những ai đang đối mặt với các vấn đề tương tự.


Mục Lục

  1. Các khóa có ký tự - trong values.yaml
  2. Số trong values.yaml cần có dấu ngoặc kép
  3. Thực hành tốt nhất
  4. Cạm bẫy phổ biến
  5. Mẹo hiệu suất
  6. Khắc phục sự cố
  7. Kết luận

1. Các khóa có ký tự - trong values.yaml

Trong file values.yaml, tôi đã có một khóa như sau:

yaml Copy
postgresql-pvc:
  storage: 1Gi

Trong template của tôi (postgresql.yaml), tôi đã cố gắng tham chiếu như sau:

yaml Copy
storage: {{ .Values.postgresql.postgresql-pvc.storage }}

Tuy nhiên, điều này đã thất bại với lỗi:

Copy
[ERROR] templates/: parse error: bad character U+002D '-'

Tại sao?
Các template Helm coi - trong postgresql-pvc như một toán tử trừ.

Giải pháp:
Để khắc phục, hãy bọc khóa trong dấu ngoặc kép và sử dụng cú pháp index:

yaml Copy
storage: {{ index .Values.postgresql "postgresql-pvc" "storage" }}

Điều này giúp Helm hiểu rõ rằng đây là một tra cứu khóa, không phải phép toán.

Hoặc

Tốt hơn hết, hãy tránh sử dụng ký tự - trong khóa. Bạn có thể sử dụng cú pháp như sau trong file values.yaml:

yaml Copy
postgresqlPvc:
  storage: 1Gi

Và trong template Helm:

yaml Copy
storage: {{ index .Values.postgresql.postgresqlPvc.storage }}

2. Số trong values.yaml cần có dấu ngoặc kép

Vấn đề thứ hai tôi gặp phải là với các biến môi trường trong một Deployment. File values.yaml của tôi có:

yaml Copy
postgresql:
  servicePort: 5432

Và trong template Deployment:

yaml Copy
env:
  - name: POSTGRES_PORT
    value: {{ .Values.postgresql.servicePort }}

Điều này đã thất bại với:

Copy
cannot unmarshal number into Go struct field EnvVar.spec.template.spec.containers.env.value of type string

Tại sao?
Kubernetes yêu cầu giá trị của biến môi trường phải luôn là chuỗi, nhưng Helm lại xuất ra nó như một số.

Giải pháp:
Hãy bọc giá trị trong dấu ngoặc kép:

yaml Copy
env:
  - name: POSTGRES_PORT
    value: "{{ .Values.postgresql.servicePort }}"

Giờ đây, Helm sẽ xuất ra nó đúng như một chuỗi.

Danh sách kiểm tra để khắc phục

  • Biến môi trường (giá trị: trong env) → luôn là chuỗi
  • Nhãn và chú thích → luôn là chuỗi
  • Secrets/ConfigMaps → luôn là chuỗi
  • Cổng, số lượng, yêu cầu tài nguyên → có thể để số
  • Kiểm tra đặc tả API Kubernetes để biết loại trường (chuỗi so với số)

3. Thực hành tốt nhất

  • Sử dụng dấu ngoặc kép: Luôn bọc các biến môi trường và khóa có ký tự đặc biệt trong dấu ngoặc kép.
  • Kiểm tra loại dữ liệu: Đảm bảo các loại dữ liệu trong values.yaml tương thích với yêu cầu của Kubernetes.

4. Cạm bẫy phổ biến

  • Sử dụng ký tự đặc biệt: Hạn chế sử dụng ký tự như - trong tên khóa.
  • Tham chiếu sai: Đảm bảo rằng các tham chiếu trong template chính xác với cấu trúc của file values.yaml.

5. Mẹo hiệu suất

  • Tối ưu hóa kích thước image: Giảm kích thước hình ảnh Docker của bạn để tăng tốc độ triển khai.
  • Sử dụng Helm Chart Repo: Tìm kiếm và sử dụng các Helm Chart đã được tối ưu để tiết kiệm thời gian.

6. Khắc phục sự cố

Nếu bạn gặp lỗi, hãy kiểm tra kỹ:

  • Log của Helm: Sử dụng lệnh helm install --debug để xem thông tin chi tiết.
  • Tài liệu Kubernetes: Đọc tài liệu để biết thêm thông tin về các loại trường và yêu cầu.

7. Kết luận

Helm là một công cụ mạnh mẽ nhưng cũng có những yêu cầu khắt khe:

  • Các khóa có - cần dấu ngoặc kép và tra cứu bằng index.
  • Số dùng làm biến môi trường cần được bọc trong dấu ngoặc kép.

Những điều nhỏ nhặt này nhưng lại tiết kiệm rất nhiều thời gian và công sức khi bạn đã nắm vững chúng. Hãy thử nghiệm và áp dụng những mẹo này để công việc của bạn trở nên dễ dàng hơn!


Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào