Pod Kavramı | Kubernetes Terimleri

Kubernetes Terimlerini açıklayacağımız yazı dizimizin ilk bölümü, yapının en küçük parçası olan podlar.

Pod Nedir?

Pod, bir veya daha fazla container’ın çalıştığı Kubernetes’in en küçük parçasıdır. Network olarakta yapının en alt bölümünde bulunan, yapının çalışan en küçük bileşenidir. Yapısal olarak, yeni bir deployment geldiğinde kurallara bağlı olarak eski parçaları yok ederek (kill – terminate), yeni podlar oluşur. Bu nedenle, kalıcı olarak tanımlanmayan tüm veriler, kaybolan pod ile birlikte silinir.

Yazımızın başında belirttiğimiz bir veya daha fazla container konusunu kısaca özetleyelim.

  • Single Container: En yayın kullanım olan bu modelde her pod içerisinde tek bir container çalıştırır. Bu kullanımda belirlenen kaynaklar pod’a özel olacaktır.
  • Multiple Containler: Bağlantılı kaynaklar, projelerin birlikte çalışması ihtiyacı gibi durumlar için kullanılan çoklu container yapısı, çalışan küçük parçacıkların ortak kaynaklar ile hareket etmesini sağlar. Bu modelde tanımlanan CPU, Memory kaynakları da ortak olacaktır.
Pod Nasıl Oluşturulur?
  1. Basit olarak bir yaml dosyasını kube API yardımı ile (kubectl) uygulayarak pod oluşturabiliriz.
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: busybox:latest
    command: ['sh', '-c', 'echo "Merhaba Kubernetes!" && sleep 60']

yaml uygulandığında, my-pod adı ile bir pod oluşturularak, içerisinde busybox:latest sürümünü kullanan bir container oluşacak. Pod loglarına baktığımızda “Merhaba Kubernetes!” karşılaması ile, bu container 60 saniye boyunca çalışarak (Running) ekstra bir işlem işletemeyeceği için restart olacaktır.

busybox: Yaygın linux araçlarını kullanmak/test etmek için tercih ettiğimiz 1-5MB aralığında küçük Unix imajıdır. Detaylı bilgiye buradan ulaşabilirsiniz.

Bu örneğimizde Single Container bir yapı kullandık. Yazımızın başında belirttiğimiz Multi Container için “containers” bölümü altında ki container’ların çoğaltılması gerekiyor.

Pod Değişkenleri

Yukarıda ki örnekte, oldukça sade bir yaml dosyası ile pod kavramına baktık. Belirtilenlerin dışında parametre olarak tanımlanan yaygın kavramlar şöyledir:

  • resources: CPU ve Memory kaynaklarını belirlememizi sağlar.
  • volumeMounts: Container’ın kullandığı disk tanımlarını yapar.
  • env: Ortamda kullanılacak değişkenlerin tanımlarının yapılmasını sağlar.
  • namespace: Pod’un çalışacağı namespace bilgisi tanımlanır.
  • restartPolicy: Olası pod hatasında restart koşulunu belirler. Parametre olarak Always, OnFailure, Never alabilir. Default ayarı “Always”dir.
  • imagePullSecrets: busybox olarak belirttiğimiz image ortamı kimlik doğrulama gerektiren bir alansa (private repo), kimlik bilgileri bu bölümde tanımlanır.

Diğer tanımları bağlantılı olarak farklı yazılarımızda yayınlayacağız.

2. CLI kullanarak aşağıda ki komut ile pod oluşturabiliriz.

kubectl run <pod-name> --image=<image-name> --port=<port-number>

Bu örneğimizde, nginx image kullanarak bir pod oluşturalım.

kubectl run my-pod --image=nginx --port=80

Sadece bu komut ile, 80 portunu dinleyen ve nginx image kullanan Single Container bir pod çalıştırmış olduk. Pod’a ait loglara aşağıda ki komut ile ulaşabilirsiniz.

> kubectl logs my-pod
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/07/19 11:46:18 [notice] 1#1: using the "epoll" event method
2023/07/19 11:46:18 [notice] 1#1: nginx/1.25.1
2023/07/19 11:46:18 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2023/07/19 11:46:18 [notice] 1#1: OS: Linux 5.15.0-1035-azure
2023/07/19 11:46:18 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/07/19 11:46:18 [notice] 1#1: start worker processes
2023/07/19 11:46:18 [notice] 1#1: start worker process 30
2023/07/19 11:46:18 [notice] 1#1: start worker process 31

Yazımızın yazıldığı tarihte nginx:latest sürümü 1.25.1 olarak görünüyordu. Dosya olarak oluştururken belirtmemize rağmen (busybox:latest) CLI tarafında belirtmediğimizi göreceksiniz. Her iki durumda da spesifik olarak versiyon belirtilmediği sürece “latest” tag alınacaktır.

Testler sırasında namespace parametresi belirtmediğimiz için tüm ortamlar “default” namespace altında çalışacaktır. İsimlendirme olarak her iki test içinde “my-pod” kullandığımız için, aşağıda ki komutu uygulamanız durumunda oluşturduğumuz test pod ve bağlı container(lar) silinecektir.

kubectl delete pod my-pod

Kubernetes ile ilgili yazılarımızı, Blog sayfamızın DevOps kategorisinden takip edebilirsiniz.

Kaynak: Kubernetes Pods

Bunlarda ilgini çekebilir

Önceki yazı
Azure Blob ve Limitsiz Storage
Sonraki yazı
WordPress En İyi 5 Eklenti (2024 Uzman Seçimi)