OpenShift Üzerinde Uygulama Yayınlama: Süreç ve Adımlar
Aktif bir teknoloji ortamında uygulama geliştirme, sürekli bir dönüşüm içinde. Bu süreçte, OpenShift gibi yenilikçi araçlar geliştiricilere önemli avantajlar sunuyor. OpenShift, Docker konteynerlarının yönetimini kolaylaştırıp Kubernetes’in sunduğu özelliklerle uygulama dağıtımını verimli hale getiriyor. Otomatik ölçeklendirme ve yüksek erişilebilirlik, uygulamaların esnek bir biçimde genişlemesini ve yoğun trafik anlarında bile güçlü kalmasını sağlıyor. Entegre CI/CD araçları ise geliştirme süreçlerini hızlandırırken, geliştirici ve operasyon ekipleri arasında köprü kurarak işbirliğini artırıyor. Güvenlik ve izleme özellikleri sayesinde OpenShift, uygulamalarınızın güvenliğini ve performansını artırıyor. Tüm bu avantajlar, hızlı, güvenli ve ölçeklenebilir uygulamaların geliştirilmesine katkı sağlıyor.
1.Adım Dockerize etme
Uygulamanızı Docker konteynerına taşımak, modern yazılım geliştirme süreçlerinin vazgeçilmez adımlarından biri haline geldi. Bu adım, uygulamanızı bir konteyner içinde izole ederek taşınabilir ve çevik bir hale getirir.
Docker, uygulamanızın hızlı dağıtımını, ölçeklenmesini ve yönetimini sağlayan güçlü bir araçtır. Bu adımda uygulamanızı Docker konteynerına taşımanın yollarını inceleyeceğiz.
Visual studio üzerinden Dockerfile ekleme:
Test projesi de olan bir Applications projesi için örnek bir Dockerfile içeriği:
2.Image Registry
Docker image’lar, uygulamanızın çalıştırılabilir versiyonlarını içeren paketlerdir ve genellikle Dockerfile ile oluşturulur. Oluşturulan bu image’ları, güvenli bir şekilde saklamak ve yönetmek için Harbor gibi bir container image registry platformundan faydalanıyoruz. Harbor, Docker image’larınızı merkezi bir depoda saklamanızı, yönetmenizi ve gerektiğinde paylaşmanızı sağlayarak geliştirme sürecimize katkı sağlıyor.
Harbor, özelleştirilebilir, güvenli ve yönetilebilir bir enterprise sınıfı container image registry’dir. Küçük ve büyük ölçekli organizasyonlar için kullanım kolaylığı sağlayan web tabanlı bir kullanıcı arayüzüne sahiptir. Kubernetes, Docker, OpenShift gibi platformlarla sorunsuz bir şekilde entegre olabilir.
3. Kubernates Bileşenlerini ekleme
Kubernetes, oluşturduğumuz Docker image’larını birden fazla sunucu veya cluster içindeki kaynaklarda dağıtmak, yönetmek ve kontrol etmek için kullanılan bir platformdur. Bu platform, Docker gibi konteyner teknolojilerini temel alarak, oluşturulan Docker image’larını yönetir. Podlar, deployment’lar ve service’ler gibi Kubernetes’in temel yapı taşları aracılığıyla bu image’ları çalıştırır ve yönetir. Bu sayede, uygulamalarımızı istediğimiz ortamda kolaylıkla çalıştırabilir ve Kubernetes’in sunduğu ölçeklendirme ve yönetim avantajlarından faydalanabiliriz.
Kubernates’in bazı temel kavramları:
- Pod: Kubernetes’in ölçeklendirilebilir en küçük işlem birimleridir. Genellikle bir veya birden fazla konteynerden oluşurlar ve birlikte çalışarak bir uygulamayı barındırırlar. Her pod, kendi ayrı amaçları olsa da genellikle aynı fiziksel kaynakları paylaşır ve aynı ağ içinde bulunurlar.
- Deployment: Uygulamanın belirlenen hedef durumunu sağlamak için kullanılır. Kaç pod’un çalıştırılacağı, bunların nasıl oluşturulacağı ve yönetileceği gibi faktörleri belirler. Bir replica set(çoklama kümesi) üzerine inşa edilirler ve uygulamanın sürekli çalışmasını sağlarlar.
- Service: Podlar arasında iletişimi kolaylaştırır ve dış dünya ile podlar arasındaki bağlantıyı yönetir. Statik IP adresleri ve DNS kayıtlarıyla podların erişilebilirliğini sağlar.
- Namespace: Kubernetes cluster’ında kaynakların mantıksal gruplamasını yapar. Farklı projeler, ekipler veya ortamlar için ayrı namespace’ler oluşturarak kaynakların izole edilmesini ve ayrı ayrı yönetilmesini sağlar.
- Volume: Podlar arasında veri paylaşımı ve kalıcı depolama için kullanılan yapıdır. Podların yaşam döngüsü boyunca kalıcı depolama sağlarlar.
- ConfigMap ve Secret: Uygulama yapılandırma verileri ile gizli verilerin (şifreler, token’lar gibi) depolanması ve podlara enjekte edilmesi için kullanılır.
- Label ve Selectors: Kaynaklara atanabilen etiketler ve bu etiketlere göre kaynakları seçmek için kullanılan yapıdır.
Örnek deployment yaml:
Örnek service yaml:
Bunlara ek olarak PersistentVolume ve PersistentVolumeClaim, Pod’lar için kalıcı depolama sağlarlar ve veri kaybını önlerler. Farklı depolama seçeneklerini temsil ederek esneklik sunarlar ve veri paylaşımını kolaylaştırırlar. Aynı zamanda pod’ların kalıcı veri depolama ihtiyaçlarını karşılayarak uygulamaların güvenilirliğini ve esnekliğini artırır.
PersistentVolume (PV): Kubernetes’te fiziksel depolama kaynaklarını temsil eder. PV’ler, depolama seçeneklerini tanımlar ve pod’ların bu depolama kaynaklarına erişmesini sağlar.
PersistentVolumeClaim (PVC): PVC’ler, pod’ların ihtiyaç duyduğu depolama alanını temsil eder. PV’lere yönelik talepleri ifade eder ve pod’ların istedikleri depolama alanını belirtmelerini sağlar.
4.Openshift Ortamının Hazırlanması
Openshift ortamını hazırlamak, başarılı bir konteyner tabanlı altyapı oluşturmanın en önemli adımlarındandır. Bu adım, temel altyapının kurulumunu ve yapılandırılmasını gerektirir. Openshift’i kullanarak, fiziksel veya sanal sunucular üzerinde cluster’lar oluşturulur. Ortam hazırlığı aşamasında, Openshift’in kurulumu, yapılandırılması ve gerekli entegrasyonların yapılmasıyla birlikte, uygulama geliştirme ve dağıtım süreçlerine hazır bir şekilde başlamak mümkün olur. Bu aşama, genellikle IT ekipleri veya sistem yöneticileri tarafından yürütülür ve uygun bir şekilde yapılandırıldığında, geliştirme ekipleri kendi uygulamalarını bu ortama taşıyabilirler.
Cluster ve Namespace oluşturmak
Cluster ve Namespace oluşturmak, Openshift ortamınızı düzenlemenin ilk adımıdır ve uygulamalarınızı düzenli bir şekilde izole etmenizi sağlar.
Cluster, kaynakları (CPU, bellek, depolama vb.) paylaşan ve uygulamalarınızı çalıştırmak için gerekli olan altyapıyı sağlayan birimlerdir.
Kubernetes veya benzeri konteyner sistemlerinde, Namespace’leri belirleme stratejileri, kaynakları gruplandırma ve koruma açısından çok önemlidir. Namespace’leri belirleme konusunda, müşteri veya departmanlara, ortamlara, yetkilendirmelere, işlevsel alanlara, proje bazlı ayrı alanlara veya kullanım durumlarına göre gruplama gibi farklı yaklaşımlar kullanılabilir. Doğru strateji gereksinimlere ve işleyişe uygun olarak seçilmeli ve yönetilmelidir.
Namespace’ler bir cluster içindeki sanal bölümlerdir. Bu bölümler, farklı projelerin veya ekiplerin kendi kaynaklarını ayırt etmesini sağlar. Her namespace, kendi içinde çalışır ve kendi kaynaklarını yönetir. Böylece, farklı uygulamalar aynı cluster içinde çalışabilir, ancak her biri kendi alanında ayrı bir şekilde faaliyet gösterebilir. Namespace’ler, karmaşık sistemlerin daha düzenli ve düzenlenmiş bir şekilde çalışmasına yardımcı olur.
Limitleri belirlemek
Openshift cluster’ında uygulamalarınızın kaynak kullanımını yönetmek için resource ve limit tanımları oldukça önemlidir. Bu tanımlar, uygulamalarınızın ne kadar CPU ve bellek kullanacağını belirler. Resource tanımları, bir konteynerin minimum ve maksimum ne kadar kaynak kullanabileceğini belirlerken, limit tanımları bir konteynerin maksimum kaynak kullanımını sınırlar. Bu kontroller, bir uygulamanın diğerlerine veya cluster içindeki diğer kaynaklara müdahale etmeden çalışmasını sağlar.
Ayrıca, Namespacelerde kotalar oluşturarak belirli bir namespace içindeki toplam kaynak kullanımını sınırlayabilirsiniz. Bu, bir namespace içinde çalışan tüm uygulamaların toplam CPU, bellek veya disk alanı kullanımını kontrol altında tutmanızı sağlar. Örneğin, bir namespace için belirli bir CPU kullanım limiti veya toplamda kullanılacak maksimum bellek miktarı gibi kotalar belirleyebilirsiniz. Bu kontroller kaynakların adil bir şekilde paylaşılmasını sağlar.
Service Account Tanımlamaları
Service Account bir uygulamanın diğer OpenShift nesneleriyle (örneğin pod’lar veya diğer servisler) etkileşimde bulunmasını sağlayan kimlik doğrulama bilgilerini temsil eder. Her Service Account, bir namespace içinde tanımlanır ve uygulamanın çalıştığı podlarla ilişkilendirilir. Service Account’lar, uygulamaların Kubernetes/OpenShift API’larına erişmesini ve diğer kaynaklarla (örneğin diğer podlar veya depolama) iletişim kurmasını sağlamak için kullanılır.
5.Sistem Mimarisinin Kurgulanması
Bu adım uygulamanın gereksinimlerinin, dağıtım stratejilerinin, güvenlik önlemlerinin ve performans izleme mekanizmalarının belirlendiği, sistemin sağlıklı ve ölçeklenebilir bir yapıya kavuşturulması için gereklidir.
Deployment Stratejisinin Belirlenmesi
İlk olarak, mevcut altyapı, uygulamanın karmaşıklığı ve kullanıcı ihtiyaçları gibi değişkenleri değerlendirmek önemlidir. Kullanılacak Deployment stratejisi, uygulamanın gelişme aşaması, test süreçleri ve kullanıcılar üzerindeki etkilerini içermelidir. Bu noktaların yanı sıra, stratejinin esnekliği, geri dönüş yeteneği, otomatik ölçeklendirme, yedekleme ve güvenilirlik gibi unsurları içeren bir planlama gereklidir. Kullanıcı kesintilerini minimum seviyede tutmak, hızlı geri dönüş imkanı sağlamak ve uygulamanın sağlamlığını garanti altına almak için strateji dikkatlice tasarlanmalıdır. Son olarak, A/B testleri, izleme ve geribildirim mekanizmalarıyla stratejinin etkinliği düzenli olarak gözlemlenmeli ve gerekirse revize edilmelidir.
Sistem Performansının İzlenmesi
OpenShift sistemi performansını izlemek için çeşitli yöntemler bulunur. Prometheus gibi monitoring araçlarıyla pod’lar, servisler ve kaynak kullanımı izlenebilir. Metrikler, CPU, bellek tüketimi gibi performans göstergelerini sağlar. Log izleme araçlarıyla hata ayıklama ve performans sorunları belirlenebilir. Yük testleri ve otomatik ölçeklendirme özellikleri, sistem performansının yük altında nasıl etkilendiğini gözlemlemek için önemlidir. Güvenlik denetimleri ise performansı etkileyebilecek sorunları belirlemeye yardımcı olur. Bu yöntemler, OpenShift üzerindeki sistem performansını izlemek ve iyileştirmek için kullanılabilir.
6.Openshift’in Sunduğu Özellikleri Kullanma
- Build Stratejileri: Source-to-Image (S2I), Dockerfile, Pipeline gibi farklı build stratejileri sunarak konteyner image’larının oluşturulmasını sağlar.
- CI/CD Entegrasyonu: Git, Jenkins, Azure Devops gibi kaynaklardan kodları alarak sürekli entegrasyon/deployman süreçlerini kolaylaştırır.
- Kubernetes Entegrasyonu: Kubernetes API’lerini kullanarak, temel Kubernetes kaynaklarını genişleterek daha kapsamlı özellikler sunar.
- Güvenlik Özellikleri: Role-Based Access Control (RBAC), Network Policy, Security Context Constraints (SCC) gibi güvenlik özellikleriyle uygulamaları izole eder ve güvenliği artırır.
- Scalability and Automatic Scaling: Horizontal Pod Autoscaling (HPA) gibi özelliklerle uygulamaları izler ve otomatik olarak ölçeklendirir.
- Monitoring ve Loglama: Prometheus, Grafana, Elastic Stack gibi araçlarla uygulama performansını izleme, logları inceleme ve analiz etme imkanı sunar.
- Geliştirici Araçları ve Entegrasyon: IDE entegrasyonları, CLI araçları ve kullanıcı dostu bir web arayüzü ile geliştiricilerin çalışmasını kolaylaştırır.
- Storage Yönetimi: Çeşitli storage sınıfları, PVC (Persistence Volume Claim) özellikleri ve çeşitli storage provider’larıyla entegrasyon sağlar.
- Route ve Traffic Yönetimi: Ingress Controller ile gelen trafiği yönlendirme, Load Balancing ve Route tanımlama gibi özellikler sunar.
- Health Checks and Monitoring: Liveness Probe, Readiness Probe gibi sağlık kontrol mekanizmaları ve Prometheus gibi araçlarla uygulama sağlığını ve performansını izler.
7.Pipeline Düzenlemeleri
Azure DevOps üzerinde Dockerfile’larınızı kullanarak bir build pipeline oluşturabilirsiniz. Bu pipeline, Docker imajlarınızı oluşturacak ve bu imajları belirtilen Container Registry (örneğin, Harbor) üzerine yükleyecektir.
Azure DevOps’ta oluşturulan ServiceAccount’lar, OpenShift cluster’ına erişim ve dağıtım süreçlerindeki otomasyon için kullanılır, bu sayede CI/CD aşamalarında güvenlik ve yapılandırma kontrolleri sağlanır.
Öneriler ve özet
Makalede, OpenShift üzerinde uygulama yayınlamanın aşamaları detaylı bir şekilde ele alındı. Dockerize etme, Image Registry kullanımı, Kubernetes bileşenleri, OpenShift ortamının hazırlanması, sistem mimarisinin kurgulanması ve Openshift’in sunduğu özellikleri kullanma gibi adımları içeren bu rehber, hızlı, güvenli ve ölçeklenebilir uygulamalar geliştirmeyi amaçlamaktadır. Ayrıca, Azure DevOps ile yapılan pipeline düzenlemeleri ve Service Account’ların kullanımına dair önerilerle güvenli ve otomatize edilmiş CI/CD süreçlerine vurgu yapıldı. Bu önerilerin doğru bir şekilde uygulanması, uygulama yayınlama sürecinin başarıyla tamamlanmasına katkı sağlayacaktır. OpenShift üzerinde uygulama ölçeklenebilirliği, healthcheck stratejileri ve deployment yöntemleri gibi stratejik unsurların da dikkatlice planlanması, uygulamanın güvenilirliğini, performansını ve kullanıcı memnuniyetini artırmada kritik rol oynamaktadır.
- Uygulama geliştirme sürecinde Dockerize etme adımını dikkatlice gerçekleştirerek, uygulamanın konteyner ortamına taşınabilir ve çevik bir yapı kazanmasını sağlayın.
- Image Registry kullanımı için güvenli ve yönetilebilir bir platform seçerek, Docker image’larınızı merkezi bir depoda saklayın ve paylaşın.
- Kubernetes bileşenlerini doğru bir şekilde anlayarak, uygulamanızın yönetimini ve dağıtımını etkin bir şekilde gerçekleştirin.
- Openshift ortamının hazırlanması aşamasında, cluster ve namespace oluşturmak için uygun stratejiler belirleyin ve kotaları doğru bir şekilde tanımlayarak kaynak kullanımını yönetin.
- Sistem mimarisinin kurgulanması aşamasında, performans izleme, güvenlik önlemleri ve deployment stratejilerini belirleyerek uygulamanızın sağlıklı bir yapıya kavuşmasını sağlayın.
- Openshift’in sunduğu özellikleri etkin bir şekilde kullanarak, geliştirme sürecinizi optimize edin ve güvenlik kontrollerini sıkılaştırın.
- Azure DevOps üzerinde pipeline düzenlemeleri yaparken, Service Account’ları kullanarak güvenli ve otomatize edilmiş CI/CD süreçleri oluşturun.
Kaynaklar:
Giriş görseli: Berlin Philharmonic