Uygulamaları Kubernetes’e dağıtmak karmaşık olabilir. Tek bir uygulama kurmak, her biri ayrıntılı bir YAML manifest dosyası yazmanızı gerektiren, Pod, Service, Deployment ve ReplicaSet’ler gibi birden çok birbirine bağlı Kubernetes kaynağı oluşturmayı içerebilir.
Helm, developer’ların ve operatörlerin uygulamaları ve hizmetleri Kubernetes cluster’ında daha kolay paketlemesine, yapılandırmasına ve dağıtmasına olanak tanıyan bir Kubernetes paket yöneticisidir. Helm paketleri, bir uygulamayı dağıtmak için sıfırdan YAML bildirimleri yazma ihtiyacını azaltan veya ortadan kaldıran YAML manifest dosyalarından ve şablonlarından oluşan chart’lar olarak adlandırılır.
Helm artık resmi bir Kubernetes projesi ve Kubernetes ekosistemi içinde ve çevresinde açık kaynaklı projeleri destekleyen, kâr amacı gütmeyen Cloud Native Computing Foundation’ın bir parçası.
Helm’in Temelleri
Çoğu programlama dili ve işletim sistemi, yazılımın kurulumuna ve bakımına yardımcı olmak için kendi paket yöneticisine sahiptir. Helm, Debian’ın apt veya Python’un pip’i gibi aşina olabileceğiniz birçok paket yöneticisiyle aynı temel özellik kümesini sağlar.
Heml şunları yapabilir:
- Yazılımı kurulumu.
- Yazılım bağımlılıklarını otomatik olarak yükler.
- Yazılım upgrade.
- Yazılım dağıtımlarının konfigürasyonu.
- Repository’lerden yazılım paketlerinin alınması.
Helm, bu işlevselliği aşağıdaki bileşenler aracılığıyla sağlar:
- Tüm Helm fonksiyonlarına kullanıcı arabirimi sağlayan bir komut satırı aracı (CLI) ile erişilebilir.
- Bir yardımcı sunucu bileşeni olan tiller, Kubernetes cluster’ımızda çalışan, Heml’den gelen komutları dinleyen ve cluster’daki yazılım sürümlerinin yapılandırmasını ve dağıtımını yönetir.
- Chart olarak adlandırılan Helm paketleme formatı.
- Popüler açık kaynaklı yazılım projeleri için önceden paketlenmiş chart’lar içeren, küratörlü resmi bir chart repository.
Chart
Helm paketleri chart olarak adlandırılır ve birkaç YAML yapılandırma dosyası ve Kubernetes manifest dosyalarına dönüştürülen bazı şablonlardan oluşur. İşte bir chart’ın temel dizin yapısı:
Örnek chart dizini:
package-name/
charts/
templates/
Chart.yaml
LICENSE
README.md
requirements.yaml
values.yaml
Bu dizinler ve dosyalar aşağıdaki işlevlere sahiptir:
charts/: Manuel yönetilen chart bağımlılıkları (dependency) bu dizine yerleştirilebilir, ancak bağımlılıkları dinamik olarak bağlamak için genellikle requirements.yaml dosyasını kullanmak daha iyidir.
templates/: Bu dizin, yapılandırma değerleriyle (values.yaml ve komut satırından) birleştirilen ve Kubernetes manifest’lerinde işlenen template dosyalarını içerir. Template’ler, Go programlama dilinin template formatını kullanır.
Chart.yaml: Chart (Örneğin chart name gibi), version, maintainer bilgileri, ilişkili web sitesi ve arama anahtar kelimeleri gibi chart ile ilgili metadata’ların tutulduğu YAML dosyası.
LICENCE: Chart için, düz metin formatında lisans bilgilerini içeren dosya.
README.md: Kullanıcılara chart hakkında bilgiler veren dosya.
requirements.yaml: Chart bağımlılıklarını listeleyen bir YAML dosyası.
values.yaml: Chart için varsayılan yapılandırma değerlerinin bulunduğu bir YAML dosyası.
Helm komutu, lokal bir dizinden veya bu dizin yapısının .tar.gz paketlenmiş sürümünden bir chart kurabilir. Bu paketlenmiş chart’lar ayrıca chart repository’sinden veya repo’lardan otomatik olarak indirilebilir ve kurulabilir.
Chart Repository
Helm chart repo, bir index.yaml dosyası ve .tar.gz chart package sunan basit bir HTTP sitesidir. Helm komutu, chart’ları paketlemeye ve gerekli index.yaml dosyasını oluşturmaya yardımcı olacak alt komutlara sahiptir. Bu dosyalar herhangi bir web sunucusu, nesne depolama hizmeti (Object Storage Service) veya GitHub sayfası gibi statik bir site host tarafından sunulabilir.
Helm, stable olarak adlandırılan varsayılan bir chart repository ile önceden yapılandırılmış olarak gelir. Bu repo, https://kubernetes-charts.storage.googleapis.com adresindeki bir Google Storage paketine işaret ediyor. Stable repo’nun kaynağı, GitHub’daki helm/charts Git repository’sinde bulunabilir.
Alternatif repo’lar helm repo add komutuyla eklenebilir.
Bazı popüler alternatif depolar şunlardır:
- Henüz stable hale gelmeye hazır olmayan chart’ları içeren resmi incubator repo. Incubator kullanımıyla ilgili talimatlar, resmi Helm chart GitHub sayfasında bulunabilir: https://github.com/helm/charts .
- Resmi stable repo’da yer almayan bazı chart’lar sağlayan Bitnami Helm Chart’ları: https://bitnami.com/stacks/helm .
İster lokal olarak geliştirdiğiniz bir chart’ı ister bir repo’dan bir chart’ı kuruyor olalım, kendi kurulumunuz için onu yapılandırmanız gerekir. Şimdi konfigürasyona bakacağız.
Chart Konfigürasyonu
Bir chart genellikle values.yaml dosyasında varsayılan konfigürasyon değerleriyle birlikte gelir. Bazı uygulamalar varsayılan değerlerle tamamen deploy edilebilir, ancak ihtiyaçlarınızı karşılamak için genellikle bazı konfgürasyonları değiştirmek gerekir.
Konfigürasyon için sunulan değerler, chart’ın geliştiricisi tarafından belirlenir. Bazıları Kubernetes temel öğelerini yapılandırmak için kullanılır ve bazıları uygulamanın kendisini yapılandırmak için temeldeki container’a aktarılabilir.
İşte bazı örnek değerlerin bir parçası:
values.yaml
1 2 3 |
service: type: ClusterIP port: 3306 |
Bunlar, bir Kubernetes Service kaynağının konfigürasyon seçenekleridir. Bir chart için mevcut tüm yapılandırma değerlerini dökmek için helm inspect values chart_name‘i kullanabilirsiniz.
Bu değerler, kendi YAML dosyanızı yazarak ve bunu Helm install çalıştırırken kullanarak veya komut satırında –set flag’iyle seçenekleri ayrı ayrı set ederek geçersiz kılınabilir. Yalnızca varsayılanlardan değiştirmek istediğiniz değerleri belirtmeniz gerekir.
Belirli bir konfigürasyonla deploy edilen bir Helm chart’ına release adı verilir. Şimdi de release’e bakalım.
Release
Bir chart’ın yüklenmesi sırasında Helm, chart template’lerini kullanıcı tarafından belirtilen yapılandırmayla ve values.yaml’daki varsayılanlarla birleştirir. Bunlar, daha sonra Kubernetes API aracılığıyla dağıtılan Kubernetes manifest’lerinde oluşturulur. Bu, bir release, spesifik konfigürasyon ve özel bir char deployment’ını oluşturur.
Release kavramı önemlidir, çünkü aynı uygulamayı bir cluster’da birden çok kez deploy etmek isteyebilirsiniz. Örneğin, farklı konfigürasyonlara sahip birden fazla MySQL sunucusuna ihtiyacınız olabilir.
Ayrıca muhtemelen bir chart’ın farklı instance’larını tek tek upgrade etmek isteyeceksiniz. Belki bir uygulama güncellenmiş bir MySQL sunucusu için hazırdır, ancak diğeri değildir. Helm ile her release’i ayrı ayrı upgrade edebilirsiniz.
Bir release, chart güncellendiği için veya release’in yapılandırmasını güncellemek istediğiniz için upgrade edebilirsiniz. Her iki durumda da, her upgrade, bir release’in yeni bir revizyonunu oluşturur ve Helm, bir sorun olması durumunda önceki revizyonlara kolayca geri dönmenize olanak tanır.
Chart Oluşturmak
Deploy edeceğiniz yazılım için mevcut bir chart bulamazsanız kendinizinkini oluşturmak isteyebilirsiniz. Helm, helm create chart_name ile bir chart dizininin iskeletini çıktı olarak verebilir. Bu, yukarıdaki Chart bölümünde tartıştığımız dosya ve dizinlerle bir klasör oluşturacaktır.
Oradan, chart’ınızın meta verilerini Chart.yaml’da doldurmak ve Kubernetes manifest dosyalarınızı templates dizinine koymak isteyeceksiniz. Daha sonra, ilgili manifest değişkenlerini bildirimlerinizden ve values.yaml dosyasına çıkarmanız, ardından bunları template oluşturma sistemini kullanarak manifest template’lerinize geri eklemeniz gerekir.
Helm komutu, chart’larınızı test etmenize, paketlemenize ve sunmanıza yardımcı olacak birçok alt komuta sahiptir. Daha fazla bilgi için lütfen chart geliştirme hakkındaki resmi Helm belgelerini okuyun: https://v2.helm.sh/docs/developing_charts/