Kubernetes Orchestration

Docker & Kubernetes .Net Core MVC Uygulama Örneği

Deniz TÜRKMEN
5 min readNov 4, 2022

Merhabalar,

Kubernetes yazı serilerimi yayınlamaya devam ediyorum. Bu yazımda basit AspNet Core uygulamasını docker ve kubernetes ile ayağa kaldıracağız.

Yapacağımız aşamalar ;

Docker için

  • Dockerfile
  • Docker Compose
  • Docker Image
  • Docker Container

Kubernete için

  • Namespace
  • Statefulset
  • Persistent Volume
  • Persistent Volume Claims
  • Service
  • Ingress tanımlıycaz.

ilk olarak projemizi oluşturalım. Terminalden ilk olarak aşağıdaki komutu çalıştıralım.

mkdir -p Example

adında bir klasör oluşturalım. Klasörün içine girip

cd Excample
dotnet new mvc

komutunu çalıştıralım. Aşağıda resimde görüldüğü gibi projemiz oluştu.

Şimdi de oluşturduğumuz projeyi VSCode ile açalım. Bunun için

code .

komutu kullanalım. Ve projemizin dosya dizini bakalım.

Terminal ekranından

dotnet run

komutu çalıştıralım.

Yukarıdaki şekilde gözüktüğü gibi uygulamamız 5000 portundan yayınlanmaktadır. Şimdi de projemizi docker ile ayağa kaldıralım. Bunun için ilk olarak Dockerfile dosyamızı yazalım. Proje kök dizininde Dockerfile adında bir dosya oluşturalım.

Not : Dockerfile dosyasının bir uzantısı yoktur ve yazımı kesinlikle Dockerfile şeklinde olmalıdır. Dilerseniz Aşağıdaki linkten Dockerfile yazımı okuyabilirsiniz.

Dockerfile dosyamızdan bir docker image oluşturalım. Bunun için

docker image build — tag example .

komutu kullanalım ve oluşan image aşamalarını bakalım. Biliyorsunuz Dockerfile içerisinde yazdığımız her bir satır bir katmandır ve bu katmanları tek tek çalışarak Docker image alınır.

oluşan docker images görelim. Bunun için

docker images

komutunu kullanalım.

oluşan image ile container oluşturalım. Bunun için

docker container run — name deniz-example -d -p 6080:5080 example

Tarayıcından 6080 portuna gittiğimizde aşağıdaki resimde görüldüğü gibi containerımız 6080 portundan yayınlanmaktadır.

Şimdide docker-compose yazalım. Bunun için uygulamanın bulunduğu kök dizinde docker-compose.yaml adında bir dosya oluşturalım.

docker-compose.yaml dosyasının bulunduğu dizinde aşağıdaki komutu çalıştıralım.

docker-compose up

Yukarıdaki şekilde görüldüğü gibi docker-compose ile de uygulamamızı çalıştırdık.

Not : Burada dikkatinizi çekmek istediğin noktalar var.

  • docker-compose.yaml dosyasındaki ports kısımında ilk yazan 7080 bizim tarayıcımızdan ulaşacağımız portu temsil eder. localhost:7080 dediğimizde çalışan uygulamamızı görebiliriz.
  • ikinci kısımda yazan 5080 ise bizim image alırken container açtığımız portu temsil eder.
docker container inspect deniz-example

komutu “deniz-example” benim oluşturduğum containerın ismi siz oluşturduğunuz da ne isim verdiyseniz onu yazmanız gerekir.

Yukarıdaki resme bakarsak IPAdress : 172.17.0.2 aldığını görüyoruz. Eğer

172.17.0.2:5080

gidersem yine uygulamanın çalıştığını görebiliriz.

Şimdi de docker image elimizde olan uygulamamızı kubernetes çalıştırmak için yaml dosyalarımızı yazalım. Bu uygulamayı kendi bilgisayarınızda denemek için docker ve kubernetes kurulu olması gerekmektedir. İsterseniz kubernetes kurulumu anlattığım yazımı aşağıdaki linkten okuyabilirsiniz.

ilk olarak namespace yaml oluşturalım.

terminalden aşağıdaki komutu çalıştıralım.

kubectl apply -f namespace.yaml

Statefulset

terminalden

kubectl apply -f statefulset.yaml

komutunu çalıştıralım. Burada statefulset yaml içeriğini biraz açıklamak gerekirse. Bildiğiniz üzere docker stateless çalışır yani hiç bir durum bilgisi tutmaz. Container öldüğünde içerisindeki bilgiler silinir. Pod ölse bile yeni ayağa kalkan pod eski podun kaldığı yerden devam eder. Bu kaldığı yerden devam etmesini sağlamak içinde biz Persistent Volume tanımlarız. Statefulset ve PersistentVolume birbirine bağlarken selector dikket etmeliyiz. Yeni oluşacak pod hep aynı ismi alacaktır. Bunu yaparken

  • Podun ismi = statatefulset ismi ile persistent volume isminin birleşimidir.

Statefulset yaml içerisi bakarsak ;

  • servisName : alanı önemlidir. Buraya oluşturduğumuz servis name ismi yazarız.
  • containers : docker image aldığımız image ismi ne ise o yazılır.

containerPort yine aynı şekilde biz docker image alırken hangi port expose ettiysek o yazılır.

affinitiy: Kısımında hangi node çalışmasını istiyorsak onu yazarız.

Service

Burada bilmeniz gereken port kısmı servisin portu targetPort ise container expose ettiğmiz portu temsil eder.

kubectl get svc -n deniz

Yukarıdaki gibi şekilde ClusterIP’miz ile tarayıcıdan

10.107.192.226:5080

gittiğimizde uygulamanın çalıştığı göreceksiniz.

LoadBalancer ile eğer servisini dışarı açarsanız Loadbalancer aldığı ip adresi ile uygulamaya ulaşabilirsiniz. LoadBalancer olarak servisimi açmak için service.yaml içerisine

type: LoadBalancer

dememiz yeterlidir.

kubectl get svc -n deniz

External-IP aldığını göreceksiniz. Tarayıcıdan

192.168.1.201:5080

gittiğinizde uygulanın çalıştığını görebilirsiniz.

Persistent Volume

Çalışma dizinide hostpath belirtiğimiz için terminalden asağıdaki komutu çalıştıralım.

mkdir -p /mnt/kubernetes/example

Ingress tanımlayalım

Burada service name olarak service ismi olarak ne tanımladıysak onun ismini yazmamız gerekir.

Local bilgisarınız DNS çözümlemesi yapması için

/etc/hosts

Alınan ip ve host ismini yazarız.

192.168.1.201       web.example.com

ingress dns çözümlememizden sonra

Oluşturduğumuz yaml manifestlerini ister terminalden istersek de dashboard kontrol edebiliriz. Ben Dashboardtan kontrol edecem. İsterseniz terminal ekranından oluşturduğumuz yaml görmek için aşağıdaki komutları çalıştırabilirsiniz.

kubectl get service -n denizkubectl get ingress -n denizkubectl get statefulset -n denizkubectl get pv -n denizkubectl get pvc -n deniz
Persistent Volume
Persistent Volume Claim
Servis
StatefulSet
Pods
Pod Log

Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler. Diğer yazımda CI-CD inceliycez.

--

--

Deniz TÜRKMEN
Deniz TÜRKMEN

No responses yet