Bulut ve mobilite dönüşümü ile öne çıkan inovasyonlarından biri de kapsayıcılar, yani “Container” çözümleridir. Container yapıları teknoloji ekosisteminde geliştirme yapan ekipleri güçlendiren ve yeni nesil uygulama geliştirme deneyimi yaşatan önemli dönüşümlerin başında geliyor. Container yapıları ile çok hızlı ve kısa sürede, birbirinden izole, kaynak kontrollü ve taşınabilir işletim ortamlarını kolaylıkla oluşturmak mümkün hale gelmiştir.
Günümüzde birçok kurum ve kuruluş, özellikle geliştirme ortamlarında çalışan yapılarda sürekli yazılım geliştirilen servisleri daha hızlı yaygınlaştırmanın yollarını arıyor. Sunucu sanallaştırma bu ihtiyaca yardım ediyor, fakat hâlâ hazırlık için bir provizyonlama süreci gerektiriyor. Özel ve genel bulut platformları bu ihtiyacı daha geliştirmiş olsa da hâlâ sunucu kurulumu, bu sunucular için kaynak gereksinimi sağlama, işletim sistemi yönetimi, yapılandırma ve bakım ihtiyaçları gibi önemli oranda operasyonel yük barındırıyor. Container’lar işte bu noktada ihtiyaca cevap verebilecek mimaride tasarlanmış, son yıllarda uygulama geliştirme sektörünü dönüştüren bir teknoloji. Öncelikle, Container yapıları bir sanal sunucu (VM) değildir. Container, sanal sunuculara benzer şekilde işletim sistemi, ağ ve depolama sistem kaynaklarına erişir. Aynı host üzerindeki tüm container’lar aynı işletim sistemi çekirdeğini paylaşırken uygulamalar ve bu uygulamaların barındırıldığı container yapıları kendi işletim sistemleri ve çeşitli diğer servisleri açısından birbirinden izole çalışır. Temel olarak container, bir uygulama için ayrılmış izole alana verilen isimdir. Kendisine ayrılan bu alanda çalışırken sistemin geri kalanını ve diğer uygulamaları etkilemeden işini yapar. Sanallaştırma teknolojileri içerisinde işletim sistemi sanallaştırma kategorisinde yeni bir dönüşümdür.
Container oluşturan bileşenleri aşağıdaki resimde görmektesiniz. Şimdi bunları genel olarak ele alalım:
Container Host: Container yapılarını barındıran sistemlerdir. Donanım sanallaştırma ile üzerinde çok sayıda sanal sunucuyu barındıran “virtulization host” olarak adlandırılan yapıların container dünyasındaki karşılığı da “container host” olarak adlandırılır. Container host üzerinde bir ya da daha fazla sayıda container çalıştırılabilir. Container host sunucuları, fiziksel ya da sanal sunucu olabilirler. Container Host aynı zamanda “Host OS (Operating System)”olarak da adlandırılır.
Container İmaj: Bir container ortamına ait dosya sistemi, registry ve yüklenen yazılımlara ait değişiklikler “sandbox” adı verilen normalde içi boş bir ortam içerisinde saklanırlar. Çoğu durumda bu saklama işlemi yeni container oluştururken değişiklikleri kalıtsal olarak kaynak imajdan alarak oluşturur. İşte bu oluşumu sağlayan container’ın kaynak kopyasına “container imaj (container image)” diyoruz. Container durdurulduğunda, oluşan sandbox içeriği silinir ya da yeni bir container imajına dönüştürülerek saklanabilir. Örneğin; Windows Server Core işletim sistemi imajından bir container ortamına sahip olduğunuzu düşünün. Daha sonra bu container içerisine MySQL yüklediniz. Bu container ortamından yeni bir imaj oluşturulduğunda, container imajında yapılan değişikliği içeren ve yeni oluşan bir imaj versiyonu olacaktır. Oluşturulan bu imaj kaynak olarak kullanılıp tekrarlı yeni container imajları çoğaltmak için kullanılabilir. Bu imaj sadece yapılan değişiklikleri içerir (MySQL); fakat Container işletim sistemi imajı üzerinde bir katman olarak çalışır. Microsoft Azure platformunda container imajlarını saklamak için sunulan platform servisinin adı “Azure Container Registry (ACR)” olarak adlandırılır. Oluşturulan imajlar Azure Container Registry içerisinde saklanarak, bu kaynaktan ilgili servise çağrılarak ya da indirilerek kullanılabilir.
Sandbox: Container başlatıldığında tüm yazma aksiyonları, örneğin dosya sistemi değişiklikleri, registry düzenlemeleri ya da uygulama kurulumları “Sandbox Katmanı” adı verilen bu katmanda gerçekleşir.
Container işletim Sistemi İmajı (Container OS): Container nesneleri container-destekli kaynak işletim sistemi imajlarından yaygınlaştırılırlar. Container işletim sistemi imajı potansiyel olarak bir container yapısını oluşturan en temel ve çekirdek katmandır. Bu çekirdek imaj ile işletim sistemi ortamı sağlanır. Çekirdek bir container işletim sistemi imajı üzerinde değişiklik yapılamaz. Windows tabanlı bir container oluşturulunca ya da yaygınlaştırılınca bu Windows Server 2016 Core ya da Windows Nano Server kurulu işletim sistemi imajını temel alır. Bu konuyla ilgili olarak https://docs.microsoft.com/en- us/dotnet/architecture/microservices/net-core-net-framework-containers/net- container-os-targets makalesini de inceleyebilirsiniz. Linux tabanlı container işletim sistemleri için çekirdek imaja örnek olarak Ubuntu, CentOS verilebilir.
Container Repository: Bir container imajı her oluşturulduğunda, container imajı ve bağımlılıkları yerel imaj kütüphanesi (loca/ repository)içerisinde saklanır. Bu imajlar container host üzerinde çok defa kullanılabilir. Container imajlar ayrıca DockerHub ve Azure Container Registry gibi bulut platformları üzerinde de saklanarak çok farklı container hostlar arasında kullanılabilir. Bir başka deyişle container repository; tekrar tekrar kullanılabilir imajların kaydedildiği, saklandığı imaj deposudur. Windows Server 2019 ya da Windows Server 2016 işletim sistemlerinde varsayılan kullanım ile imaj kütüphanesi host üzerinde saklanır; fakat daha sonraki güncellemeler, bu kütüphanenin hostlar arası paylaşımına izin verir.
Container Yönetim Araçları: Container yapıları PowerShell, Bash, Docker araçları ve diğer açık kaynak araçlar kullanılarak yönetilebilir. Bu araçların her biri ile yeni container oluşturma, container imaj oluşturma ve container yaşam döngüsünün yönetimi ve izlenmesi gerçekleştirilebilir.
Uygulama geliştirme ekipleri açısından container teknolojileri, masaüstünden test ortamına, üretim ortamındaki sunucu kümelerine kadar, bir container imajı kullanılarak tüm ortamlar için saniyeler içerisinde yaygınlaştırılabilir. Böyle bir modelde container ortamından yaygınlaştırılan yeni imajlarda sadece uygulama ve uygulamayı çalıştırmak için gerekli bileşenler yeni bir imaj içerisinde birleştirilir. Container yapıları daha sonra ihtiyaç oldukça bu imajdan oluşturulurlar. Oluşturulan bir imaj başka bir imaj oluşturmak için baz imaj olarak kullanılıp imaj oluşturma süreci hızlandırılabilir. Diğer taraftan birden fazla container aynı imajı paylaşabilir, bu sayede de container yapılarının çok hızlı başlatılması, daha az kaynak kullanması sağlanabilir. Örneğin; container yapıları kullanılarak dağıtık uygulamalar için küçük çapta ve taşınabilir uygulama bileşenleri ve mikro servisleri yazılıp her servis ayrı ayrı ölçeklenebilir.
Container yapıları, içerisindeki uygulamayı çalıştırmak için gerekli her şeye sahiptir.
Container’ları yerel olarak oluşturup test edebilirsiniz, aynı container imajını şirketinizin özel bulutuna, kullandığı genel bulut platformuna ya da servis sağlayıcıya, hatta bunların tamamını içeren hibrid bir modelde birden fazla platforma yaygınlaştırabilirsiniz.
Container ile geliştirme yapan geliştiriciler, bir uygulamayı her dilde derleyebilirler. Bu uygulamalar tamamen taşınabilir bir yapıda, her ortamda (dizüstü, masaüstü, sunucu, özel bulut, genel bulut, servis sağlayıcı ortamı) herhangi bir kod değişimi yapmadan çalışır.
Container yapıları sayesinde geliştiriciler için yüksek kalitede uygulamaları, daha hızlı geliştirme ve hazırlamaya da önemli oranda katkı sağlanmıştır.
Özellikle altyapı ve sistem yönetimi yapan bilgi teknolojileri profesyonelleri açısından container yapılarının kullanılması; geliştirme, test, kullanıcı kabul ve üretim öncesi gibi farklı ekipler için standartlaştırılmış ortam sağlamada önemli bir avantaj sağlamıştır. Bu ekipler karmaşık kurulum ve yapılandırma adımları ile zaman kaybından çok büyük oranda kurtulmuştur. Ayrıca container teknolojisinin kullanımı ile sistem yöneticileri işletim sistemi kurulumları ve alt tarafdaki yapılar arası farklılıklardan da soyutlanmış olacaktır. Container teknolojisi, sistem yöneticilerine altyapıyı daha basit adımlarla oluşturma, güncelleme ve bakım imkânını da sağlamaktadır.
Microsoft Azure genel bulut platformu 2015 Ocak itibariyle Docker çözümünün Azure Marketplace içerisinde yer almasıyla başlayan container çözümlerinde an itibariyle hem laaS hem de PaaS katmanında çoğu endüstri standardı container çözümnü destekliyor. Sık kullanılan bu çözümleri aşağıdaki şekilde sıralayabiliriz:
- Uygulama servisleri altında Docker Container (Web App for Containers) (PaaS)
- Azure Container Instances (ACI) (PaaS)
- Azure Kubernetes Service (AKS) (PaaS)
- Azure RedHAT OpenShift (ARO) (PaaS)
- Docker Enterprise Engine ya da Edition (Docker EE)
- Azure Service Fabric
- Azure Batch ile Container
Azure Container Instances (ACI), serverless container çözümüdür. Microsoft tarafından birinci parti container çözümü olarak tasarlamıştır. Birkaç adımla kolaylıkla devreye alınabilen ACI çözümü üzerinde basit anlamda test ve geliştirme ortamları ya da küçük çaplı container ihtiyaçlarınızı karşılayabilirsiniz.
ACI çözümü 2018 yılı içerisinde genel kullanıma (generally available (GA)) açılmıştır. ACI üzerinde, sahip olduğunuz bir Docker imajını kolaylıkla çalıştırabilirsiniz. ACI’ın serverless bir çözüm olmasından dolayı altyapıda herhangi bir container host çözümü provizyonlamaya, kompleks ağ tasarımı ve kalıcı depolama sağlama gereksinimleri ile uğraşmadan kolaylıkla devreye alıp kullanmaya başlayabilirsiniz. ACI ile hem Linux hem de Windows container desteklenmektedir.
Azure Kubernetes Service (AKS); container iş yükleri için Kubernetes altyapısını platform servisi (PaaS) olarak sağlayan, yönetilen hizmet çözümüdür. AKS isminden de anlaşıldığı gibi Kubernetes açık kaynak container çözümü üzerine inşa edilmiştir.
AKS sayesinden Kubernetes-tabanlı iş yüklerinin kurulumu, yaygınlaştırılması, yönetimi ve operasyonları çözümün altında sağlanan orkestrasyon katmanı sayesinde tamamen bir yönetilen hizmet olarak sunulmaktadır. Bu da özellikle laaS katmanında çalışan Kubernetes yapılarına göre yönetim ve izleme eforunu çok daha basitleştirmiştir. Kubernetes dünyasında yapının kurulumu ve yönetimi için “düğüm (node)” olarak adlandırılan iki ana bileşen bulunur: Master Node ve Agent Node. Master Node olarak adlandırılan role sahip bileşen tüm Kubernetes küme (cluster) yapısı için kontrol görevini gerçekleştiren ve tüm cluster yapısı ile ilgili yönetimsel görevlerden sorumlu olan roldür. Agent Node ise iş yüklerini çalıştırmaktan sorumlu roldür. AKS sayesinde; Master Node’un görevleri Microsoft bulut servis sağlayıcısı tarafından gerçekleştirilerek yönetilen Kubernetes deneyimi sağlanmaktadır. Böylece müşterilerin sadece kendi uygulamalarının bulunduğu Agent Node yapılarına, yani kendi uygulama tasarımı ve dağıtımına odaklanmaları sağlanmıştır. AKS ile ilgili detayları ilerideki bölümlerde ayrıca ele alacağız.
Uygulama servis planları altında Container Desteği (Web App for Containers) bir platform (PaaS) çözümüdür. Uygulama modernizasyonunda yoğun olarak kullanılan Microsoft App Service çözümünün gücünü ve yeteneklerini kullanarak Windows ve Linux container web uygulamalarınızı kolaylıkla barındırabilirsiniz.
Bu senaryo için en yaygın kullanım örneği olarak docker-tabanlı web uygulamalarını gösterebiliriz. Microsoft App Service çözümü ile sağlanan deployment slot, otomatik yedekleme, otomatik ölçeklenebilme, kod ve sürüm yönetim süreçlerine ilişkin yetenekleri de kullanmış olacaksınız. https://azure . microsoft.com/en-us/services/app-service/containers/adresinden bu modelde kullanıma ilişkin detaylı bilgilere de ulaşabilirsiniz.
Azure Batch çözümü ile yüksek kapasite gerektiren toplu işlem görevlerinin çalıştırılması ve ölçeklenebilmesi sağlanmış olur. Batch görevleri genellikle bir havuz içerisinde toplanmış sanal sunucular üzerinde çalıştırılır. Yakın dönemde gelen destek sayesinde Azure Batch çözümü altında Docker uyumlu container- tabanlı iş yüklerinin çalıştırılması sağlandı.
Docker, Inc. ile ilgili Azure Marketplace içerisinde özellikle ticari ürün kategorisinde çeşitli çözümler ve uygulamalar sunulmaktadır. Bu çözümler Docker Enterprise Engine ya da Edition (Docker EE) etiketi ile listelenmiştir.