Yeni bir teknoloji: Kubernetes nedir?

Yeni bir teknoloji: Kubernetes nedir?

Kubernetes, hem bildirime dayalı yapılandırmayı hem de otomasyonu kolaylaştıran, konteynere yüklenmiş iş yüklerini ve hizmetleri yönetmek için kullanılan taşınabilir, genişletilebilir, açık kaynaklı bir platformdur. Büyük ve hızla büyüyen bir ekosisteme sahiptir. Kubernetes hizmetleri, desteği ve araçları geniş çapta mevcuttur.

Kubernetes adı, Yunanca “dümenci, pilot, vali” anlamlarına gelmektedir.

Google, 2014 yılında Kubernetes projesini açık kaynaklı hale getirmiştir. Kubernetes, Google’ın üretim iş yüklerini geniş ölçekte çalıştırma deneyimi ile topluluktan gelen en iyi fikirler ve uygulamalarla birleştirmiştir.

Zamanda biraz geriye gidelim

Zamanda biraz geriye giderek Kubernetes’in neden bu kadar kullanışlı olduğuna bir göz atalım.

Geleneksel Dağıtım Dönemi:

Önceleri, kuruluşlar uygulamaları fiziksel sunucularda çalıştırdı. Fiziksel bir sunucudaki uygulamalar için kaynak sınırlarını tanımlamanın bir yolu yoktu ve bu durum kaynak paylaştırma sorunlarına neden oluyordu. Örneğin, bir fiziksel sunucu üzerinde birden fazla uygulama çalıştırılırsa, içlerinden bir uygulamanın kaynakların çoğunu kullanacağı ve sonuç olarak diğer uygulamaların düşük performans göstereceği durumlar olmaktaydı. Bunun için uygulanabilecek çözüm, her uygulamayı farklı bir fiziksel sunucuda çalıştırmak olabilir. Ancak bu durumda da kaynaklar yetersiz kullanıldığından ölçeklenmesi mümkün değildi ve kuruluşların birçok fiziksel sunucuyu kullanması çok yüksek maliyetlere neden oluyordu.

Sanallaştırılmış Dağıtım Dönemi:

Geleneksel dağıtıma çözüm olarak sanallaştırma ortaya çıktı. Tek bir fiziksel sunucunun CPU’sunda birden çok Sanal Makine (VM) çalıştırmanıza izin verilmesi anlamına gelir. Sanallaştırma, uygulamaların VM’ler arasında izole edilmesine olanak tanır ve bir uygulamanın bilgilerine başka bir uygulamanın erişmesine izin vermediği için bir güvenlik düzeyi sağlar.

Sanallaştırma, sunucu üzerine bir uygulamanın kolayca eklenebilmesi veya güncellenebilmesi, donanım maliyetlerinin ciddi oranda azalması gibi avantajları ile fiziksel bir sunucudaki kaynakların daha iyi kullanılmasını ve dolayısıyla daha iyi ölçeklenebilirlik sağlar. Sanallaştırmayla, bir dizi fiziksel kaynağı tek kullanımlık sanal makine kümesi olarak sunabilirsiniz.

Her sanal makine, sanallaştırılmış donanımın üzerinde kendi işletim sistemi dâhil tüm bileşenleri çalıştıran eksiksiz bir makinedir.

Sanal makinelerde bir fiziksel makine içerisinde birçok sanal makine çalışmaktadır. Her bir sanal makine kendi işletim sistemini kullanmaktadır. Bu durumda aslında bir fiziksel makinenin CPU, bellek ve disk kaynaklarının aslında çok büyük bir kısmını işletim sistemleri kullanmaktadır. Yine bir sanal makine taşınmak veya yedeklenmek istendiğinde sanal makinenin işletim sistemi ile taşınması ve yedeklenmesi gerekmektedir. Bu da bu işlemlerin daha fazla zaman almasına neden olur.

Konteyner Dağıtımı Dönemi:

Konteynerler VM’lere benzer, ancak İşletim Sistemini (OS) uygulamalar arasında paylaştırmak için rahat yalıtım özelliklerine sahiptirler. Bu nedenle konteynerler hafif (lightweight) kabul edilir. VM’ye benzer şekilde, bir konteynerin kendi dosya sistemi, CPU’su, belleği, işlem alanı ve daha fazlası vardır. Altta yatan altyapıdan ayrıştırıldıklarından, bulutlarda ve işletim sistemi dağıtımlarında taşınabilirler.

Konteynerler, aşağıda bahsedilenler gibi faydalar sağladıkları için günümüzde popüler hale gelmiştir:

  • Hızlıca uygulama oluşturma ve devreye alma: Sanal makine görüntüsü kullanımına kıyasla konteyner görüntüsü oluşturmak çok daha kolay ve verimlidir.
  • Sürekli geliştirme, entegrasyon ve dağıtım: hızlı ve kolay geri dönüşlerle (görüntünün değişmezliği nedeniyle) güvenilir ve sık konteyner görüntüsü oluşturma ve dağıtma sağlar.
  • Dev & Ops’un (Dev-Development & Ops-Operations) birbirinden ayrılması: Uygulama geliştirme (development) sonucunda release alınırken konteynere dönüştürülür. Arkasından konteyner ilgili altyapıya dağıtılır. Böylece uygulamalar altyapıdan ayrılır.
  • Gözlemlenebilirlik, yalnızca işletim sistemi düzeyindeki bilgileri ve ölçümleri değil, aynı zamanda uygulama sağlığı ve benzeri diğer işaretleri de ortaya çıkarır.
  • Geliştirme, test ve üretimde çevresel tutarlılık: Bulutta nasıl çalışıyorsa, dizüstü bilgisayarda da aynı şekilde çalışır.
  • Bulut ve işletim sistemi dağıtım taşınabilirliği: Ubuntu, RHEL, CoreOS, şirket içi, büyük public bulutlar ve başka herhangi bir yerde çalışabilir.
  • Uygulama merkezli yönetim: Uygulama geliştirirken ve devreye alırken, uygulamanın koşacağı sanal makinelerin konumlandırılması, iletişimi ve yönetimine odaklanmak yerine, uygulamaların nasıl konumlandırılacağı, birbiri ile iletişimi ve yönetimine odaklanılır.
  • Mikro hizmetler (microservices): Uygulamalar tek bir büyük tek amaçlı makinede çalışan monolitik bir yığın olarak değil; daha küçük, bağımsız parçalara bölünür, büyüyebilir ve dinamik olarak konuşlandırılabilir ve yönetilebilir haldedir.
  • Kaynak izolasyonu: öngörülebilir uygulama performansı.
  • Kaynak kullanımı: yüksek verimlilik ve yoğunluk.

Kubernetes’e neden ihtiyacınız var ve neler yapabilir?

Konteynerler, uygulamalarınızı bir araya getirmek ve çalıştırmak için iyi bir yoldur. Bir üretim ortamında, uygulamaları çalıştıran konteynerleri yönetmeniz ve kesinti olmadığından emin olmanız gerekir. Örneğin, bir konteyner düşerse, başka bir konteynerin başlaması gerekir. Bu davranış bir sistem tarafından ele alınsaydı daha kolay olmaz mıydı?

Kubernetes tam olarak böyle çalışıyor! Kubernetes, dağıtılmış sistemleri esnek bir şekilde çalıştırmanız için size bir çerçeve sağlar. Uygulamanız için ölçeklendirme ve yük devretme ile ilgilenir, dağıtım modelleri ve daha fazlasını sağlar. Örneğin Kubernetes, sisteminiz için bir canary dağıtımını kolayca yönetebilir. Kubernetes size şunları sağlar:

  • Hizmet keşfi ve yük dengeleme: Kubernetes, DNS adını veya kendi IP adresini kullanarak bir konteynere ulaşmayı sağlar. Bir konteynere giden trafik yüksekse Kubernetes, dağıtımın kararlı olması için ağ trafiğini yükleyebilir ve dağıtabilir.
  • Depolama düzenleme: Kubernetes, yerel depolamalar, genel bulut sağlayıcıları ve benzeri seçtiğiniz bir depolama sistemini otomatik olarak bağlamanıza olanak tanır.
  • Otomatik kullanıma sunma ve geri alma işlemleri: Kubernetes kullanarak konuşlandırılmış konteynerleriniz için istenen durumu tanımlayabilir ve gerçek durumu kontrollü bir hızda istenen duruma değiştirebilir. Örneğin, dağıtımınız için yeni konteyner oluşturmak, mevcut konteyneri kaldırmak ve tüm kaynaklarını yeni konteynere almak için Kubernetes’i otomatikleştirebilirsiniz.
  • Otomatik kutulama (bin packing): Kubernetes’e, konteynerleri çalıştırmak için kullanabileceği bir dizi sunucu (node) sağlarsınız. Kubernetes’e her bir konteynerin ne kadar CPU ve bellek (RAM) ihtiyacı olduğunu söylersiniz. Kubernetes, kaynaklarınızdan en iyi şekilde yararlanmak için sunuculara konteynerler sığdırabilir.
  • Kendi kendini düzeltebilir: Kubernetes, başarısız olan konteynerleri yeniden başlatır, konteynerleri değiştirir, kullanıcı tanımlı durum kontrolünüze yanıt vermeyen konteynerleri sonlandırır ve hizmet vermeye hazır olana kadar istemcilere tanıtmaz.
  • Gizlilik ve konfigürasyon yönetimi: Kubernetes, şifreler, OAuth tokenları ve SSH anahtarları gibi hassas bilgileri depolamanıza ve yönetmenize olanak tanır. Gizli şifreleri ve uygulama ayarlarını konteyner görüntülerinizi (images) yeniden oluşturmadan ve ayarları & şifreleri açığa çıkarmadan dağıtabilir ve güncelleyebilirsiniz.

Kubernetes ne değildir?

Kubernetes, geleneksel, her şey dâhil bir PaaS (Platform As A Service – Hizmet Olarak Platform) sistemi değildir. Kubernetes, donanım seviyesi yerine konteyner seviyesinde çalıştığından, dağıtım, ölçekleme, yük dengeleme gibi PaaS’la özdeşleşen bazı genel olarak uygulanabilir özellikleri sağlar ve kullanıcıların günlük kaydı, izleme ve uyarı çözümlerini entegre etmesine olanak tanır. Kubernetes, geliştirici platformları oluşturmak için yapı taşları sağlar. Kubernetes:

  • Desteklenen uygulama türlerini sınırlamaz. Kubernetes, durum bilgisi olmayan (stateless), durum bilgisi olan (stateful) ve veri işleme iş yükleri dâhil olmak üzere son derece çeşitli iş yüklerini desteklemeyi amaçlamaktadır. Bir uygulama bir konteynerde çalışabiliyorsa, Kubernetes üzerinde mükemmel bir şekilde çalışması beklenmektedir.
  • Kaynak kodunu dağıtmaz ve uygulamanızı oluşturmaz. Sürekli Entegrasyon, Teslimat ve Dağıtım (CI / CD) gibi iş akışları, kuruluş kültürleri ve tercihlerinin yanı sıra teknik gereksinimlere göre belirlenir.
  • Ara yazılım (örneğin, mesaj yolları), veri işleme çerçeveleri (örneğin Spark), veri tabanları (örneğin MySQL), önbellekler gibi uygulama düzeyinde hizmetler veya küme depolama sistemleri (örneğin Ceph) gibi yerleşik hizmetleri sağlamaz. Bu tür bileşenler Kubernetes üzerinde çalışabilir ve/veya Open Service Broker gibi taşınabilir mekanizmalar aracılığıyla Kubernetes üzerinde çalışan uygulamalar tarafından erişilebilir.
  • Günlüğe kaydetme, izleme veya uyarı (logging, monitoring, alerting) çözümlerinin uygulanmasını dikte etmez. Bazı entegrasyonlar ve ölçümleri toplamak ve dışa aktarmak için mekanizmalar sağlar.
  • Bir yapılandırma dili / sistemi sağlamaz veya zorunlu kılmaz (örneğin, Jsonnet). Bildirim temelli belirtimlerin rastgele biçimleriyle hedeflenebilecek bildirim temelli bir API sağlar.
  • Kapsamlı bir makine yapılandırması, bakımı, yönetimi veya kendi kendini onaran sistemler sağlamaz veya benimsemez.
  • Ek olarak, Kubernetes yalnızca bir düzenleme sistemi değildir. Aslında orkestrasyon ihtiyacını ortadan kaldırır. Orkestrasyonun teknik tanımı, tanımlanmış bir iş akışının yürütülmesidir: önce A, sonra B, sonra C. Kubernetes, mevcut durumu sürekli olarak sağlanan istenen duruma doğru yönlendiren bir dizi bağımsız, birleştirilebilir kontrol sürecini içerir. A’dan C’ye nasıl geldiğiniz önemli olmamalıdır. Merkezi kontrol de gerekli değildir. Bu, kullanımı daha kolay ve daha güçlü, sağlam, esnek ve genişletilebilir bir sistemle sonuçlanır.

Kubernetes’i nasıl kurarız, deneriz, kullanırız?

  • Developer: Docker Desktop, Minikube…
  • Public Cloud Provider: AWS EKS, Azure AKS, Google Cloud GKE
  • On Premise: Rancher, Openshift, Vmware Tanzu

Storage, Network, Güvenlik, Deployment süreçleri Kubernetes’e geçişlerde geleneksel sistemlere göre farklılıklar göstermektedir. Önümüzdeki yazılarımızda bununla ilgili aşağıdaki konulara değineceğiz:

  • Cloud Native Storage
  • Cloud Native Security
  • Cloud Native Networking
  • CI/CD süreçleri

Kubernetes teknolojisini kullanmak ve bu konuda destek almak için kurumsalsatis@sistas.com.tr e-posta adresimizden bize ulaşabilirsiniz.