docker etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
docker etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Docker Image ve Container Oluşturma


Daha önce java projesinden jar oluşturmuştuk. Şimdi oluşturulan JAR'dan docker image oluşturacağız ve docker image'ı çalıştırarak container oluşturacağız.


--Dockerfile dosyasını oluşturuyoruz.

FROM openjdk:8-jre-alpine3.9

COPY HelloDocker.jar /HelloDocker.jar

CMD ["java", "-jar", "/HelloDocker.jar"]


--Dikkat Dockerfile dosyası bu şekilde olmalı ve aynı klasörde olmalı


--Aşağıdaki komut ile localde image oluşturuyoruz.

docker build -t hello-docker .


--image çalıştırmak için


docker run hello-docker



--eğer web uygulaması olsaydı image içinde port expose yoksa run ederken verilebilir varsa imageda belirtilen port üzerinden erişilebilir

docker run -p 8080:8080 hello-docker

--url:

localhost:8080


--containerları listelemek için

docker container ls -a


--container durdurmak için

docker stop <container_id>

docker stop 78ef4679e8f7


--container silmek için

docker container rm <containerid1> <containerid2>

docker container rm 78ef4679e8f7

docker run hello-docker


--image listelemek için

docker images 


--image silmek için

docker image rm <imageid1>

docker image rm <imageid1> -f

docker image rm <imageid1> --force




spacer

Java projesinden jar (java archive) dosyası oluşturma

JAR, genellikle birçok Java sınıfı dosyasını ve ilişkili meta verileri ve kaynakları dağıtım için tek bir dosyada toplamak için kullanılan bir paket dosyası biçimidir. JAR dosyaları, Java'ya özgü bildirim dosyası içeren arşiv dosyalarıdır. ZIP biçiminde oluşturulmuştur ve genellikle .jar dosya uzantısına sahiptir. https://github.com/abdullahcetinkaya/HelloDocker --HelloDocker paketindeki Main sınıfını derliyoruz. --Böylece Main.class dosyası oluşturulacak. javac HelloDocker/Main.java --HelloDocker.Main sınıfını çalıştırıyoruz. java -cp . HelloDocker.Main --Şimdi de bu sınıftan bir JAR oluşturuyoruz. jar cfme HelloDocker.jar Manifest.txt HelloDocker.Main HelloDocker/Main.class --Oluşturduğumuz JAR'ı çalıştırıyoruz java -jar HelloDocker.jar Not: javac command prompt ekranında çalışmıyorsas bilgisayarınızın ortam değişkenlerini ayarlamanız gerekiyor. JAVA_HOME ve JAVA_PATH Ayarları: 1. Yöntem Bilgisayarım simgesine sağ tıklayın ve Özellikleri seçin. Açılan pencerede, sol taraftan Gelişmiş sistem ayarlarını seçin. Açılan pencerede, Gelişmiş sekmesinde Ortam değişkenleri butonuna tıklayın. Açılan pencerede, alttaki bölümden Path seçeneğini seçin ve Düzenle butonuna tıklayın. Açılan pencerede, Değişken değeri bölümündeki metinin sonuna noktalı virgül (;) koyarak, C:\Program Files\Java\jdk1.8.0_291\bin ifadesini ekleyin ve Tamam butonuna tıklayın. Sizdeki java versiyonu farklıysa path'a dikkat edin. 2. Yöntem Command Prompt ekranında java pathini aşağıdaki komut ile set edin ve aynı komut ekranında işlemlerinizi bitirin. Bu yöntem geçici bir yöntemdir komut konsolu kapatılınca set edilen ayarlar silinir. set PATH=C:\Program Files\Java\jdk1.8.0_291\bin




spacer

Windows 10 Üzerinde Docker Kurulumu

 Windows 10 üzerinde docker kurulabilmesi için sistem gereksinimleri:

Windows 10 64 bit işletim sistemi; Professional, Enterprise yada Education sürümü destekleniyor. Kurulum öncesinde Windows 10’un 2004 ve üzeri sürümü olmalı. Windows sürümünüz güncel değilse kurulum öncesi güncelleyin. Docker, Microsoft’un Windows 10 işletim sistemi için destek yaşam döngüsüne dayalı olarak Docker Desktop’ı destekliyor. Destek yaşam döngüsü (support lifecycle) erişimi için; https://support.microsoft.com/en-us/help/13853/windows-lifecycle-fact-sheet Windows 10 işletim sisteminde Hyper-V ve Containers özellikleri etkinleştirilmeli. Bilgisayarınızdaki işlemcinizin 64 bit ve SLAT (Second Level Address Translation) desteği olmalı. En az 4 GB RAM'e sahip olmalı. BIOS ayarlarında “Hardware Assisted Virtualization” ve “Data Execution Protection” seçenekleri etkinleştirilmiş olmalı. “Windows Subsystem for Linux” uygulaması kurulum öncesinde hazır olmalı. WSL2 kurulumu ve yapılandırılması Windows’a herhangi bir Linux dağıtımını yüklemeden önce, ilk olarak “Windows Subsystem for Linux” özelliğini etkin olmalı. Bu işlem için önce PowerShell’i yönetici olarak açın ve aşağıdaki komutu çalıştırın. dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart Kurulum işlemi tamamlandıktan sonra “Virtual Machine Platform” kurulumu için Powerhell’de aşağıdaki komut çalıştırılır. Kurulum işlemi başarılı olarak tamamlandıktan sonra işletim sistemini yeniden başlatın. dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart WSL2 Linux Kernel güncellemesi için “wsl_update_x64.msi” paketi kurulur. Bu paketi indirmek için adres: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi WSL 2’yi varsayılan sürüm olarak ayarlayın bu işlem için: PowerShell’i yönetici olarak açın ve yeni bir Linux dağıtımı yüklerken WSL 2’yi varsayılan sürüm olarak ayarlanması için “wsl –set-default-version 2” komutunu çalıştırın. Docker kurmak için docker sitesindeki https://www.docker.com/get-docker adresinden docker windows kurulumu indirmek gerekiyor. Başlangıçta, Docker Desktop yükleyicisi bazı paketleri indirmeye başlıyor. “Configuration” sayfasında WSL 2 Özelliklerini etkinleştirilmesi ve masaüstüne kısa yol eklenmesi için ilgili seçenekler seçilir ve kurulum işlemini başlatmak için “OK” butonu seçilir. Kurulum işlemi tamamlandıktan sonra işletim sisteminizi yeniden başlatmak için “Close and log out” butonuna basın. Kurulum bittikten sonra bizden mevcut oturumumuzu kapatmamızı istiyor. Oturumumuzu kapatıp Windowsta yeniden oturum açıyoruz. Eğer Windows makinanızda Hyper-V özelliği kurulu değilse. Docker sizin yerinize kurulumu yapmak için aşağıdaki ekranı açıyor. “Ok” seçeneğini seçtikten sonra Docker Hyper-V kurulumuna başlıyor. Hyper-V kurulumu için Windows yeniden başlatılacak. Eğer donanımsal olarak sanallaştırma makinanızda açık değilse sanallaştırma hatası alacaksınız. Bu hatayı düzeltmek için BIOS ayarlarınızdan “Hardware Assisted Virtualization” ve Data Execution Protection” özelliklerini açmanız gerekir. Makinayı yeniden başlatıp bu ayarları yapabilirsiniz. Eğer bu özellikler zaten açık ise hatasız kurulum tamamlanacak. İşletim sistemi açıldıktan sonra Docker servislerinin açılması için kısa bir süre bekleyin. Docker çalıştıktan sonra karşımıza docker hub “Login” ekranı gelir. Burda sizden Docker ID’ niz ile oturum açmanız istenir. Eğer bir ID’niz yoksa cloud.docker.com adresinden oluşturabilirsiniz. Bu ID sizin Docker Hub’ a erişmenizi sağlar. Docker Hub’dan Repository, container imajlarınıza erişebilirsiniz. Eğer bu işlemleri yapmayacaksanız hesaba giriş yapmanıza gerek yok. Docker kurulumu test etmek için bir komut satırı veya Powershell ekranı açıyoruz. “Docker version” komutunu çalıştırdığımızda bize Docker kurulumumuz ile ilgili bilgileri gösteriyor. Docker hub üzerinden hello-world image çekip bir container üzerinde çalıştığını test edebilirsiniz. --docker versiyonuna bakılıyor docker --version --hello-world imajı docker hub üzerinden indiriliyor docker run hello-world --local ortama indirilen docker imajlar listeleniyor docker image ls --hello-world containerı listeleniyor docker container ls --all https://docker-docs.netlify.app/docker-for-windows/




spacer

 Kubernetes Trafik Yönetimi

Kubernetes’te Pod üzerine trafik yönetmenin amaçları:

-Podları tüm cluster üzerinden erişilebilir hale getirme (expose)

-Service üzerinden Podları erişilebilir hale getirme

Kubernetes DNS özelliği ile servicelere DNS atanabilir.

 

Bir poddan veya dış dünyadan poda erişmek için Pod IP adresi kullanılır. Ancak bu çok etkili olmaz. Etkili bir kullanım için service nesnesine ihtiyaç vardır. Kubernetes nimetlerinden faydalanmak için servisin arkasına bağlanan (bind edilen) birden çok ölçeklenebilir pod sayesinde front-end veya back-end üzerinden gelen istekler bir service üzerinden dağıtılabilir ve ölçeklenebilir.

Kube-dns üzerinden servislere otomatik olarak dns ataması yapılır.




Nodeport Nedir?

Dış dünyadan gelen trafiği clustera dahil etmenin en temel yoludur.

Node üzerinde bir port erişim için açılır. Default olarak 30000-32767 aralığında port numaraları kullanılır.

Cluster dışından NodeIp:NodePort şeklinde erişilir.

Porta gelen istekler ilişkilendirilen Service’e yönlendirilir.





ClusterIP Nedir?

Service için cluster genelinde geçerli br IP verme yöntemidir.

Default olarak dış dünyaya erişime açılmaz. Ancak proxy (kube-proxy) ile dışarıdan erişilebilir.


 

 


Load Balancer Nedir?

Kubernetes’te serviceleri dışarıy açmak için başka bir yöntemdir.

Servicelerin yük dağılımı NodePort üzerinden Service yönlendirme ile sağlanır.

LoadBalancer bir service tipidir. Loadbalancer servisi de bir IP’ye sahiptir.

 



 

Ingress Nedir?

Asd Ingress bir service değil bir object’tir.

Serviceler arası yük dağıtan bir router gibi çalışır.

Çalışabilmesi için cluster üzerinde bir Ingress Controller bulunması gerekir.

Ingress bir yönlendirme objesi olduğu için bir IP’sinin olmasına gerek yok.


 






spacer

Kubernetes'e Giriş ve Kubernetes'in Çalışma Prensipleri

Kubernetes'e Giriş

Virtualization 1.0 hipervizor ile sanal makineler ortaya çıkmıştır.

Container teknolojisi 2.0 olarak biliniyor. Container teknolojisi hipervizor teknolojisinden daha verimlidir. Çünkü işletim sistemi yerine çok daha küçük olan container üzerinde çalışır. Minimum olması gereken processler den oluşur.

Docker condainer dünyasının VMWare’i oluyor.

Docker imajları Container olarak çalışıyor.

Docker kerneldan bağımsız olarak uygulamalar çalıştırıyor. Küçük yazılımlar container halinde host docker engine üzerinde deploy edip kompakt ve ölçeklenebiliyor.

 


 

Container kalabalıklığını yönetebilmek için orkestrasyon araçları ortaya çıkmıştır. En popüler olan kubernetes dir. Çoklu instance yapılarak bunların yönetilmesini sağlar. Bu teknoloji Google tarafından ortaya çıkan open source bir teknolojidir.

 

Kubernetes’de Master (Kontrol paneli) ve Node (Worker) var. İdealde 1 master 1 den fazla node kullanılır.

  1. Önce uygulama geliştirilip container haline dönüştürülür.
  2. Daha sonra YAML veya JSON manifest dosyası (Deployment) objesi oluşturulur.
  3. Oluşturulan deployment dosyası k8s api-server’a gönderilir ve böylece uygulama ayağa kalkmış olur.

 

Master Komponentleri:

kube-api-server: k8s’in beynidir.

cluster store (etcd): k8s’in hafızası (key-value)’dır.

kube-controller-manager: Kontrolördür. Kontroler işlerini yapar.

kube-scheduler: Organizasyon (operasyon işleri) yapar.

 

Node Komponentleri:

kubelet: Kubernetes master üzerinden node’a erişilmesini sağlayan agent dır.

container-engine: Konteyner yöneticisi (docker)’dir.

kube-proxy: Load balancing ve diğer network işlerini yapar.

 

 

Pod Nedir?

Docker için container ne ise kubernetes için de pod aynı şeydir. Podların içinde container çalışır.

Pod ölçekleme birimidir. (instance sayısı)

1 Pod 1 Node üzerinde çalışır. 1 den fazla Node üzerinde çalışamaz.

 

Deployment Nedir?

Bir yaml veya json olarak tanımlanabilir.

Rest objeleridir.

Versiyonlanabilir.

2 angular 3 mysql ayağa kaldır şu versiyonda olsun gibi.

Bir kere hazırlanıp birden fazla ortama deploy edilebilir.

Master üzerindeki api-server üzerinden oluşturulur.

 

Service Nedir?

Kubernetesin kendi bir networkü var.

Podların kendilerine has IP adresleri olabilir. Sabit IP ve DNS özelliği ..

Örneğin 4 nodelu database instance var ve front end bunlara erişmek istiyorsa bu servis load balancing yaparak bunlardan birine yönlendirebilir. Sadece sağlıklı podlara yönlendirme yapılır. Default TCP protokolü üzerinde çalışır.

 

 

Master’a Genel Bakış

Fiziksel, VM veya Cloud gibi herhangi bir host üzerinde çalışabilir.

Cluster’a göz kulak olur. (Nelerin çalışması gerekiyor vs)

Workload (yük) ayarlamaları, yaşam döngüsü, ölçekleme ve upgrade işlemlerinden sorumludur.

4 komponentten oluşur.

Kube-api-server:

En çok kullanacağımız komponenttir. Kuebernetes için beyin görevi görür. Api (Rest) üzerinden fonksiyonları expose eder yani dış dünyaya açar. Json veya yaml dosyaları vasıtasıyla kullanılır. 443 https üzerinden çalışır.

$kubectl komut satırı (tool) ile komutlar gönderilir.

 

Cluster store (etcd):

Kubernetes’in hafızasızıdr. Açık kaynak teknolojisidir. Key-value veri çiflerini saklar.

Kalıcı saklama alanıdır. Cluster’a ait state ve config bilgilerini barındırır.

Master üzerindeki tek statefull kısımdır.

 

Kube controller manager:

Kontrolör görevi görür. Koordinasyonu sağlar.

Hemen hemen her fonksiyon/işlem için bir kontroller olabilir. (endpoints, namespace, replication vb)

Arzulanan hal (desired state) denilen pozisyonu kontrol eder. Örneğin: 3 tane mysql db olsun dersek bu stateden biri giderse hemen 3. makinenin oluşturulmasını sağlar.

 

Kube scheduler:

Operasyonel işleri yürüten organizatördür.

Api-server’dan gelen yeni pod yaratma görevleri için hazırda bekler.

Örneğin Pod yaratılacak bunun gidip hangi node üzerinde yaratılmasını vs yapar.

Nodelara workload yük atamasından sorumludur.

 

 

Node’a Genel Bakış

Master yönetim amaçlı çalışırken Node Cluster’ın çalışan (work) gücüdür.

Fiziksel, sanal veya cloud makine olabilir.

Master tarafından nodeların yönetilmesi ve nodeların kendi üzerindeki podları yönetebilmek için bazı servisleri barındırırlar.

Nodeun en önemli şeyi container runtimedır.

3 komponentten oluşur.

 

kubelet: Node agent için kullanılır.

Node üzerinde çalışan kubernetes ajan programıdır.

Node’u cluster’a register etmeye yarar.

Master ile sürekli iletişim halindedir. Api-server’dan gelen direktifleri bekler ve yerine getirir.

Pod oluşturmak için kullanılır.

Node üzerinde pod çalışabilmesi için sağlıklı (healthy) durumda olmalıdır.

 

container-engine: Konteynerları yönetmek için kullanılır.

Pluggable (kaldırılıp, değiştirilebilir) yapıdadır.

Genelde docker container kullanılır.

Containerları start-stop etmek için kullanılır.

 

kube-proxy: Load balancer gibi network işleri için kullanılır.

Node üzerindeki her bir pod bir IP adresine sahiptir.

Node içinde overlay network mimarisi var.

Load balance üzerinden gelen yük dengelemeyi podlar üzerinde yapar.

Örneğin 3 front-end angular ve 4 back-end database olsun. Ön yüz ile arka araftaki db arasında yük dengeleme network yönetimi gibi işler için bir servis tanımlanması gerekir.

 

Master - Node Arasındaki İletişim

Master ve Node arasındaki iletişim api-server ve kubelet işbirliği ile sağlanır.

Api-server masterdaki beyin görevini görüyordu. Kubelet node üzerinde api-serverdan gelen işleri yerine getirir.

Api-server podlardaki loglara erişmek, port yönlendirmek ve podlara erişmek için kubelet’i kullanır.

Api-server ile node, pod ve servisler arasındaki iletişim secure (https) değildir.

 


Kubernetes’in Çalışma Prensipleri

Kubernetes’in Faydaları:

Örneğin önyüzde 3 angular arkada 4 database’in sürekli ayakta kalması isteniyor. Sistem yöneticisinin bunu sürekli manuel veya başka bazı toollar ile kontrol etmesini sağlaması yerine tüm bu görevleri yürütmek için kubernetes görevi devralır. Örneğin bir db çöktü otomatik olarak node üzerinde yeniden db oluşturulmasını ayağa kalkmasını ve arzu edilen 4 database nodeunun sürekli ayakta olmasını sağlar.

 

Bir Deployment Nasıl Yapılır?




Öncelikle bir deployment için kubectl komutu kullanılır. Bu komut aracılığıyla kubernetes’in beyni olan api-server ile konuşulur.

$kubectl create –f deployment.yaml

Deployment.yaml veya json ile api-server’a deployment talebi iletilir. Deployment kontroller (kontroller manager üzerinde) devreye girer. Yaml dosyasında kaç tane replica belirtilmişse bu replica set’e göre replication kontroller çalıştırılır. Replication control tarafından podların kaç tane olması gerektiği bilgileri cluster-store (etcd) üzerinde saklanır. Daha sonra kube-scheduler devreye girer. Buraya kadar olan tüm işlemler master üzerinden yapılır.

Daha sonra kube-scheduler ile node üzerindeki agent olan kubelet ile iletişime geçilir. Kubelet container-engine devreye alır ve container engine üzerinden kaç tane container gerekiyorsa bu containerler ayağa kaldırılır. Son olarak kube-proxy devreye girer ve endpointler IP table’a kaydedilir.

Ayağa kalkan her bir pod/container için bir ip adresi atanır. 3 angular 4 db için bu IPlerin bilgileri vs kube-proxy tarafından yönetilir.

spacer