Tự động tạo bí mật trong Helm

Tự động tạo bí mật trong Helm

Đội Kubernetes aaS từ Mail.ru đã dịch một ghi chú ngắn về cách tự động tạo bí mật Helm khi cập nhật. Sau đây là nội dung của tác giả bài viết - giám đốc kỹ thuật của Intoware, một công ty phát triển giải pháp SaaS.

Container rất mát mẻ. Lúc đầu, tôi chống container (tôi rất xấu hổ khi thừa nhận điều đó), nhưng bây giờ tôi hoàn toàn ủng hộ việc sử dụng công nghệ này. Nếu bạn đang đọc bài viết này, hy vọng bạn đã điều hướng thành công biển Docker, nhận ra những lợi ích của Kubernetes và giúp cuộc sống của bạn dễ dàng hơn rất nhiều với Helm.

Tuy nhiên, có một số việc rõ ràng là khó khăn hơn mức cần thiết.

Làm cách nào để tự động tạo bí mật khi cập nhật?

Bí mật Kubernetes là tài nguyên chứa các cặp khóa/giá trị mà bạn muốn sử dụng trong mã của mình. Đây có thể là chuỗi kết nối cơ sở dữ liệu, mật khẩu email, v.v. Bằng cách sử dụng bí mật, bạn tạo ra sự tách biệt rõ ràng giữa mã và cài đặt, cho phép bạn dễ dàng tùy chỉnh các hoạt động triển khai khác nhau mà không cần thay đổi cơ sở mã.

Một tình huống phổ biến là khi hai mô-đun phải giao tiếp bằng một khóa chung. Không ai ngoài cụm nên biết khóa này vì nó được dùng để liên lạc một-một trong cụm.

Làm bí mật

Thông thường, để tạo bí mật trong Helm, bạn cần:

  • mô tả bí mật trong tệp giá trị;
  • xác định lại nó trong quá trình triển khai;
  • tham khảo nó bên trong triển khai/nhóm;
  • ... lợi nhuận!

Nó thường trông giống như thế này:

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ .Values.MyApiKeySecret | quote }}

Bí mật Kubernetes đơn giản sử dụng các giá trị từ value.yml

Nhưng giả sử bạn không muốn chỉ định bí mật của mình trong tệp giá trị.

Có nhiều tùy chọn khi việc triển khai yêu cầu khóa chung, khóa này phải được tạo trong quá trình cài đặt.

Trong ví dụ về giao tiếp giữa mô-đun với mô-đun ở trên, việc chia sẻ bí mật bên ngoài quá trình triển khai là không mong muốn. Do đó, điều rất mong muốn là Helm có cơ chế tự động tạo ra một bí mật mà không cần phải chỉ định trực tiếp.

móc

Móc cho phép bạn chạy mã tại các vị trí cụ thể trong quá trình cài đặt. Có thể có một công việc cấu hình cần được chạy sau lần cài đặt đầu tiên hoặc có thể cần phải thực hiện dọn dẹp trước khi thực hiện bất kỳ cập nhật nào.

Để giải quyết vấn đề thêm khóa được tạo trong quá trình cài đặt, các hook cài đặt sẵn là lý tưởng. Nhưng có một nhược điểm: bạn không thể tự động tạo bí mật một lần khi cập nhật. Móc sẽ hoạt động trên mọi bản cập nhật.

Nếu bạn đã tạo bí mật của mình và lần cài đặt đầu tiên của bạn chưa diễn ra thì hãy ngừng đọc, hook cài đặt sẵn sẽ hoạt động rất tốt cho bạn.

Nhưng nếu bí mật là một phần của bản cập nhật (có thể là một tính năng mới không có trong quá trình cài đặt), thì thật đáng tiếc khi bạn không thể tạo hook cài đặt sẵn chỉ hoạt động một lần.

Chức năng

Các hàm Helm cho phép bạn thêm các phần tử tập lệnh khác nhau vào tập lệnh triển khai của mình.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it

Ví dụ này cho thấy giá trị của bí mật apiKey sẽ là UUID mới được tạo trong quá trình cài đặt.

Helm bao gồm một thư viện tính năng thực sự phong phú, tận dụng các tính năng tuyệt vời của mẫu GO và thư viện tính năng của Sprig để tạo các triển khai tùy chỉnh.

Hàm tra cứu

Đã thêm vào Helm 3.1 Hàm tra cứu, cho phép bạn yêu cầu triển khai hiện có và:

  • kiểm tra sự tồn tại của tài nguyên;
  • trả về giá trị của tài nguyên hiện có để sử dụng sau.

Bằng cách sử dụng cả hai khả năng này, chúng ta có thể tạo bí mật một lần, được tạo động!

# 1. Запросить существование секрета и вернуть в переменной $secret
{{- $secret := (lookup "v1" "Secret" .Release.Namespace "some-awesome-secret" -}}
apiVersion: v1
kind: Secret
metadata:
  name: some-awesome-secret
type: Opaque

# 2. Если секрет существует, взять его значение как apiKey (секрет использует кодирование Base64, так что используйте ключ "data")
{{ if $secret -}}
data:
  apiKey: {{ $secret.data.apiKey }}

# 3. Если секрет не существует — создать его (в этот раз используйте "stringData", так как будет обычное значение)!
{{ else -}}
stringData:
  apiKey: {{ uuidv4 | quote }}
{{ end }}

Bất cứ khi nào một bản cập nhật mới được áp dụng cho máy chủ, Helm sẽ tạo ra một giá trị bí mật mới (nếu chưa có bí mật nào) hoặc sử dụng lại giá trị hiện có.

Chúc may mắn!

Những gì khác để đọc về chủ đề này:

  1. Ba cấp độ tự động điều chỉnh trong Kubernetes và cách sử dụng chúng hiệu quả.
  2. Kubernetes theo tinh thần vi phạm bản quyền với một mẫu để triển khai.
  3. Kênh của chúng tôi Xung quanh Kubernetes trong Telegram.

Nguồn: www.habr.com

Thêm một lời nhận xét