Kubernetes Orchestration
Docker & Kubernetes .Net Core MVC Uygulama Örneği
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
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.