Panduan cepat untuk mendesain bagan di Helm

Unsplash oleh Frank Eiffert



Helm adalah alat yang ampuh untuk menerapkan, memperbarui, dan mengelola aplikasi di Kubernetes. Komunitas Helm membuat banyak bagan sumber terbuka. Anda dapat menerapkan Redis, Nginx atau Prometheus Operator dengan satu perintah. Dan mereka datang dengan semua yang Anda butuhkan, seperti Ingress.



Tim Solusi Cloud Mail.ru telahmenerjemahkan artikel yang menjelaskan cara cepat membuat bagan dasar, menunjukkan perintah yang berguna, dan membagikan praktik terbaik. Dia tidak memikirkan aspek-aspek bahasa template Go, karena kebanyakan dari mereka tercakup dalam dokumentasi Helm. Tutorial ini memberikan aspek dan ide yang lebih abstrak untuk meningkatkan alur kerja Anda.



Membuat struktur bagan dasar



Mulailah dengan perintah sederhana yang akan membuat contoh struktur bagan:



$ helm create basic
Creating basic
$ tree basic
basic/
โ”œโ”€โ”€ charts
โ”œโ”€โ”€ Chart.yaml
โ”œโ”€โ”€ templates
โ”‚   โ”œโ”€โ”€ deployment.yaml
โ”‚   โ”œโ”€โ”€ _helpers.tpl
โ”‚   โ”œโ”€โ”€ ingress.yaml
โ”‚   โ”œโ”€โ”€ NOTES.txt
โ”‚   โ”œโ”€โ”€ serviceaccount.yaml
โ”‚   โ”œโ”€โ”€ service.yaml
โ”‚   โ””โ”€โ”€ tests
โ”‚       โ””โ”€โ”€ test-connection.yaml
โ””โ”€โ”€ values.yaml


Hanya itu yang diperlukan untuk membuat bagan siap penerapan. Bagan ini memungkinkan Anda menerapkan aplikasi dengan semua komponen yang diperlukan. Jika Anda melihat values.yaml, Anda dapat melihat bahwa aplikasi ini akan menerapkan Nginx.



Memperluas bagan semudah membuat:



$ helm install basic


Tim templat adalah teman terbaik Anda



Segera sebelum instalasi dan setelah perubahan pada grafik, Anda harus memeriksa apakah semuanya ditangani dengan benar di templat.



Untuk memeriksa apa sebenarnya yang akan diterapkan ke cluster, gunakan perintah:



$ helm template basic


Perintah tersebut akan mengeluarkan setiap YAML yang dibuat oleh semua template. Jika Anda hanya ingin melihat hasil dari satu template, gunakan:



$ helm template basic -x templates/service.yaml


Hasilnya akan seperti ini:



---
# Source: basic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-basic
  labels:
    app.kubernetes.io/name: basic
    helm.sh/chart: basic-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: basic
    app.kubernetes.io/instance: release-name


Untuk menguji template dengan nilai kustom gunakan:



$ helm template basic -x templates/service.yaml -f \ mypath/tocustomvalues.yaml


Template yang dihasilkan dapat diuji di cluster menggunakan perintah:



$ helm install basic --dry-run --debug


LINT!



Sebelum mengirimkan ke repositori, Anda dapat menambahkan satu langkah lagi untuk memeriksa kode dengan jelas - linting (analisis statistik):



$ helm lint basic/
==> Linting basic/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures


Helm bekerja dengan fungsi



Jika Anda melihat ke dalam direktori template grafik, Anda dapat melihat _helpers.tpl. Di sini Anda dapat menambahkan fungsi Anda, mereka akan tersedia di seluruh bagan. Contoh fungsi mungkin terlihat seperti ini:



{{/*
Expand the name of the chart.
*/}}
{{- define "basic.name" -}} 
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} 
{{- end -}}


Penggunaan suatu fungsi dalam templat ditunjukkan dengan menggunakan fungsi include:



app.kubernetes.io/name: {{ include "basic.name" . }}


Label meta



Bagian penting dari Kubernetes adalah penggunaan label yang benar. Ini sangat penting jika Anda menggunakan Helm untuk menerapkan banyak manifes. Untuk menambahkan tag dengan mudah guna menemukan sumber daya yang dikelola Helm, Anda dapat menggunakan fungsi Anda sendiri:



{{/*
Common labels
*/}}
{{- define "basic.labels" -}} 
app.kubernetes.io/name: {{ include "basic.name" . }}
helm.sh/chart: {{ include "basic.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}


Dan sekarang mudah menambahkan beberapa tag ke bagan:



apiVersion: v1
kind: Service
metadata:
  name: {{ include "basic.fullname" . }}
  labels:
{{ include "basic.labels" . | indent 4 }}
...


Jika Anda ingin menemukan layanan yang dibuat menggunakan bagan ini, gunakan perintah:



$ kubectl get svc -l helm.sh/chart=basic-0.1.0


Komentar akan menyelamatkan Anda



Ada dua jenis komentar:



  • # Merupakan komentar sederhana yang tetap ada di YML yang dihasilkan setelah diproses.
  • {{- / * ... * / -}} adalah komentar yang dibuang oleh mesin template.




# app files volume
        {{- /*
          App files are configmaps created by cloud-app-play-files chart.
          App files contains files specific for app and environment.
          App name should be same as in deployment of cloud-app-play-files chart.
        */ -}} 
        {{- if .Values.include.appDir }}
        - name: {{ $appName }}-files
          configMap:
            name: {{ $appName }}-files


Output template akan seperti ini:



       # app files volume
       - name: app-notification-files
         configMap:
           name: app-notification-files


Seperti yang Anda lihat, manifes yang dihasilkan hanya berisi komentar jenis sederhana. Jenis yang akan digunakan terserah Anda. Tapi komentar template berguna jika Anda mendefinisikan pipeline atau dependensi yang lebih kompleks di YAML.



Penting juga untuk diingat bahwa komentar yang dimulai dengan # juga diurai. Jika Anda meletakkan template Go dalam komentar, itu akan dievaluasi. Jadi komentar bisa menjadi template juga.



Pastikan untuk menyimpan dokumentasi



Dokumentasi bagan sangat diperlukan, terutama jika Anda ingin menerbitkan bagan. Cara termudah untuk membuat dan memelihara dokumen adalah dengan menggunakan paket Golang bernama helm-docs . Dengan itu Anda dapat menghasilkan README.md yang berisi tabel nilai, versi dan deskripsi dari values.yaml dan chart.yaml, atau menggunakan file kustom lainnya.





Contohnya diambil dari https://github.com/norwoodj/helm-docs



Seperti yang Anda lihat, menambahkan nama dengan - di hasil komentar dalam satu baris di tabel. Selain itu, tabel tersebut berisi informasi tambahan seperti deskripsi bagan, nama, dan versi. Helm-docs dapat diintegrasikan ke dalam pra-komit bersama dengan linting. Mudah untuk melakukan ini:



$ helm-docs
INFO[2020-07-23T15:30:38+02:00] Found Chart directories [.]                 
INFO[2020-07-23T15:30:38+02:00] Generating README Documentation for chart .


Keajaiban subchart



Saat bagan Anda menjadi monster arsitektur, yang terbaik adalah membagi beberapa komponen bagan menjadi yang lebih kecil. Ini disebut subchart atau diagram anak.



Subchart disebarkan pada waktu yang sama dengan diagram utama. Nilai untuk subchart dapat diberikan di file values.yaml yang sama seperti untuk diagram utama. Anda juga dapat menghubungkannya dari GitHub, tetapi untuk artikel ini saya akan membuat subchart secara lokal.



Untuk memulai dengan subchart baru yang bergantung pada grafik utama, buat direktori grafik di dalam folder grafik utama. Kemudian buat bagan dasar:



$ mkdir charts
$ cd charts
$ helm create subbasic


Untuk menghubungkan subchart, ubah definisi grafik utama:



apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: basic
version: 0.1.0
dependencies:
  - name: subbasic       


Sekarang, setiap kali perintah diluncurkan helm install, tidak hanya diagram utama yang diperluas, tetapi juga sub-diagramnya. Untuk mengganti nama referensi subchart saat menerapkan ke layanan, tambahkan perintah berikut ke values.yaml dari diagram utama:



subbasic:
 service:
   type: NodePort
 nameOverride: "jojo"


Sekarang jalankan perintah templatedan lihat hasil modifikasi dari layanan subchart. Jenis layanan akan berubah seiring dengan namanya:



---
# Source: basic/charts/subbasic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-jojo
  labels:
    app.kubernetes.io/name: jojo
    helm.sh/chart: subbasic-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: jojo
    app.kubernetes.io/instance: release-name


Catatan penting: subchart tidak bisa mengambil nilai dari grafik induk.



Momen yang sering dilupakan



Beberapa poin lagi:



  1. Nama sumber daya - maksimal 63 karakter.
  2. Nama sumber daya hanya boleh berupa angka, huruf kecil, "-" atau ".".
  3. Ukuran bagan - tidak lebih dari 1 MB . Ini sangat penting jika Anda menggunakan lampiran file.
  4. Bagan memiliki fungsi parsing .tpl.
  5. Anda dapat menentukan sumber daya yang akan tersisa setelah perintah menghapus penyebaran diagram helm delete.


Nah itu saja!



Sekarang Anda dapat menulis bagan pertama Anda. Melampirkan file perlu disebutkan - bagan tidak cocok untuk menambahkan file dan menyimpan strukturnya di direktori. Tetapi pada halaman rekomendasi, Anda tidak akan menemukan informasi tentang apa yang harus dipetakan dan apa yang tidak.



Helm adalah alat yang cukup muda, tetapi dengan banyak potensi. Jangan lupa bahwa linting, pembuatan dokumentasi, dan bahkan template dry-run di kluster dapat menjadi bagian dari CI. Helm Workflow sudah tersedia untuk GitHub .



Semoga berhasil!



Apa lagi yang harus dibaca:



  1. Perangkat helm dan jebakannya .
  2. Rahasia pembuatan otomatis di Helm .
  3. Saluran kami di Sekitar Kubernetes di Telegram .



All Articles