Helm Kubernetes kümesine kolay deployment yapılabilmesini sağlayan, Kubernetes paket yöneticisidir. Uygulamalarınızı Kubernetes kümesinde ayağa kaldırmak için yazmanız gereken tüm yapılandırma dosyalarını (deployment yml, ingress, persistent volumes, services, vb.) tek bir “dosya” ile yönetebilen, tüm yapılandırmaları versiyonlayabilen gerektiğinde versiyonlar arasında geçiş yapabilmenizi sağlayan bir araçtır.
Sıklıkla duyacağınız kavramlardan başlıcaları chart ve template’dir. Helm chart’lar Kubernetes’a deployment için yazılan tüm kaynak atamalarının yapıldığı yapılandırma dosyalarını ve helm şablonlarını barındıran pakettir. Template ise yapılandırma dosyaları için temel şablon sağlayan istediğiniz gibi taşımanızı değiştirmenizi veya başka geliştiriciler tarafından kullanılabilmesini sağlayan dosyalardır. Helm bunu sağlarken yapılandırma dosyalarındaki sabit tanımlamaları (port, ip, kullanıcı adı, parola, docker image, vb.) harici bir dosyadan (values) okuyarak gerçekleştirir.
Nasıl Çalışır?
Helm temel olarak iki parçadan oluşur. Paketleme, versiyonlama, vb. gibi client side operasyonlar için Helm Client, Kubernetes API’si ile konuşarak Kubernetes kümesi üzerine deployment yapabilen Helm Tiller bileşenleridir.
Yukarıdaki görselde Helm ile bir uygulamanın deployment evreleri görülmektedir. Helm chart oluşturmaya başlamadan önce örnek bir senaryo üzerinden sürecin nasıl işlediğine değinmekte fayda var.
WordPress uygulamasını Helm kullanarak Kubernetes kümenize deploy etmek istediğinizi düşünelim. Bunu yapmak için öncelikle WordPress ve gerekli diğer bileşenler için yapılandırma dosyaları yazmanız gerekecek. Yapılandırma dosyalarının nasıl yazıldığına aşağıdaki blog yazısından göz atabilirsiniz.
İhtiyacınız olan bir uygulama sunucusu, WordPress uygulaması ve bir MySQL. Bu noktada yapılandırma dosyalarını yazmaya başlayabilirsiniz veya Helm’in sağladığı Template yapısı ile, daha önceden bu üç bileşen için yazılmış yapılandırma dosyalarını alıp kullanabilirsiniz. Şimdi;
Adım 1: Kubernetes için kaynak tanımları ve uygulama yapılandırma dosyalarının yazılması.
Adım 2: Helm ile bu yapılandırma dosyalarının paketlenmesi yani Helm Chart’ın oluşturulması.
Adım3: Oluşturulan Helm Chart’ı depolayabilirsiniz. Nasıl ki Docker Hub üzerinde Docker Image depolanıyor ve oradan tag ile pull edilebiliyor ise aynı şekilde Helm Chart’larıda depolayabilir ve buradan indirebilirsiniz. Örneğin HelmHub, Chart Museum, S3, Azure Container Registry bunlara örnek olarak gösterilebilir.
Adım 4: Helm Client, deployment yapmak istediğini ve hangi chart olduğunu gRPC üzerinden Tiller’a bildirir.
Adım 5: Tiller Chart paketini açar ve Kubernetes API kullanarak gereken yapılandırma dosyalarını Kubernetes’a bildirir. Uygulamanın Kubernetes kümesi üzerine deploy edilmesini sağlar. Bu adımı kubectl apply komutu gibi düşünebilirsiniz.
Hadi Başlayalım!
Sürecin nasıl işlediğini ve Helm’in nasıl çalıştığını anladığınızı düşünüyorum. Artık kolları sıvayıp bir uygulamayı deploy edelim. Benim hali hazırda AKS (Azure Kubernetes Service) üzerinde bir Kubernetes kümem var. Geliştirme ortamında test etmek istiyorsanız Minikube gibi çözümler kullanabilir veya bulut servislerinden (AWS, Azure, Google Cloud, vb.) süreli ücretsiz deneme hakkı alarak kullanabilirsiniz. Minikube veya diğer Kubernetes servislerinin kurulumu için ilgili Helm dokümanlarından yararlanabilirsiniz.
Öncelikle geliştirme ortamınıza Helm istemcisini kurmanız gerek, Helm chart oluşturmak için bu istemci uygulamaya ihtiyacımız olacak.
Linux
sudo snap install helm --classic
Mac
brew install kubernetes-helm
Windows
choco install kubernetes-helm
Şimdi terminal ile projenin ana dizinine gidelim ve Helm client yardımıyla işe başlayalım.
helm create helm-myapp
Yukarıdaki komut ile proje ana dizinine içerisinde helm şablonlarının olduğu bir klasör oluşacaktır.
Helm istemcisi varsayılan olarak deployment ve ingress adında iki örnek yapılandırma dosyası ekledi. Bu yapılandırma dosyalarını silip templates dizini içerisinde uygulamamız için yazdığımız dosyaları atalım. Yukarıda referansı verilen, bir önceki yazıda bu dosyaların nasıl yazıldığına değinmiştik.
Bu dizindeki values.yaml ile templates içerisindeki yapılandırma dosyalarında kullanılan sabit tanımları key-value şeklinde tutabilirsiniz. Örneğin deployment.yaml içerisinde pull etmek istenilen bir container adını Values altında tanımlayıp deployment dosyasında aşağıdaki gibi çekebilirim.
deployment.yaml
image: “{{ .Values.image.repository }}:{{ .Values.image.tag }}”
values.yaml
image:
repository: nginx
Artık paketleyebilir ve deploy edebiliriz. Aşağıdaki komut Helm Chartta bir sorun olup olmadığını denetleyecek testleri çalıştırır.
helm lint
Hata almadıysanız artık paketlemeye hazırız.
helm package helm-myapp
Yukarıdaki paketleme komutu sonrası dizinde helm-myapp-0.1.0.tgz adında paket oluşacaktır. Bu paketi hali hazırda bir chart repository’niz varsa oraya koyabilirsiniz veya bu paketi ChartMuseum üzerinde saklayabilirsiniz ilgili dokumana buradan ulaşabilirsiniz.
Oluşturduğumuz bu paketi Kubernetes kümesi üzerinde çalıştırmak için;
helm install helm-myapp-0.1.0.tgz
Artık uygulamamız deploy edildi. Listelem komutu ile yapılan deployment’ları görüntüleyebilirsiniz.
helm list