DevOps Tools — TR

M. Esat Ceber
9 min readJan 2, 2024

--

DevOps araçlarından bahsettiğimizde, bu kadar çok araç olmasının nedeni biraz endişe yaratabilir. Peki, bu ihtiyaç nereden geliyor?

Merak etmeyin, bu yazıda endişemizi biraz azaltacak ve kullanılan araçların amacını basit bir hikaye ile anlatacağım.

Haydi, hikayemize geçelim!

Aklında mükemmel girişimleri bulunan Yeni Dünya şirketinin üyeleri, fikirlerini pazarlamak için dijital dünyaya adım atması gerekiyor. Bunun için mükemmel bir uygulamaya ihtiyaçları olduğu gibi kesintisiz hizmet vermeleri gerekiyor. Aynı zamanda bu şirket, piyasadaki rakipleriyle sürekli yarış içinde olduğu için inovasyona yatırım yapmaktadır.

Biz bu uygulamayı yapacağımıza eminiz. Bunun için yapacağımız ilk şey nedir? Tabii ki, kod yazmak…

Bu yazmış olduğumuz kod bilgisayarımızda çalışmaya başladı. Aynı zamanda HTTP localhost IP adresinin 8000 portu ile erişilebilir durumdadır. Fakat dünyayla paylaşımımız bulunmuyor. Bilgisayarından dünyayla paylaşmanın bir yolunu bulsan bile, bilgisayarını kapattığında kimse erişim sağlayamaz.

Bu durumda müşterimizin ihtiyacı olan sürekli erişimi karşılamamış olacağız. Bunun için uygulamanın hiç kapatılmayan bir sistemde yer alması gerekiyor. Bu sistem, bir veri merkezindeki fiziksel bir sunucu veya bir bulutta bulunan bir sanal makine (VM) olabilir.

Kodumuzu kopyalayıp sunucuya atalım…

Kodu kopyalamak, sunucuda çalıştırılacağı anlamına gelmiyor. Uygulamayı çalıştırabilmek için sistemi yapılandırmalısınız. Örneğin, uygulama Python, Java veya başka bir programlama dilinde yazıldıysa, sunucuda da bu programlama dillerinden veya runtime’larını bulundurmalısınız. Uygulama kütüphaneleri veya paketler kullanıyorsa, sunucuda bu kütüphane ve paketlerin tam sürümünü aynı şekilde yapılandırmalısınız.

Sistemimizi yapılandırdıktan sonra, bu ortamda geliştirmelerimizi taşıyabiliyoruz. Geliştirme ortamımıza “Development” ortamı diyebiliriz.

Uygulamamız artık Development ortamında çalışabiliyor. Development ortamımızda yer alan sunucunun bir IP’si var, bu yüzden artık bu IP adresinden erişilebilir durumda. Tüm dünyaya erişimi sağlayacak bir sunucuya ihtiyacımız olduğunu düşünüyorum. Şimdi tüm dünyaya açabiliriz. Ancak müşterilerimizin IP adresiyle ulaşmalarını istemeyiz. Bunun için bir domain name satın alırız ve sunucumuzla eşleştirmesini gerçekleştiririz. Artık uygulamamızın bulunduğu ortama PRODUCTION ortamı diyebiliriz.

Her şey hazır ve artık dünyayla paylaşmaya hazırız! Yeni Dünya şirketinin üyeleri tarafından sunulan hizmet, insanlar tarafından çok fazla beğenildi! Müşteri sayımız her geçen gün artıyor… Binlerce kullanıcıya sahip bir uygulamamız oldu! Kullanıcı ihtiyaçları ve yeni fikirlere uygun olarak uygulamamızın sürekli gelişmeye ihtiyacı var!

Mevcut iş akışımızı gözden geçirmeye Development ortamı için başlıyoruz. Geliştirici bilgisayarında kurulu olan IDE aslında bir metin dosyası oluşturmaktadır. Metin formatındaki kod, son kullanıcı tarafından uygulama olarak çalıştırılacak şekilde yeterli değildir. Yazılımın hangi dilde yazıldığına bağlı olarak metin dosyası, sistem özelliklerine göre derlenir ve executable (çalıştırılabilir) hale gelir. Derlenebilir programlar için MAVEN veya GRADLE gibi araçlar, projenizi derleyip çalıştırılabilir hale getirecektir.

Böyle büyük bir proje için sadece bir geliştirici olması imkansız! Geliştirici takımı olarak aynı kod üzerinde çalışmalar yapıldığı için buradaki karışıklığı önlemek için GIT kullanılıyor. GIT, tüm geliştiricilere aynı uygulamada aynı anda çalışma ve etkili bir şekilde işbirliği yapma konusunda yardımcı olur. Tüm Geliştirici PC’lerinde GIT yüklüdür. GIT’in yüklü olması ortak geliştirilen kodun merkezi bir HUB üzerinden Geliştirici PC’ye çekilmesini sağlar. Geliştirici, ilgili geliştirmeyi kod üzerinde yapıp merkezi HUB’a geri bırakabilir.

GIT, kodun sürüm kontrolünü ve birden çok geliştirici arasındaki işbirliğini sağlayan temel bir teknolojidir. GitHub, kodunuzu push/pull yapabilmek veya farklı kullanıcılar için farklı erişimleri tanımlayabilmek gibi birçok yeteneği sağlayan web tabanlı bir arayüze sahip olan GIT tabanlı merkezi kod deposudur. Muadili GitLab ve Bitbucket bulunmaktadır.

Takımımız artık ortak kod geliştirebiliyor. Geliştirdikleri kodları kendi bilgisayarlarında build edip production ortama deploy edebiliyorlar.

Geliştirme yapan takım arkadaşlarının son versiyondaki kodları kendi lokal bilgisayarlarına almaları gerekmektedir. Bunun için kendi bilgisayarlarında build yapmaları yerine production öncesi bir ortamda build yapabilirler. Artık uygulamamızın build yapılacağı ortama “BUILD” ortamı diyebiliriz.

Ayrıca, build edilmiş bir kodu doğrudan production ortamında deploy etmek istemeyiz. Kod üzerinde oluşabilecek hataları son kullanıcıya göstermeden test edebileceğimiz bir ortama ihtiyacımız olacaktır. Ayrıca uygulamamızın performansını görebilmek için JMeter gibi araçlar ile testler yapılmalıdır. Artık uygulamamızın test edileceği ortama “TEST” ortamı diyebiliriz.

Ortamlarımız kod geliştirme ve yaygınlaştırma için hazır görünüyor. Geliştirici kendi ortamında kodunu geliştiriyor. Bunu GitHub’a push yapabiliyor. Ardından kodu build edip executable hale getirebileceği bir ortama kopyalayabiliyor. Bu ortamda executable olan kodu test ortamına taşıdığımızda testlerini gerçekleştirebiliyoruz. Testlerde bir hata ile karşılaşmazsak, kullanıcının erişebileceği production ortamında kodumuzu yaygınlaştırabiliyoruz.

Bu iş akışı manuel taşımalar ile gerçekleşmektedir. Ayrıca taşıma yapıldığı zaman aralığında işler yavaş gerçekleşeceği için uygulamamıza erişim kesintili olacaktır. En önemlisi ise deployment aşamasında gerçekleşen hatalardır.

Deployment hataları için genel bir gruplama yapacak olursak:

  1. Versiyon Uyumsuzlukları: Yeni bir sürümün eski bir versiyonla uyumsuz olması, veri tabanı şemalarındaki değişiklikler veya eski API’larla uyumsuzluk gibi nedenlerle ortaya çıkabilir.
  2. Bağımlılık Sorunları: Yazılımın dış bağımlılıklarının eksik veya yanlış versiyonlarda olması, deployment hatalarına neden olabilir.
  3. Konfigürasyon Hataları: Canlı ortamdaki konfigürasyon dosyalarının hatalı olması veya eksik ayarlar, deployment sürecinde sorunlara yol açabilir.
  4. Sunucu Sorunları: Sunuculardaki donanım veya yazılım sorunları, deployment sırasında hatalara neden olabilir.
  5. Ağ Sorunları: Bağlantı kesintileri, ağ konfigürasyon hataları veya trafik sıkışıklıkları, deployment sırasında problemlere neden olabilir.

Bu hatalar organizasyonun geliştirme, test ve deployment süreçlerinin kalitesine, otomasyon seviyesine, takımın deneyimine ve kullanılan teknolojiye bağlı olarak değişir.

Etkili bir CI/CD (Continuous Integration/Continuous Deployment) süreci, düzenli testler ve otomatik deployment işlemleri kullanılarak deployment hataları minimize edilebilir.

İşte tam bu noktada Yeni Dünya uygulamamız Jenkins, GitHub Actions veya GitLab CI/CD gibi araçları kullanarak manuel görevleri otomatikleştirmenize ve bir pipeline ile bu süreci hızlı bir şekilde yürütmemize yardımcı olacaktır.

CI, yazılım geliştiricilerin kodlarını sık sık birleştirip test etmelerini ve paylaşmalarını sağlayan bir yaklaşımdır. Version Control, Automated Build, Automated Test adımlarını kapsamaktadır.

CD, yazılımın test edildikten ve onaylandıktan sonra otomatik olarak canlı ortama dağıtılmasını sağlar. Artifact Management, Deployment Automation, Release Orchestration gibi Deployment adımlarını kapsamaktadır.

Kullanacağımız uygulama teknolojisine göre yapılan geliştirmeler için dependency ve library eşitliği tüm ortamlar için geçerli olmalıdır. Bu durumda yeni bir paket kullanılacak olursa manuel olarak tüm ortamlara bu kurulumu gerçekleştirmemiz gerekir.

Bu paketlerden birini doğru sürümde doğru şekilde yapılandırmayı atlarsanız, yazılımın çalışmamasına ve farklı sistemlerde beklenmeyen sonuçlara yol açabilir.

İşte tam burada konteyner teknolojisi devreye girmektedir.

Konteynerler, uygulamayı ve dependency’leri endişelenmeden herhangi bir sistemde çalıştırılabilen bir image haline getirerek paket yapmanıza olanak sağlar.

Konteyner ile çalışabilecek teknolojilerden birisi Docker’dır. Developer dependency lerin ne olduğunu belirten bir Docker dosyası oluşturabilir ve bu Docker dosyası, bir image oluşturmak için yapılandırma sırasında kullanılabilir. Oluşturduğu image için basit bir komut ile çalışır hale getirebilir.

Artık konteyner ile çalışabildiğimize göre her bir sunucu grubu üzerinde çeşitli konteynerlar oluşturabiliriz.

Konteynerlerin temel görevlerinden biri izolasyonu sağlamaktır. Uygulamaların ve işlemlerin birbirinden bağımsız olarak çalışabilmesini, bir konteyner içindeki bileşenlerin dışındaki sistemle etkileşimini sınırlaması demektir. Konteynerler, işletim sistemine dahil olan izolasyon mekanizmalarını kullanarak, bir uygulama veya servisin çalıştığı ortamı diğer uygulamalardan ve sistem kaynaklarından izole eder. Bu sayede, her konteyner kendi bağımsız çalışma ortamına sahip olur ve dışındaki konteynerlere veya sistem kaynaklarına müdahale etmez.

Kullanıcı sayımız daha fazla olduğu bir senaryoda yedekliliği göz önünde buldurarak production ortamda yer alan sunucu sayılarını arttırmak istiyoruz. Konteyner teknolojisine hakim olduğumuzdan her sunucu grubu üzerinde Konteyner çalıştırabiliriz.

Burada bazı sunucu grupları için yük fazlalığına bağlı olarak konteyner sayısını arttırmak isteyebiliriz. Yada bir konteyner üzerinde sorun olduğunda otomatik olarak tekrar başlamasını isteyebiliriz.

Kubernetes konteyner orkestrasyonunda popüler bir teknolojidir. Konteynerlerin nasıl deployment olacağını belirlemeye yardımcı olur ve sürekli çalışabilirlik durumunu kontrol eder.

Kubernetes, ihtiyaca bağlı olarak konteynerleri ve altındaki altyapıyı otomatik olarak ölçeklendirmeye ve sunuculardaki kaynakları yönetmeye yardımcı olabilir, böylece kaynakların en etkili şekilde kullanılmasını sağlar.

Buraya kadar anlatılanları özetleyerek kullanılan teknolojilere göz atalım:

  1. Developer lar kodlarını kendi local bilgisayarlarında geliştirirler. Kodlarını Git sistemine yüklerler.
  2. Developer lar, Git üzerinden kodlarını GitHub gibi merkezi bir depoya gönderirler.
  3. GitHub depoya her güncelleme yapıldığında, Jenkins gibi bir sürekli entegrasyon (CI) aracı otomatik olarak tetiklenir. Jenkins, depodan güncel kodu çeker ve yapılandırılmış derleme işlemlerini gerçekleştirir.
  4. Maven gibi bir araç, dependency leri yönetir ve proje için gerekli dependency leri çözer. Derleme işlemi sonucunda, Docker image oluşturulur.
  5. Docker, uygulamanın çalışması için gerekli ortamı içeren bir konteyner görüntüsü oluşturur.
  6. Jenkins, oluşturulan Docker görüntüsünü test ortamına dağıtarak uygulama testlerini otomatik olarak çalıştırır. JMeter gibi araçlar kullanılarak performans testleri yapılabilir.
  7. Başarılı testlerden sonra Jenkins, Kubernetes üzerinde belirtilen ortama konteyener dağıtır.
  8. Kubernetes, uygulamayı belirtilen miktarda çalışan konteynerler ile yönetir.

Yeni Dünya şirketinin geliştirdiği uygulama, kullanıcı sayısı arttıkça daha fazla kaynak talep edecektir. Bu sebeple, altyapı yönetimi büyük bir öneme sahiptir. Her yeni sunucunun, bulunduğu ortamdaki diğer sunucularla uyumlu bir yapıya sahip olması gereklidir. İşletim sisteminin doğru sürümü ve kaynakların etkili bir şekilde yönetilmesi bu süreçte kritik öneme sahiptir.

Ayrıca, sunucuya eklenen depolama birimi gibi bileşenlerin yanı sıra Docker çalışma zamanı veya gerekli Kubernetes paketleri gibi öğelerin önceden doğru şekilde yapılandırılması gerekmektedir.

Bu süreç, her bir sunucunun sağlanması aşamasında cloud platformunun arayüzünde manuel tıklamalar yapmak yerine, altyapının otomatik ve tutarlı bir şekilde yapılandırılmasını gerektiren büyük bir zorluktur. Manuel yapılandırma süreci zaman alabilir ve altyapıda hatalara neden olabilir, bu da tüm sunucunun yeniden oluşturulmasını gerektirebilir.

İşte burada Infrastacture As Code yani IaC teknolojisini kullanan Terraform kullanılabilir. Terraform, hangi cloud platformlarında olursa olsun sunucuların sağlanması ve yapılandırılmasını otomatikleştirir ve konfigüre edilen sunucuların her zaman aynı durumda olduğundan emin olur.

Terraform üzerinde bir manifest dosyası oluşturarak tüm altyapımızı rahatça yönetebiliriz. Ayrıca yeni bir sunucu eklenmesinde hızlı konfigürasyon yeteneğine sahip olarak altyapıyı yanlış yapılandırma veya insan hatalarına neden olacak sorunların önüne geçebiliriz. Göründüğü gibi bir dosyada yazan kodlar ile bunu gerçekleştirebiliriz.

Bu yapılandırılmış dosyaları ayrı bir sunucu grubunda kontrol ederek Terraform’u devreye alıyoruz.

Şimdi, sunucular sağlandıktan sonra bu sunucuların yapılandırması, Ansible gibi araçlarla otomatikleştirilebilir. Terraform daha çok bir altyapı sağlama aracı iken, Ansible, bu altyapıyı sağlandıktan sonra yapılandırmaya yardımcı olan bir otomasyon aracıdır. Bu araçlar hem altyapı sağlama hem de bu altyapıdaki yazılım konfigürasyonunu otomatikleştirme yeteneğine sahiptir. Terraform genellikle altyapı sağlama ve sağlanan altyapı üzerinde konfigürasyon işlemleri için kullanılırken, Ansible, yazılımın kurulumu ve bu sunucularda yapılandırılması gibi sonraki konfigürasyon faaliyetleri için kullanılır.

Ansible da sunucuları yapılandırmak için kod kullanır. Bu kodlara “Ansible playbook” denir ve bu kodlar da GitHub’taki kaynak kod deposuna yerleştirilir.

Artık Yeni Dünya şirketinin büyük ölçekli sistemi hazır!

Biz bu sistemin sürekli olarak sürdürülebilir olmasını sağlamak için metriklere ihtiyaç duymaktayız. Bu metrikler son kullanıcı memnuniyetini ölçmek ve mevcut sistemin olası anomalisine önlem almak amacıyla sağlanmalıdır. Bunun için monitoring teknolojilerine ihtiyaç duymaktayız.

Prometheus, farklı sunuculardan bilgileri veya metrikleri toplar ve bunları merkezi bir depoda saklar. Sadece metrikleri toplamak analizlerimizde zorluk çıkaracağı için bu metrikleri Grafana gibi bir teknoloji kullanarak görselleştirmek isteriz.

Grafana, Prometheus tarafından toplanan verileri anlamlı hale getirerek, bunları grafik ve çizelgelere dönüştürerek yardımcı olur.

Yeni Dünya uygulamasını geliştirenler yenilikçi fikirlerini gerçeğe dönüştürmek için kod yazmaya başlar. Kodlarınız, güçlü bir altyapıyı desteklemek üzere derlenir. Derlenen kodlar, titiz test süreçlerinden geçer. Testlerden başarıyla geçen uygulama, kullanıcılara sunulmaya hazır hale gelir. Uygulama, kullanıcı sayısının artmasıyla birlikte genişletilir ve yeni özellikler eklenir. Sürekli olarak performansını ve verimliliğini artırmak için çalışmaya devam ediyoruz. Uygulamamızı sürekli olarak izliyoruz. Sunucu performansı, hata oranları ve kullanıcı etkileşimleri gibi metrikleri yakından takip ediyoruz. Kullanıcılardan almış olduğumuz geri dönüşlere göre geliştirmeye devam ediyoruz.

Yeni Dünya olarak amacımız, sizlere en iyi deneyimi sunmak ve uygulamamızı sürekli olarak iyileştirmektir. Sizden gelen her geri bildirim, bu hedefe ulaşmamıza yardımcı olur. Teşekkür ederiz ve kullanmaya devam ettiğiniz için minnettarız!

Evet, hikayemiz bu kadar. Umarım DevOps dünyasında yer alan birkaç popüler araç hakkında bilgi vererek size faydalı bir yazı sunabilmişimdir.

Hikayede referans alınan araçların özet açıklamaları şu şekildedir:

  • Git: Dağıtık bir sürüm kontrol sistemidir. Kodu takip etmek ve işbirliği yapmak için kullanılır.
  • GitHub: Git tabanlı bir platformdur ve kod depolarını barındırır, işbirliği yapmayı kolaylaştırır.
  • Jenkins: Sürekli entegrasyon ve sürekli dağıtım sağlayan bir açık kaynak otomasyon aracıdır.
  • Maven: Java projeleri için proje yönetimi ve anlama aracıdır. Bağımlılıkları yönetir ve projeyi derler.
  • Docker: Hafif konteyner teknolojisi sunan bir platformdur. Uygulamaları izole edilmiş ortamlarda çalıştırmak için kullanılır.
  • JMeter: Performans testi yapmak için kullanılan açık kaynaklı bir yük test aracıdır.
  • Kubernetes: Konteyner orkestrasyonunu sağlayan bir açık kaynak platformdur. Uygulamaları otomatik olarak dağıtmak ve yönetmek için kullanılır.
  • Terraform: Altyapıyı kod olarak yöneten bir araçtır. Farklı bulut platformlarında sunucu kaynaklarını otomatik olarak oluşturur ve yapılandırır.
  • Ansible: Otomasyon aracıdır ve yapılandırma yönetimi, uygulama dağıtımı ve görev otomasyonu için kullanılır.
  • Prometheus: Sistem ve hizmet izleme için kullanılan bir açık kaynak araçtır. Metrikleri toplar ve depolar.
  • Grafana: Prometheus ve diğer veritabanlarından gelen verileri görselleştirmek için kullanılan bir analiz ve görselleştirme platformudur.

Bir yazımızın sonuna geldik. Başka bir yazıda görüşmek dileği ile.

Bana ulaşmak için: Linkedin

--

--

M. Esat Ceber

DevOps & SRE expert, improving Large-Scale Systems' software. Excited to share insights in articles. Let's connect!