Merhaba arkadaşlar bu yazımda Kubernetes API Nesnelerini inceleyeceğiz. Bu yazının sonunda;
- API sürümlerini keşfedebilir,
- Deployment kullanarak bir uygulama dağıtıp, yapılandırabilir,
- Kendini iyileştiren bir uygulama için ilkeleri bilebilir ve
- Bir uygulamayı ölçeklendirebilirsiniz.
Bu bölümde API nesnelerini öğreneceğiz. v1 API grubundaki ve diğer gruptaki kaynaklar hakkında bilgiler edineceğiz. Nesneler alfa sürümlerinden beta sürümlerine ve sonra v1‘e geçtikçe daha kararlı hale gelirler. API sisteminin bu durumlarını bir sonraki laboratuvar yazılarında gerçekleştireceğiz.
DeamonSets, ReplicaSets, StatefulSets v1’in parçası olmuşlardır. Jobs ve CronJobs işlemleride beta sürümlerini tamamlayıp v1’e geçmişlerdir. Değişiklikleri takip edip hızlı hareket eden bir projeniz varsa sürüm notlarını ve sürüm geçmişlerini GitHub‘da bulabilirsiniz.
v1 API Grubu
v1 API grubu artık tek bir grup değil, her ana nesne kategorisi için bir grup haline gelmiştir. Örneğin, bir v1 grubu bir storage.k8s.io/v1 grubu ve bir rbac.authorization.k8s.io/v1 gibi gruplardan oluşur. Bazı terimlerin yabancı kalmaması için terimleri öğrenelim.
Node: Kubernetes cluster’ınızın bir parçası olan makineyi (fiziksel yada sanal) temsil eder. kubectl get nodes komutu ile node’lar hakkında daha fazla bilgi edinebilirsiniz. Scheduler işini kubectl cordon / uncordon komutları ile bir node için açabilir veya kapatabilirsiniz.
Service Account: API sunucusuna erişmek için bir pod’da çalışan işlemler için bir tanımlayıcı sağlar ve yapmaya yetkili olduğu eylemleri gerçekleştirir.
Resource Quota: Her namespace için kota tanımlamanıza izin veren son derece faydalı bir araçtır. Örneğin, belirli namespace için yalnızca belirli sayıda pod çalıştıracak şekilde sınırlamak istiyorsanız, resource quota bildirimini kubectl ile oluşturabilirsiniz.
Endpoint: Genel olarak endpoint’leri yönetemezsiniz. Belirli bir servis ile eşleşen pod’lar için IP kümesini temsil eder. Bir servisin, çalıştığı pod’larda eşleştiğini kontrol etmek istediğinizde kullanışlıdır. Bir endpoint boşsa, bu durumda eşleşen pod bulunmadığı için servis tanımınızda büyük olasılıkla yanlış birşeyler olduğu anlamına gelir.
API Gruplarını Keşfedelim
Mevcut API çağrılarının çıktısına daha yakından bakabiliriz. Bir gurubun ayrıntılarını görmek için ad değerleri her bir URL’e eklenebilir. Örneğin, https://10.142.0.14:6443/apis/ apiregistrationk8s.io/v1beta1. Bu URL’i izlerseniz, apiservices adında bir kaynak görebilirsiniz.
Gelişmiş Uygulama Dağıtma
kubectl create komutunu kullanarak bir uygulamayı hızla dağıtabiliriz. nginx isimli uygulamayı çalıştıran pod’ları inceledik. Daha yakından bakıldığında, pod’u dağıtan bir ReplicaSet’in yönetildiği Deployment’ları göreceğiz. Bu nesnelere daha yakından bakalım:
Deployment: ReplicaSets durumunu ve içindeki pod’ları yöneten bir controller’dır. Daha yüksek seviye kontrolü ve yükseltme yönetimle daha fazla esneklik sağlar. Daha iyi bir sebebiniz yoksa mutlaka deployment kullanın.
ReplicaSet: Bireysel pod yaşam döngüsünü düzenler ve günceller. Replica Controller’ların yeni sürümleridir diyebiliriz.
Pod: Bahsettiğimiz gibi yönetebileceğimiz en düşük birim, uygulama container’ını çalıştıryor ve container’ları destekliyor.
DeamonSets
Her node’da bir loglama uygulaması istiyorsanız DaemonSets iyi bir seçim olabilir. Controller, cluster’daki her node’da aynı türdeki tek bir pod’un çalışmasını sağlar. Cluster’a yeni bir node eklendiğinde, diğer node’larda konuşlandırıldığı gibi bir pod başlatılır. Node kaldırıldığında DaemonSets local pod’un silindiğinden emin olur.
Örnek komutları:
$ kubectl get daemonsets
$ kubectl get ds
StatefulSets
SatefulSet, durum bilgisi olan uygulamaları yönetmek için kullanılan bir API nesnesidir. Bir StatefulSet kullanarak dağıtılan pod’lar aynı pod spec’i kullanır. Bunun bir dağıtımdan farklı olmasının sebebi, bir StatefulSet’in her pod’u benzersiz olarak gördüğü ve pod dağıtımı için sipariş oluşturuyor olmasıdır.
Her pod’u benzersiz bir nesne olarak izlemek için, kararlı depolama, kararlı ağ kimliği ve sıradan oluşan bir kimlik alırlar. Bu kimlik, herhangi bir zamanda pod’un hangi node’da çalıştığına bakmaksızın node’da kalır.
Varsayılan dağıtım şeması app-0, app-1, app-2 vb gibi 0 ile başlar ve ardışıktır. Geçerli pod çalışır duruma gelene kadar bir sonraki pod başlatılmaz. Paralel olarak dağıtılmazlar. StatefulSets Kubernetes v1.9’dan itibaren v1’de yer alır.
Otomatik Ölçeklendirme
Otomatik ölçeklendirme grubunda, Yatay Otomatik Pod Ölçekleyicisi’ni (Horizontal Pod Autoscalers – HPA) görüyoruz. HPA’lar varsayılan olarak %50 CPU kullanımı hedefine göre Replication Controller, ReplicaSets veya Deployments tabanlı hedefleri otomatik olarak ölçeklendirir. Her 30 saniyede bir kubelet tarafından kontrol edilir ve her dakika Metrics Server API çağrıları tarafından alınır. HPA, Metrics Server ile birlikte 30 saniyede bir kontrol sağlar. Bir pod eklenmesi veya çıkarılması durumunda, HPA bir sonraki işlemden önce 180 saniye bekler.
Diğer metric’ler REST yoluyla kullanılabilir ve sorgulanabilir. Otomatik ölçekleyici metric’leri toplamaz, yalnızca toplanan bilgiler için bir istekte bulunur ve yapılandırmaya uygun çoğaltma sayısını arttırır veya azaltır.
Küme Otomatik Ölçekleyici (Cluster Autoscaler – CA), bir pod’un konuşlandırılmamasına veya en az 10 dakika boyunca düşük kullanımı olan node’ların bulunmamasına bağlı olarak cluster’a node ekler veya kaldırır. Bu, bulut sağlayıcısından kaynakların dinamik isteklerini sağlar ve kullanılmayan node’lar için maliyetleri en aza indirir. CA kullanıyorsanız, node’lar cluster-autoscaler ölçekleme komutları aracılığıyla eklenmeli ve kaldırılmalıdır. Her 10 saniyede bir node’ların büyütülmesi ve küçültülmesi kontrol edilir, ancak her 10 dakikada bir node’da kararlar alınır. Bir küçülme başarısız olursa, grup 3 dakika içinde tekrar kontrol edilir ve başarısız node 5 dakika içinde uygun olur. Yeni bir node ayırmanın toplam süresi büyük ölçüde bulut sağlayıcısına bağlıdır.
Halen geliştirilmekte olan bir başka proje ise Dikey Pod Otomatik Ölçekleyicidir (Vertical Pod Autoscaler). Bu bileşen, pod’lar tarafından istenen CPU ve bellek miktarını ayarlayacaktır.
Jobs
API grublarının bir parçasıdır. Belirli sayıda pod’un çalıştırılması tamamlanması için kullanılabilir. Bir pod başarısız olursa, tamamlama sayısına ulaşana kadar yeniden başlatılır.
Kubernetes’de toplu işlem yapmanın bir yolu olarak görülebilirken, bir kereye mahsus pod’ları çalıştırmak için de kullanılabilirler. Bir Job spesifikasyonunda bir paralellik ve tamamlama anahtarı bulunacaktır. Belirtilmezse, bir olarak ayarlanacaktır. Varsa paralellik sayısı eşzamanlı olarak çalışabilecek pod sayısını belirleyecektir ve tamamlama numarası, job’ın kaç pod’un başarılı bir şekilde çalışması gerektiğini belirleyecektir. Geleneksel bir iş kuyruğu gibi birkaç Job modeli uygulanabilir.
CronJobs, linux job’larına benzer şekilde aynı syntax ile çalışır. Bir job’ın bir süre boyunca çalıştırmayacağı veya iki kez çalıştırabileceği bazı durumlar vardır.
Bazı seçenekler belirtmek istiyorsak .spec.concurrencyPolicy‘i kullanırız. Allow olarak ayarlanırsa varsayılan başka bir eşzamanlı job çalıştırılır. Forbid olarak ayarlanırsa geçerli job devam eder ve yeni iş atlanır. Replace olarak adlanırsa geçerli job’ı iptal eder ve yerine yeni bir job başlatılır.
RBAC
Bakacağımız son API kaynağı rbac.authorization.k8s.io grubudur. Aslında dört kaynağımız daha var: ClusterRole, Role, ClusterRoleBinding ve RoleBinding. Kubernetes için (RBAC) Role Base Access Control kullanılır.
Bu kaynaklar bir küme içindeki rolleri tanımlamamıza ve kullanıcıları bu rollere ilişkilendirmemizi sağlar. Örneğin, yalnızca belirli bir namespace’deki pod’ları okuyabilen birisi için rol tanımlayabilir veya deployment oluşturabilen ancak servis içermeyen bir rol tanımlayabiliriz. Kubernetes eğitim serimizin ileriki derslerine doğru RBAC hakkında daha fazla konuşacağız.
Kubernetes API Nesneleri yazımın bu kısımda sonuna gelmiş bulunmaktayız. Bu teori bilgiler için hazırladığım laboratuvar yazıma buradan geçebilirsiniz, görüşmek üzere !
Umarım bu yazı sizin için bilgilendirici olmuştur. Yazıyla ilgili bir sorunuz, görüşünüz veya isteğiniz varsa alt kısımda bulunan yorumlardan veya mail adresimden iletişime geçebilirsiniz. Bu yazının başkaları içinde bilgilendirici olduğunu düşünüyorsanız sosyal olun ve sosyal medyada paylaşın! Okuduğunuz için teşekkürler !!!