Pembuatan rahasia secara otomatis di Helm

Pembuatan rahasia secara otomatis di Helm

Tim Kubernetes aaS dari Mail.ru menerjemahkan catatan singkat tentang cara menghasilkan rahasia Helm secara otomatis saat memperbarui. Berikut ini adalah teks dari penulis artikel - direktur teknis Intoware, sebuah perusahaan yang mengembangkan solusi SaaS.

Wadahnya keren. Awalnya saya anti container (saya malu mengakuinya), tapi sekarang saya mendukung penuh penggunaan teknologi ini. Jika Anda membaca ini, semoga Anda berhasil menjelajahi lautan Docker, menyadari manfaat Kubernetes, dan membuat hidup Anda jauh lebih mudah dengan Helm.

Namun, ada beberapa hal yang jelas lebih sulit dari yang seharusnya.

Bagaimana cara menghasilkan rahasia secara otomatis saat memperbarui?

Rahasia Kubernetes adalah sumber daya yang berisi pasangan kunci/nilai yang ingin Anda gunakan dalam kode Anda. Ini bisa berupa string koneksi database, kata sandi email, dan sebagainya. Dengan menggunakan rahasia, Anda membuat pemisahan yang jelas antara kode dan pengaturan, memungkinkan Anda menyesuaikan penerapan yang berbeda dengan mudah tanpa mengubah basis kode.

Situasi umum adalah ketika dua modul harus berkomunikasi menggunakan kunci yang sama. Tidak seorang pun di luar cluster boleh mengetahui kunci ini, karena kunci ini dimaksudkan untuk komunikasi satu-ke-satu di dalam cluster.

Membuat rahasia

Biasanya, untuk membuat rahasia di Helm Anda perlu:

  • jelaskan rahasia dalam file nilai;
  • mendefinisikan ulang selama penerapan;
  • rujuk ke dalam penerapan/pod;
  • ... laba!

Biasanya terlihat seperti ini:

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

Rahasia Kubernetes sederhana menggunakan nilai dari value.yml

Tapi katakanlah Anda tidak ingin menentukan rahasia Anda di file nilai.

Ada banyak opsi ketika penerapan memerlukan kunci bersama, yang harus dibuat selama instalasi.

Dalam contoh komunikasi modul-ke-modul di atas, tidak diinginkan untuk membagikan rahasia di luar penerapan. Oleh karena itu, Helm sangat diharapkan memiliki mekanisme untuk menghasilkan rahasia secara otomatis tanpa harus menentukannya secara langsung.

Kait

Hooks memungkinkan Anda menjalankan kode di lokasi tertentu selama proses instalasi. Mungkin ada tugas konfigurasi yang perlu dijalankan setelah instalasi pertama, atau mungkin pembersihan perlu dilakukan sebelum melakukan pembaruan apa pun.

Untuk mengatasi masalah kami dalam menambahkan kunci yang dihasilkan selama instalasi, kait pra-instalasi adalah pilihan yang ideal. Namun ada kendalanya: Anda tidak dapat membuat rahasia secara otomatis setelah ada pembaruan. Hooks akan berfungsi pada setiap pembaruan.

Jika Anda telah membuat rahasia dan instalasi pertama Anda belum terjadi maka berhentilah membaca, hook pra-instal akan bekerja dengan baik untuk Anda.

Namun jika rahasianya adalah bagian dari pembaruan (mungkin fitur baru yang tidak ada saat instalasi), sayang sekali Anda tidak dapat membuat hook pra-instalasi yang hanya berfungsi satu kali.

Fungsi

Fungsi helm memungkinkan Anda menambahkan berbagai elemen skrip ke skrip penerapan Anda.

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

Contoh ini menunjukkan bahwa nilai rahasia apiKey akan menjadi UUID baru yang dihasilkan selama instalasi.

Helm menyertakan pustaka fitur yang sangat luas yang memanfaatkan fitur template GO yang menakjubkan dan pustaka fitur Sprig untuk membuat penerapan khusus.

Fungsi pencarian

Ditambahkan di Helm 3.1 Fungsi pencarian, yang memungkinkan Anda meminta penerapan yang sudah ada dan:

  • memeriksa keberadaan sumber daya;
  • mengembalikan nilai sumber daya yang ada untuk digunakan nanti.

Dengan menggunakan kedua kemampuan ini, kita dapat membuat rahasia satu kali yang dihasilkan secara dinamis!

# 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 }}

Setiap kali pembaruan baru diterapkan ke server, Helm akan menghasilkan nilai rahasia baru (jika belum ada rahasia) atau menggunakan kembali nilai yang ada.

Good Luck!

Apa lagi yang harus dibaca tentang topik tersebut:

  1. Tiga tingkat penskalaan otomatis di Kubernetes dan cara menggunakannya secara efektif.
  2. Kubernetes dalam semangat pembajakan dengan template untuk implementasi.
  3. Saluran kami Seputar Kubernetes di Telegram.

Sumber: www.habr.com

Tambah komentar