Helm nedir? Uygulamalarınızı Kubernetes üzerine kolayca deploy ve upgrade edin

Image result for helm alternatives

Kubernetes üzerinde uygulamalarınızı deploy etmek için birden fazla ürün bulunmaktadır.

Şu an CNCF tarafından açık kaynak olarak geliştirilen,Microsoft, Google, Bitnami gibi firmaların gelişmesine destek olduğu ve aynı zamanda yeni sürümlerinde Kubernetes’in default paket yönetim aracı olacağı söylenen Helm ürününü inceleyeceğiz.

Helm,Kubernetes üzerinde uygulamaları kolayca yönetmenizi yarayan bir araç olarak karşımıza çıkıyor.Helm ile kolayca deploy edebilir,upgrade edebilir,sürümleri kontrol edebilirsiniz.GitHub adresine aşağıdan ulaşabilirsiniz.

Helm ürünü ile birlikte “Charts” dediğimiz kavram giriyor.Charts,önceden Kubernetes uygulamalarımızı deploy etmek için hazırladığımız yaml dosyaları bütünüdür.Makalenin ilerleyen bölümlerinde göreceğiniz gibi,Service,Deployment,ReplicationController gibi tanımlamaların paket hali diyebiliriz.

Helm’in temelde 2 adet komponenti bulunmaktadır.Bunlar:

Helm Client:Chart’ları yönetmenizi sağlayan ve Tiller ile haberleşen araç

Tiller: Kubernetes API si ile konuşarak Helm Client’tan aldığı direktifleri Kubernetes ortamınıza uygulayan araç diyebiliriz.Tiller aynı zamanda sürümleri yöneten kısımdır.

Helm kurulumundan önce Kubernetes Cluster’ımızı ayağa kaldırmamız gerekli.Ben kendi test ortamımda yapacağım için minikube’u kullanıyorum.Sizde alttaki makalemden minikube kurulumunu gerçekleştirebilir ve Kubernetes ortamınızı oluşturabilirsiniz.

minikube start

Kubernetes ortamımız açıldıktan sonra kendimize uygun helm paketini bu adresten indiriyoruz.

emre@emrezkan:~/helm$ ls -ltr
total 62288
-rwxr-xr-x 1 emre emre 32062656 Eyl 25 21:16 helm
-rwxr-xr-x 1 emre emre 31701376 Eyl 25 21:16 tiller
-rw-r--r-- 1 emre emre 3126 Eyl 25 21:17 README.md
-rw-r--r-- 1 emre emre 11343 Eyl 25 21:17 LICENSE

Helm init komutunu çalıştırarak, Tiller komponent’ini Kubernetes Cluster’ı içine entegrasyonunu sağlıyoruz.

Bu komutu çalıştırmadan önce Kubernetes ortamınızın ayakta olması çok önemlidir.

emre@emrezkan:~/helm$ ./helm init
$HELM_HOME has been configured at /home/emre/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

Kubectl komutunuzun hangi ortamınızı yönettiğini alttaki komut yardımıyla öğrenebilirsiniz.

emre@emrezkan:~/helm$ kubectl config current-context
minikube

Helm tarafının kolaylıklarını, bu ürünü aynı zamanda geliştiren “Bitnami” firmasının kubeapps uygulaması ile göstermeye çalışacağım.Alttaki repoyu ekleyip “Kubeapps” uygulamasını kuruyorum.

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install --name kubeapps --namespace kubeapps bitnami/kubeapps

Bir service account yaratıp “cluster-admin” rolü ekliyorum.

kubectl create serviceaccount kubeapps-operator
kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator

Kubeapps ‘e ilk bağlanırken gerekli olacak token’ı temin ediyorum.

kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath='{.secrets[].name}') -o jsonpath='{.data.token}' | base64 --decode

Altta tam komut çıktısını paylaşıyorum.Bizim için birçok bileşeni Kubernetes ortamına kurdu.

emre@emrezkan:~/helm$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
emre@emrezkan:~/helm$ helm install --name kubeapps --namespace kubeapps bitnami/kubeapps
NAME: kubeapps
LAST DEPLOYED: Fri Oct 19 11:07:36 2018
NAMESPACE: kubeapps
STATUS: DEPLOYED
RESOURCES:
==> v1beta1/ClusterRole
NAME AGE
kubeapps-internal-apprepository-controller 1m
==> v1beta1/ClusterRoleBinding
kubeapps-internal-apprepository-controller 1m
==> v1beta1/Role
kubeapps-internal-apprepository-controller 1m
kubeapps-internal-tiller-proxy 1m
==> v1beta1/RoleBinding
kubeapps-internal-apprepository-controller 1m
kubeapps-internal-tiller-proxy 1m
==> v1/Service
kubeapps-mongodb 1m
kubeapps-internal-chartsvc 1m
kubeapps-internal-dashboard 1m
kubeapps 1m
kubeapps-internal-tiller-proxy 1m
==> v1beta1/Deployment
kubeapps-mongodb 1m
==> v1beta2/Deployment
kubeapps-internal-apprepository-controller 1m
kubeapps-internal-chartsvc 1m
kubeapps-internal-dashboard 1m
kubeapps 1m
kubeapps-internal-tiller-proxy 1m
==> v1beta1/CustomResourceDefinition
apprepositories.kubeapps.com 1m
==> v1/Pod(related)NAME READY STATUS RESTARTS AGE
kubeapps-mongodb-6f969bdc47-pdrt5 0/1 Running 0 1m
kubeapps-internal-apprepository-controller-5fc984bc55-q88wj 1/1 Running 0 1m
kubeapps-internal-chartsvc-6d77576b88-2xqpx 0/1 Running 0 1m
kubeapps-internal-chartsvc-6d77576b88-994zr 0/1 Running 0 1m
kubeapps-internal-dashboard-858d7f5b8f-gvcrx 0/1 ContainerCreating 0 1m
kubeapps-internal-dashboard-858d7f5b8f-h82qv 1/1 Running 0 1m
kubeapps-87d7f5566-5r7kh 1/1 Running 0 1m
kubeapps-87d7f5566-84lsg 0/1 ContainerCreating 0 1m
kubeapps-internal-tiller-proxy-d9df46c7b-4j5jn 1/1 Running 0 1m
kubeapps-internal-tiller-proxy-d9df46c7b-bx7gn 1/1 Running 0 1m
==> v1/ServiceAccountNAME AGE
kubeapps-internal-apprepository-controller 1m
kubeapps-internal-tiller-proxy 1m
==> v1/ConfigMap
kubeapps-internal-dashboard-config 1m
kubeapps-frontend-config 1m
NOTES:
** Please be patient while the chart is being deployed **
Tip:Watch the deployment status using the command: kubectl get pods -w --namespace kubeappsKubeapps can be accessed via port 80 on the following DNS name from within your cluster:kubeapps.kubeapps.svc.cluster.localTo access Kubeapps from outside your K8s cluster, follow the steps below:1. Get the Kubeapps URL by running these commands:echo "Kubeapps URL: http://127.0.0.1:8080"
export POD_NAME=$(kubectl get pods --namespace kubeapps -l "app=kubeapps" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward --namespace kubeapps $POD_NAME 8080:8080
2. Open a browser and access Kubeapps using the obtained URL.emre@emrezkan:~/helm$
emre@emrezkan:~/helm$ kubectl create serviceaccount kubeapps-operator
serviceaccount "kubeapps-operator" created
emre@emrezkan:~/helm$ kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
clusterrolebinding.rbac.authorization.k8s.io "kubeapps-operator"
created
emre@emrezkan:~/helm$ kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath='{.secrets[].name}') -o jsonpath='{.data.token}' | base64 --decode
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yLXRva2VuLXg2YnM1Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNDQ2OTc1ZjctZDM3Ni0xMWU4LWJiNTEtM2EwYWVlMmQ4MzVjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6a3ViZWFwcHMtb3BlcmF0b3IifQ.jM_tZT73PizEoLxj9qamY-LwpCNsSVuIbbSoRYOob_PBkHNxsz55jbYOtlZJ3WqGa89x3Rd-N5wruzFS1_JIhhMl7KDpzsNBZLeskT9a1TJ1_bskeLMerV-3MShqXnjI2Gdbdh6FnL5Ns9DZI5N0AYSg7ha4d82Kw-WZF-TjoJtkpsX2gAUX97hIrLTre26U5ex10Byjnu6AmS3ANuDwKh2vMPLy9_aQ_4bPS9DKSI33xWatg2FdmBJzGT6B6ZUH4aFDR4PESdzWVnESHiSraaECt8_0fzxjos9h2h0MQNcpauYbsgup-QSvfU3g3YfYElTsgnwqVkGQ0TzginnYjQemre@emrezkan:~/helm$ export POD_NAME=$(kubectl get pods -n kubeapps -l "app=kubeapps,release=kubeapps" -o jsonpath="{.items[0].metadata.name}")
emre@emrezkan:~/helm$ echo "Visit http://127.0.0.1:8080 in your browser to access the Kubeapps Dashboard"
Visit http://127.0.0.1:8080 in your browser to access the Kubeapps Dashboard
emre@emrezkan:~/helm$ kubectl port-forward -n kubeapps $POD_NAME 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

Port-forward yaptıktan sonra verilen önergeler doğrultusunda alttaki adresten uygulamama erişiyorum.

http://127.0.0.1:8080

Yukarda temin ettiğim token’ı alttaki ekranda giriyorum.

Uygulamamın arayüzü aşağıdaki şekilde :

Kurulum yapmanız ve test etmeniz için birçok uygulama bulunuyor.

“Charts” sekmesinde hazır repo ları indirip kuruyoruz.Ben örnek olarak “wordpress” uygulaması ayağa kaldıracağım.

“Deploy using helm” seçeneği ile uygulamayı deploy etmeye başlıyorum.

Uygulama ismini giriyorum.

Aslında yukarda bu uygulamayı kurarken çalıştırdığını “helm repo ” ve “helm install” komutlarını benim için çalıştırıyor.

Bizim için deployment,Service ve secret gibi bir yapıyı bir bütün şeklinde oluşturdu.

emre@emrezkan:~/helm$ kubectl get pods
NAME READY STATUS RESTARTS AGE
wordpress-mariadb-0 1/1 Running 0 3m
wordpress-wordpress-78c4b98944-cwflt 1/1 Running 1 3m

Uygulama arayüzünden kontrol ettiğimde “Deployed” olarak değişti.Bu arayüz üzerinde aynı zamanda kolayca upgrade işlemi de yapabilirsiniz.

Yüklediğim uygulamanın detaylarına helm komutuyla bakıyorum.

emre@emrezkan:~/helm$ helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubeapps 1 Sat Oct 20 22:23:49 2018 DEPLOYED kubeapps-0.9.0 v1.0.0-beta.3 kubeapps
wordpress 3 Sat Oct 20 23:19:50 2018 DEPLOYED wordpress-0.8.1 4.9.2 default
emre@emrezkan:~/helm$ helm status wordpress
LAST DEPLOYED: Sat Oct 20 23:19:50 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
wordpress-mariadb-579fdcc948-hphc6 0/1 PodInitializing 0 1m
wordpress-wordpress-5f9c477f4-nlzx5 0/1 Running 1 1m
==> v1/SecretNAME AGE
wordpress-mariadb 54m
wordpress-wordpress 54m
==> v1/ConfigMap
wordpress-mariadb 54m
wordpress-mariadb-tests 54m
==> v1/PersistentVolumeClaim
wordpress-mariadb 1m
wordpress-wordpress 54m
==> v1/Service
wordpress-mariadb 54m
wordpress-wordpress 54m
==> v1beta1/Deployment
wordpress-mariadb 1m
wordpress-wordpress 54m

Minikube ip 'me bakarak uygulama arayüzüne bağlanacağım.Sonrasında service’imin hangi port üzerinden hizmet ettiğini buluyorum.


emre@emrezkan:~/helm$ minikube ip
192.168.99.100

emre@emrezkan:~/helm$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d
wordpress-mariadb ClusterIP 10.96.177.241 <none> 3306/TCP 7m
wordpress-wordpress LoadBalancer 10.102.76.2 <pending> 80:31349/TCP,443:30668/TCP 7m
https://192.168.99.100:30668
http://192.168.99.100:31349

Bu ürünü kurmasanız bile bu adresten istediğiniz chart’ı indirip kurabilirsiniz.Official repository ‘e ise bu adresten ulaşabilirsiniz.

İşiniz bittikten sonra alttaki komut ile herşeyi kaldırabilirsiniz

emre@emrezkan:~/helm$ helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubeapps 1 Sat Oct 20 22:23:49 2018 DEPLOYED kubeapps-0.9.0 v1.0.0-beta.3 kubeapps
wordpress 3 Sat Oct 20 23:19:50 2018 DEPLOYED wordpress-0.8.1 4.9.2 default
emre@emrezkan:~/helm$ helm delete wordpress

Ayrıca Helm kendi hub’ını hizmete sunmaya başladı.Bu adresten girip repository den istediğiniz uygulamayı bulup kolayca deploy edebilirsiniz.

--

--