Helm Nedir, Hangi Sorunu Çözer?
Kubernetes'e uygulama dağıtmak, birkaç YAML manifestosunu kubectl apply ile uygulamaktan ibaret görünür. Ancak ortam sayısı arttığında (geliştirme, test, üretim) aynı manifestoları elle kopyalayıp değiştirmek sürdürülemez hale gelir. Helm, bu manifestoları şablonlaştırıp değer dosyalarıyla parametreleştiren bir paket yöneticisidir. Bir Chart; Deployment, Service, ConfigMap gibi kaynakları tek bir sürümlenebilir paket altında toplar.
Bu rehber orta seviye geliştiriciler için yazıldı. Kubernetes temel kavramlarına (Pod, Deployment, Service) aşina olduğunuz varsayılır.
Önkoşullar ve Sürüm Kapsamı
- Çalışan bir Kubernetes kümesi ve yapılandırılmış
kubectlerişimi. - Helm kurulu olmalı. Helm 3, küme tarafında Tiller bileşenine ihtiyaç duymaz; bu rehber Helm 3 davranışını esas alır.
- Manifest sözdizimi Go template diline dayanır.
Belirli bir Helm sürüm numarası vermiyorum; komutlar Helm 3'ün genel davranışını yansıtır. Kendi ortamınızdaki sürümü helm version ile doğrulayın.
Chart İskeleti Oluşturma
helm create demo-app
Bu komut standart bir dizin yapısı üretir:
demo-app/
Chart.yaml # Chart meta verisi (ad, sürüm, apiVersion)
values.yaml # Varsayılan değerler
templates/ # Şablon dosyaları
deployment.yaml
service.yaml
_helpers.tpl # Yeniden kullanılabilir template parçaları
charts/ # Bağımlılık chart'ları
Chart.yaml içindeki version chart'ın kendi sürümüdür; uygulamanızın sürümünü ise appVersion alanı taşır. Bu ikisini karıştırmak yaygın bir hatadır.
Şablonlama Mantığı
Helm, templates/ altındaki dosyaları Go template motoruyla işler ve values.yaml içeriğini .Values üzerinden şablonlara aktarır. Basit bir örnek:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-app
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}-app
template:
metadata:
labels:
app: {{ .Release.Name }}-app
spec:
containers:
- name: app
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.containerPort }}
Karşılık gelen values.yaml:
replicaCount: 2
image:
repository: nginx
tag: "1.27"
containerPort: 80
Burada .Release.Name, helm install sırasında verdiğiniz sürüm adıdır. Kaynak isimlerini sürüm adına bağlamak, aynı chart'ı aynı kümeye birden fazla kez kurmayı mümkün kılar.
Kurulum, Güncelleme ve Geri Alma
# Şablonların ürettiği manifestoları küme uygulamadan önce görmek
helm template demo ./demo-app
# Kurulum
helm install demo ./demo-app
# Değer geçersiz kılarak kurulum
helm install demo ./demo-app --set replicaCount=3
# Değişiklik sonrası güncelleme
helm upgrade demo ./demo-app
# Sürüm geçmişi ve geri alma
helm history demo
helm rollback demo 1
helm template ve helm install --dry-run adımları, üretime gitmeden önce üretilen manifestoyu denetlemenizi sağlar. Şablon hatalarını yakalamanın en pratik yolu budur.
Değerleri Ortama Göre Ayırma
Aynı chart'ı farklı ortamlarda farklı değerlerle çalıştırmak için ayrı değer dosyaları kullanın:
helm upgrade demo ./demo-app -f values-prod.yaml
-f ile verilen dosyalar values.yaml üzerine birleştirilir; sonra gelen dosya öncekini geçersiz kılar. Üretim sırlarını (parola, token) düz metin değer dosyasına yazmak yerine Kubernetes Secret ya da harici bir sır yönetimi aracıyla beslemek daha güvenlidir.
Yaygın Hatalar
appVersionileversionkarışıklığı: Chart sürümü ile uygulama sürümü farklı alanlardır.- Şablon içinde sabit değer gömme: Ortama göre değişmesi gereken değerleri
values.yaml'a taşıyın, şablona gömmeyin. helm upgradesonrası beklenmeyen kaynak silinmesi: Şablondan çıkarılan bir kaynak, upgrade sırasında kümeden kaldırılır. Değişikliğihelm diffbenzeri araçlarla önceden inceleyin.- İsim çakışması: Kaynak adlarını
.Release.Nameile öneklemek, aynı kümede çoklu kurulumda çakışmayı önler.
Güvenlik Notları
- Değer dosyalarına gömülen sırlar sürüm kontrolüne sızabilir. Sırları ayrı tutun.
- Chart'ları yalnızca güvendiğiniz kaynaklardan çekin; şablonlar kümede ayrıcalıklı kaynak üretebilir.
- Üretimde
helm upgradeöncesi değişiklikleri gözden geçirin; geri alma (rollback) her durumu eski haline getirmez, özellikle veri şeması değişikliklerinde.
Sonuç
Helm, tekrar eden manifestoları parametreleştirilebilir bir pakete dönüştürerek çok ortamlı dağıtımı yönetilebilir kılar. Doğru kullanımın anahtarı; değerleri şablondan ayırmak, sırları değer dosyalarından uzak tutmak ve her upgrade öncesi üretilen manifestoyu denetlemektir.