OpenShift – Bölüm 1

Merhaba;

Bugün sizlerle OpenShift çözümünü kullanarak kod geliştirme süreçlerinin ne kadar kolaylaştığını  göreceğiz.  Şekil 1’e bakarsanız, bulut ortamından aldığımız üç temel hizmet kısmında, OpenShift’in PaaS hizmetine karşılık geldiğini göreceksiniz. Biliyoruz ki bulut ortamını “public” olarak yapılandırabileceğimiz gibi kendi veri merkezimizde tüm sistemler, yazılımlar bize ait olacak şekilde “private” olarakta yapılandırabiliriz. OpenShift’i “private” bulut ortamı olarak kendi veri merkezinizde kullanıcılarınıza PaaS hizmeti sağlayacak şekilde yapılandırabilirsiniz.

Şekil 1. OpenShift ile PaaS hizmeti sağlayabilirsiniz.

OpenShift yapısı aslında iki önemli teknolojiyi içinde barındırmaktadır: Docker ve Kubernetes. Bu nedenle daha önce yazdığım docker yazılarımı okumanız, OpenShift’i çok daha iyi anlamanızı ve sonucu olarakta işlerinizi kolaylaştıracak şekilde OpenShift’i daha verimli kullanmanıza imkan sağlayacaktır. Bu nedenle bu yazıların linklerini ben aşağıda tekrar paylaşıyorum.

https://www.linkedin.com/pulse/docker-b%C3%B6l%C3%BCm-7-asiye-yigit/

https://asiyeyigit.com/docker-bolum-6/

https://asiyeyigit.com/docker-bolum-5/

https://asiyeyigit.com/docker-bolum-4/

https://asiyeyigit.com/docker-bolum-3/

https://www.linkedin.com/pulse/docker-b%C3%B6l%C3%BCm-2-asiye-yigit/

https://www.linkedin.com/pulse/docker-asiye-yigit/

 

Şekil 2. OpenShift’in kullandığı teknolojler: Kubernetes ve Docker.

Docker makalelerimden ötürü, bu yazımda docker detayına girmeyeceğim. Kubernetes’den  bahsetmek istiyorum. Kubernetes bir orkestrasyon yazılımıdır. Birden fazla konteyner’i çalıştırmak  ve yönetmek için bir orkestrasyon yazılımına ihtiyaç vardır. Birden fazla konteyner varsa, yükün dengelenmesini, mount point’leri gibi konuları yönetmemiz gerekir. Kubernetes, Google tarafında oluşturulan bir açık kaynak kodlu yazılımdır. Openshift, bu iki yapının üzerine oturtulmuş bir katmandır. Bu iki teknolojiyi en verimli ve etkin şekilde kullanılmasını sağlayarak developer’ların süreçlerini doğru şekilde yönetmesine, uygulamalarını oluşturmalarına imkan sağlar. Openshift, web tabanlı bir arabirime ve komut satırından yönetim aracına (oc) sahiptir.

OpenShift yapısını iyi anlamamız için bileşenlerinin ne amaç ile kullanıldığını bilmemiz önemlidir. Bu bileşenleri anlaşılır şekilde ifade etmeye çalışacağım. Önce Şekil 3. de  resmedilen, “docker image”, “storage”, “container”, “pod”, “Service” ve “Route” bileşenlerinden bahsedeceğim.

Şekil 3. OpenShift’in bileşenleri.

Detaylı olarak önceki makalelerimde de okuyacağınız gibi, konteyner (“containers”), taşınabilir Linux ortamı içerisinde bir veya birden fazla prosesin ne şekilde çalışacağını tanımlayan bir teknolojidir. Konteynerlar, bir imaj ile başlatılır ve genellikle aynı sistem üzerinde birbirinden izole çalışırlar.

Imaj (“image”) dediğimiz bileşen, katmanlardan oluşan bir Linux dosya sistemidir. Uygulama kodunu, bağımlılıkları ve İşletim sistemi kütüphanelerini içinde barındırır. Imaj, lokalde olabileceği gibi uzak bir “Docker Registry” de olabilir.

Pod dediğimiz yapı, bir node üzerinden birlikte yapılandırılan konteynerlardan oluşur. Aynı pod içerisinde bulunan konteynerlar, aynı IP’yi ve volümleri kullanır. Podlar aynı zamanda güvenlik ve çalışma zamanı kurallarını da tanımlar.

Servis (“services”), diğer podlar tarafından ulaşılan bir dizi podun ismini ifade eder. Servis, IP ve DNS ismi alır. “Cluster” yapısı dışından bir port veya tanımlana bir adres (“route”) aracılığıyla dışarı sunulurlar.

Yol (“route”) dediğimiz bileşen, dış DNS kaydıdır. “Cluster”ın dışından ulaşılabilir servisleri adreslemesi için oluşturulurlar. Sistem yöneticisi, bu yolları tanımlayabilmek için bir veya birden fazla “router” kofigüre edebilir. Genellikle bu konfigürasyonlar Apache veya HAProxy yük dengeleyiciler/proxy ler aracılığıyla yapılır.

Kalan bileşenler için Şekil 4’ü kullanacağım.

Şekil 4. OpenShift bileşenleri.

Şekil 4 üzerinde, yine pod ile başlarsak, pod, node üzerinde yapılandırılır. Pod’lar kaynakları paylaşırlar. Örneğin şekilde görülen “persistent volume” gibi kaynakları paylaşırlar. Pod’lar  servisler aracılığıyla kullanılabilir olur. Pod’lar dış dünyaya (cluster’ın dışına) yol tanımlanarak  (“routes”) açılırlar. Podların yönetimi “replication controller” ile yapılır. Belli sayıdaki podun her an çalıştığının garantisini “replication controller”  sağlar. Pod sonlanırsa veya bir şekilde silinirse, “replication controller”, istenen sayıda podun çalışmasını sağlayacak şekilde görev alır. “Build configuration”, deploy edilecek yeni imajın nasıl inşa edileceğini  (“build”) tanımlayan konfigürasyon bilgisini tutar. Imaj, S2I (“Source to Image”) sayesinde kaynak kodu ve taban imajdan (“base image”) oluşturulabilir.   S2I, Java, Ruby, Python, PHP gibi diller için imajlar (“builder images”) sağlar. Imaj, “dockerfile” dan üretilen docker tabanlı bir imajda olabilir. Şekilde görülen “build configuration”, Webhook aracılığıyla, taban imaja veya kaynak koduna bağlıdır. Kaynak kodunda veya taban imajda bir değişiklik olursa otomatik olarak güncellenir. Developer bu sayede, kodu günceller, “source code repository” e gönderir (“push”). Sonrasında, webhook, “build configuration” i tetikler ve güncel kalınmasını sağlar. Örneğin bir uyuglama sunucusu ve git “repository” kullandığımızı düşünelim. S2I, taban uygulama sunucusu imajını indirir. Kodun olduğu “repository” nin klonu alınır. Build işlemi yapılır. Yeni konteyner imajı oluşturulur. Bu build işlemi deploy edilir ve ortaya çıkan konteyner çalıştırılır. Build işleminin oluşturduğu imaj, “Integrated Docker Registry” de tutulur ve node’lar üzerinde uygulama deployment’i için kullanılır. Openshift, imajları, “image stream” sayesinde takip eder. “Deployment configuration”, pod için şablonları tanımlar. Yeni imajların deployment’ını veya konfigürasyon değişimlerini yönetir. “Deployment configuration”, mikro servis olarak düşünülebilir. “Replication manager”, daha önce de belirttiğimiz gibi podları yönetir ve onların çalışır şekilde kalmasını sağlar.

 

Bu kadar teori yeter şimdilik. Şimdi biraz sistem başına geçelim ve bir şeyler yapmaya başlayalım. Openshift’i local sistemimize tek node’lu bir cluster yapısı şeklinde kurmamıza olanak sağlayan minishift yazılımını kendi laptop’ıma kurup, ne şekilde Openshift’i yapılandırdığımız anlatacağım.

https://www.openshift.org/minishift/ web adresini kullanabiliriz. Minishift, Windows, macOS ve Linux üzerinde çalışır. Minishift, sanal sistemleri provizyonlamak için “libmachine” kullanır. Cluster yapısını çalıştırmak için de “OpenShift Origin” kullanır.

Laptop’a kuruluma geçmeden önce, Bios’dan VT-X/AMD-v sanallaştırma eklentilerini kullanılabilir hale getirmeniz gerekir. Sanallştırma için kendi sistemimde Oracle VirtualBox kullandım. Yukardaki web adresinden “minishift-1.16.1-windows-amd64.zip” dosyasını indirmeniz gerekiyor. Zip dosyasını açma işlemini yaptıktan sonra, “minishift config set vm-driver virtualbox” komutunu kullanmalısınız ki, VM oluşturmak için laptop’ınızda kurduğunuz Oracle VirtualBox’I kullansın.

C:\MINISHIFT\minishift-1.16.1-windows-amd64\minishift-1.16.1-windows-amd64> minishift config set vm-driver virtualbox

Ardından, “minishift start” demeniz gerekiyor. Komut sonrası aşağıda gelen mesajları takip ederseniz, bize minishift’in başarıyla başladığını, cluster IP’sini ve hangi kullanıcılarla login olacağımız bilgisini veriyor.

C:\MINISHIFT\minishift-1.16.1-windows-amd64\minishift-1.16.1-windows-amd64>minishift start

— Starting profile ‘minishift’

— Checking if https://github.com is reachable (using proxy: “No”) … OK

— Checking if requested OpenShift version ‘v3.9.0’ is valid … OK

— Checking if requested OpenShift version ‘v3.9.0’ is supported … OK

— Checking if requested hypervisor ‘virtualbox’ is supported on this platform … OK

— Checking if VirtualBox is installed … OK

— Checking the ISO URL … OK

— Checking if provided oc flags are supported … OK

— Starting local OpenShift cluster using ‘virtualbox’ hypervisor …

— Starting Minishift VM ………………… OK

Using 192.168.99.100 as the server IP

Starting OpenShift using openshift/origin:v3.9.0 …

OpenShift server started.

The server is accessible via web console at:

https://192.168.99.100:8443

You are logged in as:

User:     developer

Password: <any value>

 

To login as administrator:

oc login -u system:admin

C:\MINISHIFT\minishift-1.16.1-windows-amd64\minishift-1.16.1-windows-amd64>

https://192.168.99.100:8443 ile developer kullanıcısı ve developer şifresi ile GUI’ye girebildik. Şekil 5 ve Şekil 6  GUI ekranlarını göstermektedir.

Şekil 5. OpenShift Origin GUI ekranı.

Şekil 6. OpenShift Origin GUI ortamı.

Developer kullanıcısı ile sistem girdiğinizde, Şekil 6’da görüldüğü gibi default My Project isimli proje gelmektedir. Projeler, kaynakları oluşturacağınız yapıyı size sağlar.

OpenShift’in komut satırından da bahsetmiştim.  Lpatop üzerine “C:\Users\asiye.yigit\.minishift\cache\oc\v3.9.0\windows>”  içerisinden bu araca erişim sağlarsınız.

C:\Users\asiye.yigit\.minishift\cache\oc\v3.9.0\windows>oc login -u developer

Logged into “https://192.168.99.100:8443” as “developer” using existing credentials.

You have one project on this server: “myproject”

Using project “myproject”.

C:\Users\asiye.yigit\.minishift\cache\oc\v3.9.0\windows>

 

GUI üzerinden çalışmaya devam edelim. Developer olarak giriş yaptıktan sonra, bir proje oluşturalım (Şekil 7).

Şekil 7. Proje oluşturma adımları.

Bu Ekrandan en sağ tarafta “Create Project” tıklayalım.

Şekil 8. Proje oluşturma adımları.

Şekil 9.’da gördüğünüz gibi proje oluştu.

Şekil 9. Proje oluşturma adımları.

Projeye katalogda gördüklerimizi ekleyebiliriz (Şekil 10).

Şekil 10. Proje oluşturma adımları.

Kategoriler üzerinden de tek tek seçim yapabilirsiniz. Mesela aşağıda ben “Languages” kısmını seçtim (Şekil 11).

Şekil 11. Proje oluşturma adımları.

projecta’ya ben java ekleyeceğim (Şekil 12).

Şekil 12. Proje oluşturma adımları.

Şekil 13. Proje oluşturma adımları.

Şekil 14. Proje oluşturma adımları.

 

Şekil 15. Proje oluşturma adımları.

Şekil 13, 14 ve 15 adımlarından sonra projectajava, projecta içinde oluşturulmuş oldu. Şekil 14’de lütfen örnek “repository” i şimdilik kullandığıma dikkat edin. Şekil 16’da uygulamanın “build” olduğunu görüyoruz. Şekil 17’de artık istenen imajın, konteyner yapıda pod olarak deploy edildiğini görüyoruz.

Şekil 16. Proje oluşturma adımları.

Şekil 17. Proje oluşturma adımları.

En sağ köşede, bu uygulama için bağlantı linkini görüyoruz (yukarda yol, route olarak ne olduğunu söylemiştim). Bu otomatik olarak oluşturuldu. Tıkladığımız zaman aşağıdaki ekranı görüyoruz. İlk uygulamamızı oluşturduk (Şekil 18).

Şekil 18. İlk java uygulaması oluştu.

Konu üzerinde daha ileriye gitmeden kendimize bir github hesabı ve “repository” oluşturalım (Şekil 20).

Şekil 19’da GitHub’ın çalışma akışını görüyoruz.

Şekil 19. GitHub çalışma akışı.

Şekil 20. GitHub hesabı.

 

https://git-scm.com/download/win den git’i download ediyoruz. Windows sisteme kurduktan sonra git shell’i alıyoruz.

Şekil 21. Git süreci.

Komutuyla profile dosyamı isim ve e-mail adres doğru olacak şekilde güncelledik. Repository’mizi klonluyoruz.  Mesajda boş demesi normal. Çünkü henüz bir dosyamız yok içinde. Şekil 21’dan Şekil 26’ya kadar git’I kullanılabilir hale getirme adımlarını görüyoruz.

Şekil 22. Git süreci.

Şekil 23. Git süreci.

Şekil 24. Git süreci.

Şekil 25. Git süreci.

Şekil 26. Git süreci.

Hatırlarsanız komut satırından developer ile login olduğumuzda tek proje görmüştük. Sonra Web Console’dan ikinci bir proje oluşturduk. Tekrar komut satırından developer olarak login olursak ikinci projeyi de görüyor olacağız.

Şekil 27. Oc’den developer kullanıcısı ile login oluyoruz.

Şimdi komut satırından bir proje oluşturmaya çalışalım.

Şekil 28. oc’den project oluşturduk.

Projeyi oluşturduktan sonra logout olup tekrar login olursak oluşturduğumuz üçüncü projeyi de görebiliriz.

Şekil 29. Oc’den projectb’yi görüyoruz.

Şekil 30. Proje detayları.

Şekil 30’da “oc config view” ile proje detaylarını görebilyoruz.

Projeler arasında gidip gelebiliyoruz.

Şekil 31. Projeler arası geçiş. .

Projeyle ilgili statüsü görüntüleyebiliriz.

Şekil 32. Projenin statüsünün görüntülenmesi.

Biraz daha detaylı örnekler yapmadan önce, deployment sürecinin genel adımlarına bakalım (Şekil 33).

Şekil 33. Deployment adımları.

https://github.com/drizzleconsulting/spring-mvc-showcase den kaynak kodu alacağız (Şekil 34).

Şekil 34. Spring-mvc-showcase

https://github.com/drizzleconsulting/spring-mvc-showcase.git kullanarak yeni bir proje oluşturalım (Şekil 35 ve Şekil 36).

Şekil 35. Sapmleapplication projesi oluşturma adımı.

Şekil 36. Sapmleapplication projesi oluşturma adımı.

Build loglarına bakabiliriz (Şekil 37).

Şekil 37. Build logları.

Openshift, kodu, maven ile derlemesi gerektiğini anladı ve süreci başlattı. Build işleminin başarıyla tamamlandığını görüyoruz (Şekil 38).

Şekil 38. Build işlemi başarıyla tamamlandı.

GUI’de Overview ekranından bakarsak, podun oluştuğunu görüyoruz (Şekil 39).

Şekil 39. Sampleapplication pod.

Uygulama için oluşturulan yolu  (route) tıklarsak aşağıdaki ekran karşımıza çıkacak (Şekil 40).

Şekil 40. Uygulama servisi.

Web adresine spring-mvc-showcase eklersek, uygulamanın çalıştığını aşağıdaki ekrandan görebiliriz (Şekil 41).

Şekil 41. Uygulama.

Bu örnekte, openshift, uygulama dosyalarını repository’den aldı. Uygulamayı derlemek için maven’i kullandı. Uygulama sunucuya deploy etti ve uygulamanın kullanılabilir olmasını sağladı.

 

Bu yazımı burda tamamlıyorum. İkinci bölümde, kaynak kod üzerinde bir değişiklik yaptığımızda openshift’e nasıl yansıdığına bakacağız. Uygulamada hiçbir kesinti olmadan güncelleme işleminin yapıldığını göreceğiz. MySQL kullanan WordPress ile kendi blogumuzu kısa zamanda oluşturacağız. Kaynaka ölçeklendirmesi üzerine biraz konuşacağız.

 

Asiye Yigit 30 Nisan 2018

Kaynaklar:

Sayın hocam, Mohamad Charaf

Cloud Solutions Architect – Amazon AWS Certified

Çok teşekkür ederim. Udemy’den verdiği eğitime ulaşabilirsiniz.