[ CKA-II ]-Kubernetes Temel Tanımları ve Bileşenleri

Serkan Bingöl
AWS Certified User Group Turkey
8 min readDec 28, 2020

--

görsel kaynağı https://i0.wp.com/devalcourt.com

Merhabalar serimizin 2. yazısında kubernetes ( k8s ) nedir , ne işe yarar gibi genel bir başlangıcı yaptıktan sonra kubernetes mimarisi içinde kullanacağımız bileşenlerin neler olduğunu, nasıl kullanıldıklarını anlatmaya çalışacağım.

Nedir Bu Kubernetes ?

görsel kaynağı https://tenor.com/

Kubernetes konusuna hemen tanımlama yapmadan önce konteyner orkestrasyonu (container orchestration) konusuna bir göz atmakta fayda var. Konteyner orkestrasyonu, çalışan çok sayıda konteyner (container) bulunduğu durumda, onları kolayca yönetmek ve idare etmek için bir yol olarak düşünülebilir. durumda devreye girer. izlenmesi gibi işleri otomatize edebilmek amacıyla kullanılmaktadır.

Kubernetes Google tarafından GO dilinde geliştirilmiş CNCF-Cloud Native Computing Foundation tarafından desteklenen mevcut konteynerize edilmiş uygulamalarınızı otomatik deploy etmek, sayılarını arttırıp azaltmak gibi işlemler ile birlikte yönetmenizi sağlayan bir konteyner kümeleme (container cluster) aracıdır.

Temelde bir çok soruna çözüm getirdiği için sektörde en yaygın kullanılan container orchestration aracıdır. Genel anlamda sağlanan çözümleri biraz daha detaylandırmak gerekir ise tüm alt yapıyı tek bir bütün kod parçacığı olarak ele almamızı ve yönetmemizi kolaylaştırmak (infrastructure as code-IaC), konteynerlar için sağlık kontrolerini (health-check) kullanarak genel durumlarını kontrol edebilmek, sağlıksız olarak belirtilen konteynerlar yerine yenilerinin oluşturulmasını sağlamak , belirlediğimiz kriterler doğrultusunda ölçeklendirmeyi otomatize ederek performans sağlamak (auto-scale) konularını standart şekilde çözebilmektedir.

Ayrıca yeni versiyonların yayınlaması (deployment) konusunda kesintisiz yayınlama , tüm uygularımızın nerede nasıl çalıştığının bilinmesi (service-discovery) , uygulamalarımızın izole olarak daha güvenli şekilde çalıştırılması (network-isolation) ve altyapımıza ait konfigurasyonların containerlar dışından yönetilebilmesi (key-value store) gibi birçok konuda bizlere yardımcı olabilmektedir.

Temel Kubernetes Bileşenleri

Node ( Düğüm )

Kubernetes içinde düğüm (node) kavramından bahsetmek gerekir ise sanal veya fiziksel bir makineler diyebiliriz. Bu fiziksel makinalar master node ve worker node olmak üzere 2 çeşit olarak gruplandırılıyorlar.

Master node içinde bir çok farklı uygulamayı barındıran ve k8s için yönetici görevini üstlenen node olarak kullanılmaktadır. Kontrol düzlemi ( control plane ) dediğimiz bir mantıksal çerçeve içinde yönetim için kullanılan API Server (sunucumuza gelen tüm REST requestlerin yönetilmesinden sorumludur ), Control Manager ( kümenin durumunu API Server izleme özelliğiyle izler ve bildirildiğinde, geçerli durumu istenen duruma doğru hareket ettirmek için gerekli değişiklikleri yapar ), Scheduler (yeni bir pod oluşturulması isteğine karşı API server’ı izler) ve Etcd ( tutarlı ve izlenebilir bir key value store olarak veri tabanı görevini üstlenir ) bileşenlerini barındırır.

Worker node ise, kubernetes kontrol düzlemi tarafından yönetilen podları çalıştırmak için gerekli hizmetleri içerir. Bu hizmetler Kubelet ( ana kubernetes agent olarak kullanılır. API server’dan gelecek isteklere karşı API Server’ı izler ), Kube-Proxy ( kubernetes network’u diyebiliriz.Pod’lara IP adresi proxy sayesinde atanır ), Container Engine ( konteyner yönetimini yapar.İmage’ları ilgili registry üzerinden çeker ve konteyner’ların start ve stop olmalarını sağlar ) bileşenlerini barındırır.

kubernetes node bileşenleri görseli. Görsel kaynağı https://kodekloud.com

Cluster ( Küme )

Küme mimarisi en yalın tanımıyla; belirli konfigürasyonlar ile yapılandırılarak aynı amaç için birlikte ya da yedekli çalışan sunucu kümeleridir. Bir sunucu kümesi oluştureabilmek için birlikte çalışan ve “node” olarak adlandırılan iki veya daha fazla sunucunun bir arada kullanılması gerekmektedir. Bu şekilde küme yapısını oluşturmak sisteme tek bir sunucu kullanılarak elde edilene göre daha fazla kullanılabilirlik (availability), güvenilirlik (reliability) ve ölçeklenebilirlik (scalability) sağlamaktadır.

kubernetes cluste çalışma görseli. Görsel kaynağı https://kodekloud.com

Kubernetes cluster oluşturma yaklaşımlarını aşağıda kısaca ele almaya çalışacağım. İlerleyen yazılarda burada gördüğümüz cluster oluşturma yaklaşımlarını daha detaylı inceleyeceğim.

  • Tek Düğümlü Kümeler (Single-node cluster) : Tek sunuculu bir sistem kurup içinde k8s kurulumu yaptığımız bir yaklaşımdır. Master ve worker node aynı makina olarak işlem yapmaktadır.Genellikle local makinalarımızda k8s deneyimlemek için kullandığımız bir yaklaşımdır. Canlı deploy yaptığımız production ortamlarımızda kullanılması önerilmemektedir. Tek sunucu üzerinde k8s kurulumları Minikube kullanarak gerçekleştirilebilmektedir.
  • Tek Yönetici Çoklu İşleyicili Kümeler (Single-master, multi-node cluster) : Kubernetes kullanmak için birden fazla sunuculu bir sistem kurup içinde k8s kurulumu yaptığımız bir yaklaşımdır. Master ve worker nodelar ayrı makinalarda ayağa kaldırılarak işlem yapmaktadır. Kubernetes yöneticisi olarak işlem yapacak node tek başına çalışmaktadır ve tüm worker nodelar (minions olarak da bilinirler) ayrı ayrı konfigure edilip sisteme dahil edilmişlerdir. Genellikle 1 master ve 3 worker node olarak 4 sunucu şekilde tasarlanırlar. Çoklu sunucu üzerinde k8s kurulumları Kubeadm kullanarak gerçekleştirilebilmektedir.
  • Yüksek Erişilebilir Kümeler ( High availability cluster ): High availability (HA) kümeler, isimlerinden de anlaşılacağı üzere erişilebilirliği artırarak yüksek erişim sağlamak üzerine kurgulanmıştır. Sistemde single point of failure yani tek noktadan doğacak hataları yönetebilmek ve kritik öneme sahip servislerin minimum kesinti ile çalışması öncelikli amaçtır. Kubernetes tarafında yüksek erişilebilir küme için iki seçenek vardır. Bunlar Stacked etcd ve External etcd. Stacked yaklaşım için en az altı düğüme ihtiyacınız var (kontrol düzlemi için üç düğüm ve minyonlarınız için en az üç düğüm). Harici etcd yaklaşımı için en az dokuz düğüme ihtiyacınız olacak. Daha fazla bilgi için https://kubernetes.io/docs/setup/independent/ha-topology/ adresini ziyaret edebilirsiniz.

Pod ( Kapsül )

Konteyner kavramı ile çok karıştırılmak ile birlikte aslında biraz daha farklı bir yaklaşım sergilemektedir. Örnek olarak docker konteynerlar bir docker engine üzerinde herbiri bir iş için oluşturulmuş içinde tüm bağımlılıklarını barındıran birer iş parçacığından oluşmaktadır.

docker container görseli. Görsel kaynağı https://kodekloud.com

Kapsüller ( pod ) ise kubernetes’in en küçük bileşenleridir. Kubernetes Cluster’ımızda çalışan iş parçacıklarını ( process ) temsil etmektedir. Pod’lar Kubernetes Cluster’ınızın deploy edilebilir birimlerdir. Pod kavramı Kubernetes için docker container kavramından bir soyutlama anlamına da gelmektedir. Kubernetes, container’ları değil pod’ları yönetmektedir. Podlar mantıksal anlamda ilişkilendirilmiş birbirlerine bağımlı olmasa bile birlikte çalışan konteynerlar için bir kapsayısı görevi görmektedir.

pod ve node ilişkili detay görseli. Görsel kaynağı https://kodekloud.com

Örneğin yayınlamak istediğimiz bir uygulama bir python backend-api, bir .net backend-api uygulamasını içeren 2 farklı konteynerdan oluşuyor ise bunları aynı pod üzerinde ayağa kaldırmak mantıklı bir tercih olabilecektir. Bu şekilde pod oluşturma işlemine çoklu konteyner podları ( multi-container pod ) denilmektedir. Aksi halde birbirleri ile ilişkili olmayan uygulamaları ayrı podlarda yayınlamak en doğru yaklaşımdır.

Multi-container pod görseli. Görsel kaynağı https://kodekloud.com

ReplicaSet

Daha önce pod kavramından bahsetmiştik. Bir poddan kaç tane olacağını replicaset ile belirtiyoruz. İstediğiniz anda bir pod’u kesintisiz bir şekilde scale edebilir yada azaltabiliriz. Örnek vermek gerekirse aşağıdaki resim üzerinde ReplicaSet tanımlamasını bir yaml dosyası üzerinden takip edebilirsiniz. Bu dosya üzerinde replica:3 olarak verilmiştir. Bu sayede ilgili poddan kesinlikle 3 tane çalışacağını garanti eder. Podlar zaman zaman hata verse bile tekrar ayağa kaldırmaya çalışır.

ReplicaSet oluşturma yaml şablonu ve çıktısı. Görsel kaynağı https://kodekloud.com

Deployment

Deployment , uygulamalarımızı kubernetes kullanarak production ortamlarımızda yayınlamamıza olanak tanıyan bileşen olarak geçmektedir. ReplicaSet’in bize kazandırdığı ölçeklenebilirlik avantajının yanında rolling update yapma imkanı veren ilgili podu ve replica sayılarını tanımladığımız bir kubernetes bileşenidir.

Deployment, arka tarafta ReplicaSet kullanmaktadır. Birden fazla ReplicaSet kullanabildiği için de rolling update yapma şansına sahiptir. Aynı şekilde bir önceki versiyona rollback yapma imkanı da verir. Aslında uygulamamıza kubernetes ortamında deploy ederken Blue/Green deployment yeteneği kazandırır. Genel olarak kubernetes ortamında 2 çeşit deployment yönteminden bahsedebiliriz bunlar Recreate ve Rolling Update olarak bilinmektedir.

  • Recreate : Kubernetes üzerinde yayında olan sürümün tüm podlarının tek tek kapatılıp sonrasında yeni sürüm için belirtilen sayıda pod’un ayağa kaldırılması ile yürütülen deployment stratejisidir. Bu stratejiyi kullanırken karşılaştığımız en büyük sorun uygulamaların eski sürümlerin yer aldığı pod’ların teker teker kapatılması bittikten sonra yeni sürüme ait pod’lar ayağa kalkarken bir kesinti oluşacaktır. Yani uygulama kullanıcıları uygulamaya erişmek istediğinde ayakta ve hazır olan bir pod olmadığı için uygulamaya ulaşamayacaklardır.
  • Rolling Update : Bu strateji ile yayında olan uygulamaların eski sürüme ait kubernetes podlarının hepsinin kaldırılması yerine bir pod kaldırıldıktan sonra yerine yeni versiyona it bir pod’un ayağa kaldırılması işlemi gerçekleşir. Bu işlem başarılı olur ise diğer bir eski sürüme ait podun kaldırılma işlemi başlatılır ve belirtilen sayıda yeni versiyona ait uygulama yayına alınıncaya kadar devam eder. Bu sayede kesintisiz bir yeni versiyon yayınlama sürecini tamamlamış oluruz.

* Kubernetes varsayılan olarak rolling update stratejisini kullanmaktadır.

Recreate ve Rolling Update stratejileri işleyiş sıralaması. Görsel kaynağı https://kodekloud.com

Services

Temel olarak kubernetes bileşenlerinin birbirinden ve uygulama dışındaki diğer kaynaklardan haberdar olmasını sağlayan bileşendir. Pod’ların ön tarafında konumlanan ve gelen istekleri karşılayıp arka tarafa pod’lara gönderen katman olarak düşünebiliriz.

Bir service NodePort, LoadBalancer ve ClusterIP olarak 3 farklı şekilde tanımlanabilmektedir.

kubernetes service çeşitleri. Görsel kaynağı https://kodekloud.com

NodePort, bir pod için port tanımlaması yapılarak node üzerinden erişilebilmesine izin verir.

kubernetes nodeport service. Görsel kaynağı https://kodekloud.com

ClusterIP, cluster içinde sanal bir IP adresi oluşturarak servisler arası iletişimin bu adresler üzerinden yapılmasına olanak tanır. Örneğin, Frontend ve Backend servislerinin aralarında konuşabilmesi için bu servis tipi tercih edilir.

kubernetes clusterip service. Görsel kaynağı https://kodekloud.com

LoadBalancer , ilgili service’e bir public IP atanması sağlanır, bu sayede Service’in dış dünya ile iletişim içinde olması sağlanır. Dış networkten gelen istekler LoadBalancer service ile karşılanır ve ilgili Node’lara isteklerin dağıltıması gerçekleştirilir.

kubernetes loadbalancer service. Görsel kaynağı https://kodekloud.com

Namespaces

Kubernetes içinde objeleri ayırmamıza ve mantıksal olarak gruplamamıza yarar. İzolasyon anlamında bir çok faydası bulunmaktadır.

--

--

Serkan Bingöl
AWS Certified User Group Turkey

Muzur bir oğlan babası, hayvan sever, Harry Potter hayranı, bazen maceracı düz yazılımcı.