Penjanaan automatik rahsia dalam Helm

Penjanaan automatik rahsia dalam Helm

Pasukan Kubernetes aaS daripada Mail.ru menterjemah nota ringkas tentang cara menjana rahsia Helm secara automatik apabila mengemas kini. Berikut ialah teks daripada pengarang artikel - pengarah teknikal Intoware, sebuah syarikat yang membangunkan penyelesaian SaaS.

Bekas adalah sejuk. Pada mulanya saya anti-bekas (saya malu untuk mengakuinya), tetapi sekarang saya menyokong sepenuhnya penggunaan teknologi ini. Jika anda membaca ini, semoga anda berjaya mengharungi lautan Docker, menyedari manfaat Kubernetes dan menjadikan hidup anda lebih mudah dengan Helm.

Walau bagaimanapun, beberapa perkara jelas lebih sukar daripada yang sepatutnya.

Bagaimana untuk menjana rahsia secara automatik semasa mengemas kini?

Rahsia Kubernetes ialah sumber yang mengandungi pasangan kunci/nilai yang ingin anda gunakan dalam kod anda. Ini boleh menjadi rentetan sambungan pangkalan data, kata laluan e-mel dan sebagainya. Dengan menggunakan rahsia, anda mencipta pemisahan yang jelas antara kod dan tetapan, membolehkan anda menyesuaikan penggunaan yang berbeza dengan mudah tanpa mengubah pangkalan kod.

Situasi biasa ialah apabila dua modul mesti berkomunikasi menggunakan kunci biasa. Tiada sesiapa di luar kluster harus mengetahui kunci ini, kerana ia bertujuan untuk komunikasi satu-dengan-satu dalam kluster.

Membuat rahsia

Biasanya, untuk mencipta rahsia dalam Helm anda perlu:

  • terangkan rahsia dalam fail nilai;
  • takrifkan semula semasa penggunaan;
  • rujuk padanya di dalam penempatan/pod;
  • ... untung!

Ia biasanya kelihatan seperti ini:

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

Rahsia Kubernetes mudah menggunakan nilai daripada values.yml

Tetapi katakan anda tidak mahu menyatakan rahsia anda dalam fail nilai.

Terdapat banyak pilihan apabila penggunaan memerlukan kunci dikongsi, yang mesti dijana semasa pemasangan.

Dalam contoh komunikasi modul-ke-modul di atas, adalah tidak diingini untuk berkongsi rahsia di luar penempatan. Oleh itu, adalah sangat wajar Helm mempunyai mekanisme untuk menjana rahsia secara automatik tanpa perlu menyatakannya secara langsung.

cangkuk

Cangkuk membolehkan anda menjalankan kod di lokasi tertentu semasa proses pemasangan. Mungkin terdapat kerja konfigurasi yang perlu dijalankan selepas pemasangan pertama, atau mungkin pembersihan perlu dilakukan sebelum melakukan sebarang kemas kini.

Untuk menyelesaikan masalah kami menambah kunci yang dijana semasa pemasangan, cangkuk prapemasangan adalah sesuai. Tetapi ada tangkapan: anda tidak boleh menjana rahsia secara automatik sekali pada kemas kini. Hooks akan berfungsi pada setiap kemas kini.

Jika anda telah menjana rahsia anda dan pemasangan pertama anda masih belum berlaku kemudian berhenti membaca, cangkuk prapasang akan berfungsi dengan baik untuk anda.

Tetapi jika rahsia itu adalah sebahagian daripada kemas kini (mungkin ciri baharu yang tidak ada semasa pemasangan), maka memalukan bahawa anda tidak boleh membuat cangkuk prapemasangan yang hanya berfungsi sekali.

Fungsi

Fungsi helm membolehkan anda menambah pelbagai elemen skrip pada skrip penggunaan 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 bahawa nilai rahsia apiKey akan menjadi UUID baharu yang dijana semasa pemasangan.

Helm termasuk perpustakaan ciri yang benar-benar luas yang memanfaatkan ciri templat GO yang menakjubkan dan pustaka ciri Sprig untuk membuat penggunaan tersuai.

Fungsi carian

Ditambah dalam Helm 3.1 Fungsi carian, yang membolehkan anda meminta penggunaan sedia ada dan:

  • menyemak kewujudan sumber;
  • mengembalikan nilai sumber sedia ada untuk kegunaan kemudian.

Dengan menggunakan kedua-dua keupayaan ini, kita boleh mencipta satu rahsia yang dijana secara dinamik!

# 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 kemas kini baharu digunakan pada pelayan, Helm akan sama ada menjana nilai rahsia baharu (jika tiada rahsia lagi) atau menggunakan semula nilai sedia ada.

Semoga Berjaya!

Apa lagi yang perlu dibaca mengenai topik tersebut:

  1. Tiga tahap autoscaling dalam Kubernetes dan cara menggunakannya dengan berkesan.
  2. Kubernetes dalam semangat cetak rompak dengan templat untuk pelaksanaan.
  3. Saluran kami Sekitar Kubernetes dalam Telegram.

Sumber: www.habr.com

Tambah komen