background

Kubernetes Operatörleri

Kubernetes Operatörleri

Kubernetes ile birlikte sıklıkla ismini duyduğumuz kavramlardan biri de Operatörler ve Operatör Framework. Ben de bu yazımda, operatörlere neden ihtiyaç duyduğumuzu, operatörlerin ne olduğunu, Elasticsearch operatör örnekleri ile anlatmaya çalışacağım ve son olarak da Operatör Framework’e değineceğim.

Kubernetes Operatör

Operatörler, kubernetes üzerinde çalışan yazılım extensionlarıdır. Yazılım operatörleri olarak da adlandırdığımız operatörler, Kubernetes API larını kullanarak, karmaşık stateful uygulamaların instance larını oluşturan, yöneten, konfigüre eden uygulama spesifik controller lardır. Kubernetes API larını kullanarak çalışması, bu controller ların içinde yazılan özelleştirilmiş kurallara göre , cluster ı izleyebildiği, pod ve servisleri değiştirebildiği, ölçeklendirme yapabildiği, çalışan uygulamaların endpointlerini çağırabildiği anlamına gelir.

Operatörler, temel kubernetes kaynak ve controller konseptlerinden oluşur, ancak, sık kullanılan taskları otomatize etmek için domain veya uygulama spesifik bilgi de içerir.

Operatörlerin yaptıkları işleri aşağıdaki gibi örneklendirebiliriz,

  • Talep üzerine deployment yapma
  • Uygulama state nin backup ını alma ya da backup dan geri dönme
  • Database şema ya da konfigürasyon değişikliklerine bağlı uygulama kodunun upgrade lerini yönetme
  • Kubernetes upgradelerini yönetme
  • Otomatik Ölçeklendirme

Kubernetes üzerinde, Web App, Web API, mobile backend gibi state tutmayan uygulamaları yönetmek ve ölçeklendirmek kolaydır. İzleme sistemleri, cache, veritabanı gibi steteful uygulamaları yönetmek daha komplekstir. State tutan uygulamalarda, veri kaybı ya da kesinti olmaksızın, doğru ölçeklenme, upgrade ve konfigürasyon değişiklikleri yapabilmek için domain bilgisine ihtiyacımız olur. Uygulamaların doğru şekilde yönetimini, bu uygulama spesifik operasyonel domain bilgisini, Kubernetes içerisindeki operatörlerde soyutlayarak sağlarız.

Elasticsearch Official ve Zalando Operatörleri

Operatörlerin detayına girmeden önce Elasticsearch’ün terminolojisine çok kısa değinelim. Elasticsearch de Index kavramı, ilişkisel veritabanlarındaki Database’e, Shard kavramı Physical Partion’a, Replica ise, verinin farklı bir makinede bir kopyasının tutulmasına karşılık geliyor. Aşağıdaki tabloda Elasticsearch’ in 3 data node’ u içerisinde 3 shard’ın birer replica’ sının nasıl dağıldığının örneğini görüyoruz.

Operatörlere dönecek olursak da, Elasticsearch için, farklı ihtiyaçlara çözüm olacak şekilde yazılan bir çok operatör mevcut. Biz Official Elasticsearch operatörü ve Zalando’nun operatörünü inceleyerek operatörlerin kullanımlarını örneklendiriyor olacağız.

Elastic Cloud on Kubernetes (ECK)

Elasticsearh official operatörü olan Elastic Cloud on Kubernetes, operator pattern’i kullanarak Elasticsearch, Kibana ve APM Server’ın hazırlanmasını, yüklenmesini ve yönetimini otomatize eder.

Özellikleri

  • Elasticsearch, Kibana ve APM Server kurulumu
  • TLS sertifika yönetimi
  • Güvenli Elasticsearch cluster konfigürasyonu ve topoloji değişiklikleri
  • Persistent volume kullanımı
  • Node konfigürasyon ve atribute lerini özelleştirme
  • Güvenli keystore güncelleme ayarları

Operatörleri, genellikle Custom Resource Definition(CRD) ve onun birleşik controller larını kubernetes e ekleyerek deploy ederiz. Burada da, Elasticsearch official operatörünün ve CRD kurulumları örneğini inceleyerek operatör mantığına biraz daha yakından bakmış olacağız.

Operatör ve CRD kurulumlarını rol tanımları ile birlikte, tek bir yaml ı apply ederek sağlayabiliyoruz ve çalışmasının bitiminde, Elasticsearch, Kibana ve APM kurulumları için 3 ayrı CRD oluşturulduğunu görüyoruz.

kubectl apply -f https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yamlcustomresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
clusterrole.rbac.authorization.k8s.io/elastic-operator created
clusterrolebinding.rbac.authorization.k8s.io/elastic-operator created
namespace/elastic-system created
statefulset.apps/elastic-operator created
serviceaccount/elastic-operator created
validatingwebhookconfiguration.admissionregistration.k8s.io/elastic-webhook.k8s.elastic.co configured
service/elastic-webhook-server created
secret/elastic-webhook-server-cert created

Yukarıda yüklediğimiz elasticsearch CRD sini kullanarak Elasticsearch kurulumunu yapmak artık çok basit, Elasticsearch ün tek node üzerinde çalışacağını ve datasının da persistent olarak tutulacağını söylediğimiz aşağıdaki yaml ı apply etmemiz yeterli. Burada Volume Claim Tempates tanımını elasticsearch-data ismiyle vermeye dikkat etmemiz gerekiyor. Cluster ınızda, default storageclass ın yüklenmiş ise, başka bir tanım yapmaya gerek olmaksızın, Elasticsearch datasının persistent olarak saklanmasını sağlamış oluyoruz.

Elasticsearch kurulumunu, kurulan elastic nodeların versiyonları, adetleri ve sağlıklarını aşağıdaki şekilde kontrol edebiliriz.

Cluster üzerinde yeterli kaynak olduğu durumda, minumum kesintiyle versiyon güncelleme yapma özelliği de operatörün sağladığı bir diğer fayda. Elasticsearch ü tek node a kurulum yapılacağını söylediğimiz yaml içerisinde nodecount adedini güncellediğimizde, operatör versiyon güncellemelerini manuel işlem yapmamıza gerek olmaksızın sağlıyor.

Zalando Es-operator

Avrupa’nın online moda sektöründe lider konumda bir şirket olan Zalando, e-ticaret sitesi altyapısında Elasticsearch kullanıyor. Zalando, belirli dönemlerde oluşan yüke göre ölçeklendirme yapabilmek ve versiyon güncellemeleri daha efektif yönetebilmek için, Elasticsearch operatörünü geliştirmiş.

Zalondonun Elasticsearch operatörünü yüklemek için de Official Elasticsearch Operatörü kurulumuna benzer bir yol izliyoruz.

Zalando ES-Operatörü Elasticsearch clusterındaki master node un yönetimine karışmaz iken, upgrade işlemlerini kolaylaştırabilmek için data nodeları yönetir ve versiyon güncellemelerinde de kolaylıklar sağlar. Oluşturduğumuz CRD tanımları kullanarak, Elasticsearch data node u oluşturuyoruz.

Elasticsearch cluster ı, operatör kullanmadan, örneğin helm ile yüklemeyi denersek, hem master hem de data nodeların statefulset olarak ayağa kalktığını görmüş oluruz. Zalando operatöründe ise, master node un statefulset, data nodeların ise CRD olarak tanımlanmış ElasticsearchDataSet lerden oluştuğunu görmüş oluyoruz.

Versiyon Güncelleme

Versiyon güncelleme özelliğinin faydasını daha iyi aktarabilmek için, Helm ile Elasticsearch kurulumunu deneyiniminde yaşadığımız zorluklardan bahsetmek istiyorum. Elasticsearch cluster ındaki podları Statefulsetler kontrol ediyordu ve versiyon güncellemelerinde, süreler hem çok uzuyordu, hem de kimi zaman data node ları terminating statüde kalıyordu. Bunun nedeni de Stafulset ile yapılan versiyon güncellemelerinin şöyle çalışıyor olması idi.

  • Elasticsearch data node u öldürülmeden önce, içerisindeki tüm data varolan diğer elasticsearch data nodelarına taşınır,
  • Ardından, yeni versiyonda elasticsearch data node u ayağa kaldırılır ve diğer nodelara aktarılan data bu kez de yeni elasticsearch data node una taşınır.

Zalando Operatörü ise versiyon güncellemeleri aşağıdaki gibi basitleştirerek, versiyon güncellemelerinin daha kısa sürede ve efektif bir şekilde yapılmasını sağlayacak çözümü geliştirmiştir.

  • Eski versiyondaki data node u öldürülmeden önce, yeni versiyonda elasticsearch data node u ayağa kaldırılır
  • Eski versiyondaki elasticsearch data node u öldürülmeden önce üzerindeki data yeni versiyonda oluşturalan elasticsearch data node una aktarılır.

Ölçeklendirme

Kubernetes, temelde CPU verisine dayanan ancak farklı custom metrikleri de destekleyen Horizontal Pod Autoscaler ile, replication controller, deployment, replicaset veya statefulset içerisindeki podların otomatik ölçeklendirmesini sağlar.

Zalando Operatörünün ölçeklendirme özelliği de, ElasticsearchDataSet in çalıştığı podlardan toplanan CPU tüketimine dayanarak çalışır. Ölçeklendirmenin nasıl yapıldığının detayına girmeden önce, Elasticsearch data node u için yapılan CRD tanımının örneğini eklemek istedim.

Ölçeklendirme Nasıl Çalışır?

6 shard lı bir index için, Elasticseach data nodeların yukarıdaki tanıma göre çalışan clusterı için, CPU tüketimi artışına göre ölçeklendirme adımlarının neler olduğunu inceleyelim.

(1 Index 6 Shards — minReplicas = 2, maxReplicas=4, minShardsPerNode=1, maxShardsPerNode=3, targetCPU: 40%)

Cluster içerisinde, initial deployment için ne kadar kaynağa ihtiyaç duyulacağı maxShardsPerNode parametresine göre belirlenir. (3 copies of index x 6 shards = 18 shards / 3-per-node => 6 nodes)

  • 1. CPU tüketimi %40 ı aştığında, ilk etapta node başına düşen shard sayısını ShardsPerNode düşürülerek node sayısı arttırılır. (18 shards / 2 per-node => 9 nodes)
  • 2. CPU tüketimi tekrar %40 ı aştığında, ShardsPerNode değeri minShardsPerNode değerine ulaşana kadar node sayısını arttırılmaya devam eder. (18 shards / 1 per-node => 18 nodes)
  • 3. CPU tüketimi artmaya devam ediyor ve tekrar %40 ın üzerine çıkıyor ve minShardsPerNodedeğerine ulaşılmış ise, Node lardaki index replikaIndexReplicas adedi arttırılır ve ihtiyaç duyulan nodelar eklenerek ölçeklendirme devam eder. Bizim örneğimizde minIndexReplicas değeri 2 idi, 3 e çıkardığımızda shard adedimiz 18 den 24 e yükseliyor. (24 shards / 1 per node => 24 nodes)
  • 4. CPU tüketimi tekrar %40 a ulaştığında ise, IndexReplicas değeri tekrar arttırılır ve bu kez maxIndexReplicas değerine ulaşmış olunur. (36 shards / 1 per node => 36 nodes)

Bu noktadan sonra, ElasticsearchDataSet CRD tanımına göre scale up yapılamıyor ancak CPU tüketimi azaldıkça ilerlenen adımlar sırasıyla geri işletilerek scale down yapılıyor.

(2019 KubeCon’da yapılan Zalando Es-Operatör’ünün sunumunu buradan inceleyebilirsiniz.)

Operator Framework

Bu noktaya kadar operatörlerin ne olduğuna 2 farklı örnek üzerinden değinmiş olduk. Şimdi de operatörlerle yapacağımız işlemleri yönetebileceğimiz, operatör framework’un sağladığı faydaları inceleyelim.

Operatör framework, Kubernetes native uygualamalarını efektif, otomatik ve ölçeklenebilir şekilde yönetmeye yarayan operatörler için oluşturulan open source bir toolkit’tir. Kubernetes topluluğundaki uzmanlığı ve bilgiyi tek bir projede bir araya getirerek, standart uygulama paketi olarak kullanılmayı ve Kubernetes için uygulama geliştirmeyi basitleştirmeyi amaçlar.

Operatör Framework 5 bileşenden oluşur.

  • 1. Kubernetes API kompleksitisini bilmeye gerek olmaksızın, Operatör geliştirmek için sunulan Operatör SDK
  • 2. Kubernetes üzerinde çalışan operatörlerin, kurulumunu yönetimini sağlayan, upgrade gibi süreçlerini denetleyen Operatör Lifecycle Manager (OLM)
  • 3. Operator metadata , ClusterServiceVersions (CSVs) ve Custom Resource Definitions (CRDs) ları saklayan Operator Registry (OLM e Operator Catalog verisi sağlamak için kubernetes veya Openshift clusterda çalışır)
  • 4. Cluster adminlerin, cluster a yükleyecekleri operatörleri bulabilecekleri web portal olan OperatorHub (OpenShift Container Platform unda kurulu olarak gelir)
  • 5. Özelleştirilmiş servisler sağlayarak operatörlerin kullanımını ölçümleyen Operatör Metering

Bu yazımda incelediğim Elasticsearch operatör örneklerine benzer, pek çok altyapı ve uygulamanın da kubernetes üzerindeki yönetim işlemlerini kolaylaştırmak için yazılan operatörler mevcut. İhtiyacımıza yönelik operatörlere OperatorHub üzerinden kolaylıkla erişebiliriz. Operatörlerin kurulumlarını, ister yukarıda yaptığımız gibi manuel, ister de OLM üzerinden gerçekleştirebiliriz.

Kendi uygulamalarımızda spesifik işleri otomatize etmek istersek ise, Zalando’nun yaptığı gibi operator oluşturabiliriz. Bu noktada geliştirme kolaylığı sağladığı için, Operator Framework’un Operatör SDK sını kullanabiliriz.

Nasıl yardımcı olabiliriz?