Yeni Başlayanlar için Kubernetes Kavramları : Pod

Seri şeklinde başladığım Kubernetes makalelerimde bileşen kurulum ve yapılandırmaları yanında kavramsal detayları da aktarmayı planlıyorum. Bu makalemde de bunlardan ilkiyle başlayalım; Pod.

Pod için kubernetes’in en küçük bileşenidir demek yanlış olmayacaktır. Kubernetes Cluster’ınızda çalışan process’leri temsil etmektedir. Pod’lar Kubernetes Cluster’ınızın deploy edilebilir birimlerdir. Bu bakış açısıyla, Docker’a aşina iseniz, en kaba haliyle container’a denk geldiğini söyleyebilirim. Peki, madem pod’lar container’ler birbirine yakın, o zaman pod kavramı neden var?

Bu soruya verilece cevap için örnekleme yaparak ilerlemek daha doğru olacaktır. Daha önceden duyduğum ve bu konuya en güzel örneklerden birini aktaracağım. Susadığınızı varsayalım. Bir bardak dolusu suyu kana kana içmek isteriz. Öte yandan elinizde sadece atomlar var. Önce doğru atomları seçmeliyiz, Hidrojen ve Oksijen atomları. Bu atomlar tek başlarına doğaları gereğini yerine getirecektir; ama bu halleriyle sizin susuzluğunuza çağre değiller. Farklı kombinasyonlarda bir araya getirilebilirler. Bir Oksijenin yanına bir Hidrojen koyduğumuzda karşımıza Hidroksit çıkacaktır. Susuzluğumuzu dindirmeyeceği aşikar. Doğru kombinasyon 2 Hidrojen ve 1 Oksijen olacaktır.

Bu atomların uygulama bileşenlerimiz, container’larınız olduğunu düşünelim. Bu durumda Pod kavramı H2O’ya karşılık gelecektir. Daha fazla su istediğimizde nasıl hidrojen ve oksijen atomlarını ayrı ayrı ve rastgele oranlarda değil H2O’yu çoğaltmak istersek, uygulamamızı çoğaltmak istediğimizde bu container’ları değil Pod’unu çoğaltmak isteriz. İşte tam da bu sebeple ‘mantıksal bir sunucu’ olan Pod’lar Kubernetes’in en küçük bileşenleridir. Tabi ki burada bir Pod’un duruma göre (hatta sıklıkla demek daha doğru olur) sadece tek bir container’dan da oluşabileceğini not olarak düşmeliyim.

Konuya teknik olarak yaklaştığımıza ise; hatırlarsanız container’lar linux namespace’leri sayesinde birbirlerinden ayrılmaktadır. Farklı namespace’deki process, network, storage v.s. birbirlerini göremeyecek, birbirlerinden izole olacaktır. Bu yaklaşımdan yola çıkarsak, Kubernetes’te network ve storage gibi kavramlar için bu soyutlama pod düzeyindedir. Bunun anlamı, aynı pod içerisindeki container’lar aynı storage’ı, network’ü paylaşırlar. Bir pod’daki container’ın açtığı bir sokete yine aynı pod’daki bir diğer container localhost (127.0.0.1) üzerinden ulaşabilir. Bunun yanında Pod içeresindeki container’lar birbirleriyle SystemV semaforları ve POSIX ortak hafızaları sayesinde iletişim kurabilirler. Öte yandan tabi ki pod içerisindeki container’lar için de farklı soyutlamalar söz konusudur. Bu esneklik sayesinde farklı container’ları bir araya getirerek kullanımımıza uygun doğru bileşenleri oluşturabilir, yatayda bu bilenleri kolayca çoğaltabiliriz.

Pod’ların bir diğer önemli sorumluluğunun da soyutlama olduğu rahatlıkla söyleyebilirim. Kubernetes’de en fazla tercih edilen container runtime’ı Docker olmakla birlikte alternatifleri de olduğunu unutmamak gerekir. Bu noktada Pod kavramı Kubernetes için aynı zamanda Docker container kavramında bir soyutlama anlamına da gelmektedir. Kubernetes, container’ları değil pod’ları yönetmektedir.

Pod’ların doğası gereği birden fazla container’ı desteklemesi init container, app containers, side car v.b. mantıkların gelişmesine de olanak sunarak container’lardan bağımsız olarak biz geliştiricilere önemli esneklikler de kazandırmıştır. Örneğin; nginx container’ı ile belirli bir dizindeki dosyaları sunan bir pod’un ayağa kalkarken init container’ında sunulacak bu dosyaların hazırlanması sağlanabilir.

Bu esneklikte beraberinde bir sorumlulukta getirmektedir. Pod içerisindeki container’ların aynı kavnakları kullanmaları nedeniyle kaynak yönetimine dikkat edilmelidir. Örneğin; pod içeriside birden fazla container’ın aynı network portunu kullanmak istemesi hataya neden olacaktır.

Pod’larda dikkat edilmesi gereken bir diğer konu da Kubernetes’in pod’lara olan yaklaşımıdır. Kubernetes bakış açısıyla pod’lar fanidir. Herhangi bir zamanda Kubernetes tarafından çalışmaları sonlandırılabilir. Çalışmalarının sonlanması ile birlikte varsayılan olarak verileri de kaybolacaktır. Dolayısıyla Kubernetes’te geliştirilen uygulamaların saklamaları gereken verileri varsa ram ya da yerel disk alanından farklı yerlerde saklamaları tavsiye edilmektedir. Bu alan, uzaktaki bir veritabanı olabileceği gibi dosya sistemine bağlanmış bulut depolama alanları da olabilir.

Kubernetes’in pod’lara fani olarak yaklaşması, beraberinde pod’lar üzerinde koşan uygulamalarımızı yönetmek için bir soyutlama ihtiyacı doğurmaktadır. Bu noktada sahneye çıkan Controller’lar pod’ların doğrudan yönetilmesi yerine daha soyut olarak yönetilmesine olanak sunmaktadır. Bu durumda yönetimde ek bir kolaylığı beraberinde getirmektedir.

Kavramsal olarak Pod’ları incelediğimiz bu makalede son olarak bu kadar bahsi geçen Pod’ları Kubernetes’te nasıl olşturabileceğimize değinmeden olmazdı. Aşağıda en basit haliyle bir pod tanım dosyasını görebilirsiniz;

apiVersion: v1
kind: Pod
metadata:
  name: enterprisecoding-pod
  labels:
    app: enterprisecoding-app
spec:
  containers:
  - name: enterprisecoding-app-container
    image: busybox
    command: ['sh', '-c', 'echo Merhaba Kubernetes! && sleep 3600']

Bu örnekte 9-11. satırlar arasında container tanımı yer almaktadır. 8. satırda yer alan containers elementi bir array’dir. Dolayısıyla istenirse bu başlık altında birden fazla container tanımı yer alabilir. 3. satırda başlayan meta veri’de pod’umuzun adını belirtmemiz gerekmekte. Seçimli olarak, 5 ve 6. satırlarda olduğu gibi pod’umuza etiket ataması yapabiliriz. Opsiyonel olan bu etiket tanımları Kubernetes’te pek çok yönetim kolaylığı getirmesi nedeniyle hızlıca alışacağınızı ve kullanacağınızı düşündüm bir özelliktir.

Fatih Boy

Ankara'da yaşayan Fatih, kendi şirketinde özellikle bankacılık, sigortacılık ve otomotiv sektörlerinde IT danışmanlıkları vermektedir. Devops, ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.