Kubernetes Uygulama Yükleme(Deployment)

Arif KIZILTEPE
6 min readJul 5, 2020

--

Yazılarımı takip ediyorsanız bir önceki yazımda docker imaj hazırlama konusuna değinmiştim.

Bu yazıda daha önce hazırladığım 32bitbilgisayar/figo imajını cluster kubernetes üzerine yükleyeceğiz.

Bir uygulamanın kubernetes üzerinden çalışması için şu adımları yapmamız gerekiyor.

  1. Uygulama geliştirilir ve container imajı oluşturulur.
  2. Kubernetes için manifest(yaml yada json) dosyası yazılır
  3. Manifest’e uygun olarak kubernetes api uygulamayı kendisine bağlı node(worker) üzerine göndererek çalışmasını sağlar.

1. Adımı “Docker Image Nasıl Hazırlanır” yazısında anlatmıştım. Bu yazıda 2. ve 3. adımları uygulayacağız.

Yaml dosyası oluşturmadan önce kubernetes üzerinde bu yazıda yapacağımız deployment işleminin 2 farklı yolu olduğunu söylemek istiyorum.

  • Imperative : Komut ile yapılan işlemlerdir. Deployment ve deployment’a özellikler atamak için komutlar kullanılır.
  • Declarative : Yapılacak işlemlerin bir veya birden fazla script içerisinde tanımlanıp yürütülen işlemlerdir. Bizim Kullanacağımız yöntem de budur.

Öncelikle yaml dosyası oluşturuyoruz.

vi figo-deployment.yaml

Daha sonra yaml dosyasının içerisini aşağıdaki gibi düzenliyoruz.

apiVersion: apps/v1
kind: Deployment
metadata:
name: figo-deployment
labels:
app: figo
spec:
replicas: 1
selector:
matchLabels:
app: figo
template:
metadata:
labels:
app: figo
spec:
containers:
- name: figo
image: 32bitbilgisayar/figo
imagePullPolicy: Never
ports:
- containerPort: 8080

Yaml içeriğini incelersek.

  • apiVersion → Kubernetes API bilgisi Kubernetes üzerindeki aktif API listesine şu komut ile ulaşabilirsiniz. (Bu alan zorunludur.)
kubectl api-resources
  • kind → Yaml içeriğinin deployment olduğunu belirtiyoruz. (Bu alan zorunludur.)
  • name → Deployment’ın ismi.
  • spec → Yapılacak deployment özelliklerinin tanımlandığı bölüm. (Bu alan zorunludur.)
  • replicas → Deployment’ın çalıştığı süre boyunca canlı kaç adet pod çalıştıracağı belirtilir.
  • containers → Bu deployment’ta çalışacak konteynerların özelliklerini belirttiğimiz bölüm
  • containers.name → Konteyner’ımızın ismi
  • image → Hangi Docker image’ı kullanacağımız bilgisi
  • ports → Dışarıdan hangi porttan ulaşacağımız bilgisi. Fakat bunun için service oluşturmak gerekiyor. Bunun için bir sonraki adımda işlem yapacağız.
  • imagePullPolicy → Kullanılacak olan imajın indirilme durumunu belirler. Biz official hub.docker.com adresinden indirmeyip local imajımı kullanacağım için Never olarak set ediyorum.

Kubernetes manifest dosyamızı oluşturduk. Şimdi kubernetes ekosistemimize yükleyelim.

kubectl apply -f figo-deployment.yaml

Deployment oluştu. Oluşan deployment’ı görüntüleyelim.

kubectl get deployments
  • Name → Deployment adı.
  • Ready → Uygulamanın kaç kopyasının kullanıcılarınız için kullanılabilir olduğunu gösterir. Bizim ki daha hazır değil :)
  • Up-to-date → İstenen duruma ulaşmak için güncellenmiş kopya sayısını görüntüler.
  • Available → Uygulamanın kaç kopyasının kullanıcılarınız için kullanılabilir olduğunu gösterir.
  • Age → Uygulamanın çalıştığı süreyi görüntüler.

Deployment işlemini çalıştırdık ama hazır olmadı? Evet olaylar biraz havada kaldı. Deployment işleminin arka plandaki durumunu görüntülemek için şu komutu kullanabiliriz.

kubectl rollout status deployment.v1.apps/figo-deployment

Deployment işlemi tamamlandı. Deployment ve podları görüntülediğimde sorunsuz çalıştığını görüyorum.

Uygulamamızı dışarıdan erişime açmak için service oluşturmamız gerekiyor. Bu işlem de deployment gibi yaml dosyası oluşturularak yapılabilir.

Yaml dosyası oluşturuyoruz.

vi figo-service.yaml

Yaml dosyasının içerisini aşağıdaki gibi düzenliyoruz.

apiVersion: v1
kind: Service
metadata:
name: figo
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: figo
  • apiVersion → Kubernetes API bilgisi Kubernetes üzerindeki aktif API listesine şu komut ile ulaşabilirsiniz. (Bu alan zorunludur.)
kubectl api-resources
  • kind → Yaml içeriğinin service olduğunu belirtiyoruz. (Bu alan zorunludur.)
  • name → Servisin ismi
  • spec → Yapılacak deployment özelliklerinin tanımlandığı bölüm. (Bu alan zorunludur.)
  • ports → Servis aracılığı ile erişeceğimiz port. Uygulamamız bu portu kullanıyordu hatırlarsanız.
  • selectors → Çalışacak servisin hangi deployment ile bağlantılı olacağı belirtilir.
  • Type: → Kubernetes ekosisteminde uygulamaya nasıl erişileceğini belirlediğimiz alandır. 4 farklı yöntem vardır.

ClusterIP : Bu tipte tanımlanan servisler dışarıdan erişilemezler. ClusterIP tipi için servise sanal bir cluster ip adresi atanır. Erişimler atanan bu ip adresi veya selector içerisinde belirlenen isim üzerinden gerçekleştirilir.

Örneğin kubernetes ortama Elasticsearch(ClusterIP), Logstash(ClusterIP) ve Kibana(NodePort) şeklinde kurulum yaptığınızı düşünün. Selector içerisinde belirlediğiniz isimler ile podlar kendi arasında iletişim kurabilir fakat siz dışarıdan erişemezsiniz. Kibana NodePort tipide expose edildiği için dışarıdan kibana dashboarda erişebilirsiniz.

NodePort : Bu tipte tanımlanan servisler dışarıdan erişilebilir olurlar. Service manifes yazılırken belirtilen NodePort değeri ile her bir Cluster Node’u üzerinde port açılarak servise yönlendirilir. Açılan bu port üzerinden erişim sağlanır.

LoadBalancer : Bu tipte tanımlanan servisler NodePort gibi dışarıdan erişilebilir olurlar. NodePort’tan farklı olarak Kubernetes Node’larının önünde önceden konumlanmış load balancer(yük dengeleyiciler) bulunur ve dışarıdan gelen trafiği arka planda podlara yönlendirir.

ExternalName : Bu tipte tanımlanan servisler önceki türlerde olduğu gibi selector kullanmak yerine DNS adını kullanacaktır. Bu türde, önceki türlerde olan proxy ya da forward işlemleri kullanılmaz. Yönlendirme işlemi DNS seviyesinde gerçekleştirir. Ufak bir örnek verecek olursak;

apiVersion: v1
kind: Service
metadata:
name: figo
spec:
type: NodePort
externalName: figo.32bit.com.tr
ports:
- port: 8080
targetPort: 8080

Örnekteki service figo.master.32bit.com.tr(Kubernetes ekosisteminin uygulama adı ve hostname ile oluşturduğu kayıt) adresi üzerinden yapılan isteklerde DNS servisi CNAME kaydı olan figo.32bit.com.tr adresine dönecektir.

Bu önemli konuya da anlattığımıza göre artık servisimizi oluşturup uygulamamızı test edebiliriz.

kubectl create -f figo-service.yaml

Servis başarı ile oluştu. Biz servisimizi NodePort tipinde oluşturmuştuk, kubernetes ekosisteminin bize dışarıdan erişim için verdiği portu görüntüleyelim.

kubectl get service

Resimde gördüğümüz gibi bizim uygulamamızın kullandığı 8080 portuna erişebilmemiz için 30370 portunu vermiş.

Benim kubernetes ekosisteminde çalıştırdğım figo projesi ocr işlemi yaparak fiş üzerindeki alanları okuyor. Şimdi projenin başarılı çalışıp çalışmadığını görmek için postman ile test yapacağım.

Uygulamanın /upload context’ine file parametresi olarak fiş resmi ekleyerek istek atıyorum.

Uygulamamız başarı ile çalıştı.

Aslında docker konusunda çokça kullandığımız container karşılığı olarak kubernetes dünyasında pod terimini kullanıyorum. Docker container cli bağlanmak için kullandığımız bir yöntem vardı.

docker exec -it [IMAGE NAME/ID] /bin/bash

Aynı şekilde kubernetes üzerinde podlara erişmek için de benzer bir yöntem var.

kubectl exec --stdin --tty [POD NAME] -- /bin/bash

Aslında bir sonraki yazımda kubernetes üzerine ELK(Elasticsearch, Logstash, Kibana) kurulumu yapıp uygulama loglarını buradan takip edeceğim. Fakat şimdilik postman ile yaptığımız isteğin uygulama tarafındaki loglarına bakmak için pod’a bağlanıyorum.

kubectl exec --stdin --tty figo-6fd8659498-bt6ld -- /bin/bash

Gördüğünüz gibi artık pod içerisindeyim.

Uygulama loglarını izlemek için tail -f logs/logfile.log komutunu yazıp tekrardan istek atıyorum.

Uygulamamız başarı ile çalışıyor. Bir sonraki yazıda kubernetes ekosistemini daha karmaşık hale getirip bu tür işlemleri kolaylaştıracağız.

--

--

No responses yet