Openshift S2I (Source-to-Image)

Ebru Dalkır
4 min readAug 29, 2021

--

You can find the English version of the article here

Build alma, hepimizin bildiği gibi girdi parametrelerini sonuçtaki bir nesneye dönüştürme işlemidir. Çoğu zaman süreç, girdi parametrelerini veya kaynak kodunu çalıştırılabilir bir görüntüye dönüştürmek için kullanılır. Bir BuildConfig nesnesi, tüm derleme sürecinin tanımıdır. OpenShift, derleme görüntülerinden(image) Docker containerları oluşturarak ve bunları bir Docker registrisine pushlayarak Kubernetes’ten yararlanır. OpenShift derleme sistemi, derleme API’sinde belirtilen seçilebilir türlere dayalı derleme stratejileri için genişletilebilir destek sağlar. Mevcut üç yapı stratejisi vardır:

  • Docker build
  • Source-to-Image (S2I) build
  • Custom build

Bugün sizlere bir uygulamanın source kodunu docker görüntüsüne enjekte etme sürecinde kullandığım Source-to-Image (S2I) build kullanımından bahsedeceğim. Genelde deployment süreçlerinde öncelikle uygulamanın source kodu build alınır ve ardından oluşan image, kullandığınız konteynerizasyon aracına göre deploy edilmektedir. Fakat karşıma gelen bir case de bu yöntem ihtiyacımı karşılamadı ve farklı bir çözüm bulma arayışına girdim. İnternette bir süre araştırma yaptıktan sonra Openshift’ın (S2I) çözümü ile karşılaştım. Peki (S2I) nedir dediğinizi duyar gibiyim :) Gelin hep beraber bu yapının kullanım aşamalarını inceleyelim.

S2I, girdi olarak uygulama kaynak kodunu alan ve birleştirilmiş uygulamayı çıktı olarak çalıştıran yeni bir görüntü üreten görüntüleri yazmayı kolaylaştıran bir çerçevedir. OpenShift Konteyner Platformu, bir uygulamanın kaynak kodunun bir oluşturucu görüntüsünün (JBoss EAP gibi bir teknoloji görüntüsü) üzerine eklenebileceği uygulamalar oluşturmak ve çalıştırmak için bir S2I (Kaynaktan Görüntüye) süreci sağlar. S2I işlemi önce uygulamanızı oluşturur ve ardından bir uygulama görüntüsü oluşturmak için onu oluşturucu görüntüsünün üzerine katmanlar. Derleme tamamlandıktan sonra, uygulama görüntüsü OpenShift içindeki tümleşik kayıt defterine (Integrated registry) veya bağımsız bir kayıt defterine (standalone registry) gönderilir.

Bu yapıyı örnek olarak java uygulamasında üzerinde anlatacağım. Diğer diller için Openshift’in kendi dökümantasyonundan inceleyebilirsiniz.

OpenShift için Red Hat Java S2I, OpenShift ile kullanılmak üzere tasarlanmış bir Kaynaktan Görüntüye (S2I) oluşturucu görüntüsüdür. Kullanıcıların OpenShift’te kapsayıcılı bir görüntü içinde düz Java uygulamaları oluşturmasına ve çalıştırmasına olanak tanır.

1- İlk olarak terminal ekranınıza gelerek, aşağıdaki komutu çalıştırarak ve kimlik bilgilerini sağlayarak OpenShift konsolunuzda oturum açın.

$ oc login

2- Yeni bir proje oluşturalım.

$ oc new-project <project-name>

3- Yeni bir build konfigurasyonu oluşturmak için image stream’ini ve uygulama adını belirterek yeni binary build (ikili yapı) oluşturun.

$ oc new-build --binary=true  --name="jdk-app-name" --image-stream=redhat-openjdk18-openshift:1.8

Output: Aşağıdaki gibi olmalıdır.

--> Found image de256a7 (5 months old) in image stream "openshift/redhat-openjdk18-openshift" under tag "1.8" for "redhat-openjdk18-openshift:1.8"                                                                                                                                                                                                                          Java Applications                                                                                                       -----------------                                                                                                       Platform for building and running plain Java applications (fat-jar and flat classpath)                                                                                                                                                          Tags: builder, java                                                                                                                                                                                                                             * A source build using binary input will be created                                                                       * The resulting image will be pushed to image stream tag "jdk-app-name:latest"                                          
* A binary build was created, use 'start-build --from-dir' to trigger a new build --> Creating resources with label build=jdk-app-name ... imagestream.image.openshift.io "jdk-app-name" created buildconfig.build.openshift.io "jdk-app-name" created --> Success

OCP arayüzünden Builds>Image Streams kısmından oluşan image streami görebilirsiniz.

4- Oluşturulan yeni build konfigurasyonunu ile build işlemini yapıyoruz. Binary buildi (ikili yapıyı) başlatın, oc yürütülebilir dosyasına, OpenShift yapısı için kullanacağı jar dosyasını tanımlıyoruz. Jar dosyasının bulunduğu dizinde bu komutu çalıştırmalısınız ya da jar dosyasının uzun pathini vermelisiniz.

$ oc start-build jdk-app-name --from-file=<jar-name>.jar

Not: Burada build almak istediğiniz uygulamanın isteklerine göre argumanlarını parametrik olarak komuta ekleyebilirsiniz.

Output: Aşağıdaki gibi olmalıdır.

Uploading file "<jar-name>.jar" as binary input for the build ...                                           ................................................................                                                        Uploading finished                                                                                                      build.build.openshift.io/jdk-app-name-1 started

5-Bu adım ile birlikte build adımına dayalı olarak yeni bir OpenShift uygulaması oluşturuyoruz. Arguman olarak komuta eklemeler yapabilirsiniz. Ben burada time-zone ve allow-missing-imagestream-tags (true değeri ile mevcut olmayan image akışı taglerinin hala kullanılması gerektiğini belirten) argumanlarını komutuma ekledim. Daha fazla komut değişkenlerini incelemek için terminalinizde “oc - -help” komutunu çalıştırabilirsiniz.

$ oc new-app jdk-app-name:latest --name=jdk-app-name --allow-missing-imagestream-tags=true -e TZ=Europe/Istanbul

Output: Aşağıdaki gibi olmalıdır.

--> Found image 655129d (3 minutes old) in image stream "*******-*****/jdk-app-name" under tag "latest" for "jdk-app-name:latest"                                                                                                                                                                                                                                          Java Applications                                                                                    -----------------                                                                                                       Platform for building and running plain Java applications (fat-jar and flat classpath)                                                                                                                                                          Tags: builder, java                                                                                                                                                                                                                             * This image will be deployed in deployment config "jdk-app-name"                                                       * Ports 8080/tcp, 8443/tcp, 8778/tcp will be load balanced by service "jdk-app-name"                                      
* Other containers can access this service through the hostname "jdk-app-name"
--> Creating resources ... deploymentconfig.apps.openshift.io "jdk-app-name" created service "jdk-app-name" created --> Success Application is not exposed. You can expose services to the outside world by executing one or more of the commands below: 'oc expose svc/jdk-app-name' Run 'oc status' to view your app.

Bu işlemlerden sonra uygulamanızı OCP arayüzünde Workloads > Deployment Configs altında pod seçeneğine tıklayarak görebilir, loglarını inceleyebilirsiniz.

Ek olarak podun memory, cpu ve diğer network kullanım değerlerini kontrol edebilirsiniz.

Umarım faydalı bir yazı olmuştur. Şimdiden keyifli okumalar…

--

--

Ebru Dalkır
Ebru Dalkır

No responses yet