Container Nedir? Kubernetes Nedir? Container teknolojisi ile deployment

Insfracture as a service, donanımı sanallaştırarak bilgi işlem kaynaklarını diğer yapılarla paylaşmanıza olanak tanır. Her Sanal Makinenin kendi seçiminiz olan bir işletim sistemi vardır ve belleğe, dosya sistemlerine, ağ arabirimlerine ve fiziksel bilgisayarların sahip olduğu diğer özelliklere erişimle üzerinde uygulamalar oluşturabilir ve çalıştırabilirsiniz. Ancak bu esnekliğin bir bedeli vardır. Böyle bir ortamda, en küçük bilgi işlem birimi, uygulamasıyla birlikte bir Sanal Makinedir. Kurulan işletim sistemi büyük, hatta gigabayt boyutunda olabilir. Başlaması dakikalar alabilir. Genellikle buna değebilir diye düşünebilirsiniz çünkü Sanal Makine, yüksek düzeyde yapılandırılabilir ve istenilen araçlar kurabilir ve çalıştırabilir yapıdadır. Böylece, diskler ve ağ iletişimi gibi temel sistem kaynaklarını yapılandırabilir ve kendi web sunucusu veritabanınızı veya bir orta düzey yazılımı kurabilirsiniz. Şimdi Sanal Makinemizin başarılı olduğunu varsayalım. Talep arttıkça, her biri için bir konuk işletim sistemine sahip bir Sanal Makinenin birimlerinde ölçeklendirmeniz gerekir. Bu, kaynak tüketiminizin istediğinizden daha hızlı arttığı anlamına gelebilir. Tek bir sanal makinede birden çok uygulamanın çalıştırılması da başka bir karmaşık sorun yaratır; bağımlılıkları paylaşan uygulamalar birbirinden izole edilmez, bir uygulamanın kaynak gereksinimleri, ihtiyaç duydukları kaynakların diğer uygulamalarını yok sayabilir. Ayrıca, bir uygulama için güncelleme bağımlılık bakımından diğerinin çalışmayı durdurmasına neden olabilir. Şimdi, bu sorunu sanal makine ile çözmenin yolu, her uygulama için özel bir sanal makine çalıştırmak olabilir. Her uygulama kendi bağımlılıklarını korur ve kernel izole edilir. Yani bir uygulama diğerinin performansını etkilemez. Burada görebileceğiniz gibi, çalışmakta olan kernelin iki tam kopyası ayrı ayrı tutuluyor. Ama burada da muhtemelen düşündüğünüz gibi sorunlarla karşılaşabiliriz. Bu yaklaşımı yüz binlerce uygulamaya ölçeklediğimizde sınırlama problemini hızlı bir şekilde görebilirsiniz. Basit bir çekirdek güncellemesi yapmaya çalıştığınızı hayal edin. Dolayısıyla büyük sistemler için ayrılmış sanal makineler gereksiz tekrara ve israfa neden olur. Bağımlılık sorununu çözmenin daha etkili bir yolu, uygulama ve bağımlılıklar düzeyinde soyutlama uygulamaktır. Makinenin tamamını veya hatta tüm işletim sistemini sanallaştırmanız gerekmez, yalnızca kullanıcı alanını sanallaştırmanız gerekir. Kullanıcı alanı, kernelin üzerinde bulunan ve uygulamaları ve bunların bağımlılıklarını içeren tüm koddur. Container oluşturmak bu demektir. Container’lar, çalışan uygulama kodu başına izole edilmiş kullanıcı alanlarıdır. Container’lar hafiftir çünkü tam bir işletim sistemi taşımazlar, programlanabilirler veya temel sisteme sıkıca paketlenebilirler ki bu çok verimlidir. Çok hızlı bir şekilde oluşturulabilir ve kapatılabilirler çünkü uygulamayı oluşturan süreçleri başlatıp durdurur, sanal makinenin yaptığı gibi tamamını başlatıp her uygulama için bir işletim sistemi başlatmaz.

Container, PaaS ortamında olduğu gibi iş yüklerinin bağımsız ölçeklenebilirliğini ve IaaS ortamında olduğu gibi işletim sistemi ve donanımın soyutlama katmanını sağlamaktadır.
Hypervisor, bir işletim sisteminin bağımlılıklarını, temelindeki donanımla ortadan kaldıran ve birkaç sanal makinenin aynı donanımı paylaşmasına izin veren yazılım katmanıdır. En çok bilineni KVM’dir.

Bir uygulama ve bağımlılıklarına image adı verilir. Container, bir image’in çalışan bir örneğidir. Geliştiriciler, Container image’lerine yazılım oluşturarak üzerinde çalışacağı sistem hakkında endişelenmeden bir uygulamayı kolayca paketleyebilir ve deploy edebilir.
Windows, Linux ve diğer işletim sistemlerinde process çalışan bir programın bir örneği olduğunu unutmayın. Container yeni bir process kadar hızlı başlar. Bunu bir işletim sisteminin tamamen yeni bir process’i başlatmasının ne kadar sürdüğü ile karşılaştırabilirsiniz. Her ana bilgisayarda ihtiyacınız olan şey Container ve Container’ın çalışmasını destekleyen bir işletim sistemidir. Temelde donanım yerine işletim sistemini sanallaştırıyorsunuz. Ortam, PaaS gibi ölçeklenir ancak size insfracture as a service ile neredeyse aynı esnekliği sağlar. Container soyutlama, kodunuzu oldukça portable(taşınabilir) hale getirir. İşletim sistemini ve donanımı black-box olarak değerlendirebilirsiniz. Böylece hiçbir şeyi değiştirmeden veya yeniden oluşturmadan, kodunuzu geliştirmeden staging aşamasına, üretime veya dizüstü bilgisayarınızdan Cloud’a taşıyabilirsiniz. Örneğin bir web sunucusu ölçeklendirmeye gittiyseniz, bunu saniyeler içinde yapabilir ve tek bir ana bilgisayarda iş yükünüzün boyutuna bağlı olarak düzinelerce veya yüzlercesini dağıtabilirsiniz. Bu basit bir örnek. Daha karmaşık bir durumu ele alalım. Uygulamalarınızı, her biri kendi işlevini yerine getiren, örneğin micro-services modelini kullanarak çok sayıda Container kullanarak oluşturmak isteyebilirsiniz. Bu Container’larda çalışan kod birimleri, bir ağ yapısı üzerinden birbirleriyle iletişim kurabilir. Bu şekilde inşa ederseniz uygulamaları modüler hale getirebilirsiniz. Kolayca dağıtılırlar ve bir grup ana bilgisayarda bağımsız olarak ölçeklenirler. Ana bilgisayar(host), ölçeği büyütüp küçültülebilir, uygulama değiştikçe ve hatta ana bilgisayarlar başarısız olduğunda veya değiştirildiğinde Container’ları başlatılıp durdurabilir. Bunu iyi yapmanıza yardımcı olan bir araç Kubernetes’tir. Kubernetes, birçok Container’ı birçok ana bilgisayarda düzenlemeyi kolaylaştırır. Bunları ölçeklendirilebilir, yeni sürümlerini yayınlayabilir ve hatta işler ters giderse eski sürüme geri dönülebilir.
Kubernetes, uygulamalarınızı daha iyi yönetip ölçeklendirebilmenizi sağlayan Container’lar için açık kaynaklı bir düzenleyicidir. Kubernetes yetkili kişilerin birçok yardımcı program aracılığıyla çalışmasını kontrol etmesine olanak tanıyan bir API sunar. Kubernetes’te, bir veya daha fazla container’dan oluşan bir gruba pods adı verilir. Bir pods’daki container’lar birlikte konuşlandırılır. Grup olarak başlatılır, durdurulur ve çoğaltılır. Kubernetes’in dağıtabileceği en basit iş yükü, yalnızca tek bir container’dan oluşan bir pods’tur. Kubernetes cluster, Kubernetes’in pods’lardaki container’ları planlayabildiği bir makine grubudur. GKE(Google Kubernetes Engine)’yi kullandığınızda, hizmeti sizin için bir Kubernetes sistemini somutlaştırmaya yönlendirerek başlarsınız. Bu sistem cluster olarak adlandırılır. Container’larınızı bir GKE cluster’ının içinde barındıran sanal makinelere node adı verilir.
Container’a alınmış uygulamaların deployment scaling, load balancing, logging, monitoring ve diğer yönetim özelliklerini otomatikleştirir. Bunlar, tipik bir PaaS çözümünün karakteristik özellikleridir. Kubernetes ayrıca, çok çeşitli kullanıcı tercihlerine ve yapılandırma esnekliğine izin verme gibi IaaS’nin özelliklerine de olanak tanır.

Kubernetes’in, oluşturmasını ve sürdürmesini istediğiniz nesneleri manifest dosyalarıyla(üste örneğini görebilirsiniz) tanımlarsınız. Bunlar sıradan text dosyalarıdır. Bunları YAML veya JSON formatında yazabilirsiniz. YAML daha kolay okunabilir ve düzenlemek için daha az yorucudur. YAML dosyası, bir pod için istenen durumu, adını ve çalıştırılması için belirli bir container image’i tanımlar. Manifest dosyalarınızda bazı zorunlu alanlar da vardır. Deployment, özellikle onları bir grup olarak yönetmek istediğimizde, web sunucuları gibi uzun ömürlü yazılım bileşenleri için mükemmel bir seçimdir. kube-scheduler, bir deployment için podsları programlarken, kube-IP sunucusunu bilgilendirir. Bu değişiklikler, deployment denetleyicisi(controller) tarafından sürekli olarak izlenir. Deployment denetleyicisi podsları izleyecek ve bakımını yapacaktır. Bu podslardan biri başarısız olursa, deployment denetleyicisi mevcut durum ile istenen durum arasındaki farkı tanıyacak ve bunun sonucunda yeni bir pods başlatarak bunu düzeltmeye çalışacağız. Mevcut durum ile istenen durumu karşılaştırıp farkı bulurken daha önce tanımladığımız YAML dosyasını kullanacak. Bu YAML dosyasında nesneler tanımlarken, kaç replica pod istediğinizi, podsların nasıl çalışacağını, bu podslarda hangi containerların çalıştırılması gerektiğini ve hangi birimlerin bağlanması gerektiğini belirtirsiniz. Bu şablonlara bağlı olarak, denetleyiciler(controller) bir cluster içinde podsların istenen durumunu korumaya çalışır.
kube-API server’ın görevi, podsları başlatma dahil olmak üzere clusterın durumunu görüntüleyen veya değiştiren komutları kabul etmektir. Bu komutları kubectl komutu ile gerçekleştirir. kubectl, kube-API sunucusuna bağlanır ve Kubernetes API kullanarak onunla iletişim kurar. Kube-API sunucusu ayrıca gelen yetkilendirilmiş istekleri doğrular, geçersiz olup olmadığını belirler ve kabul kontrolünü yönetir. Ancak kube-API server ile konuşan sadece kubectl değildir. Aslında, cluster durumundaki herhangi bir sorgu veya değişiklik, kube-API sunucusuna yönlendirilmelidir. Etcd, clusterın veritabanıdır. Görevi, clusterın durumunu güvenilir bir şekilde depolamaktır. Bu, tüm cluster yapılandırma verilerini ve hangi nodeların clusterın parçası olduğu, hangi podsların çalıştırılması gerektiği ve nerede çalıştırılmaları gerektiği gibi daha dinamik bilgileri içerir. Etcd ile asla doğrudan etkileşimde bulunmazsınız. Bunun yerine, kube-API server, sistemin geri kalanı adına veritabanıyla etkileşime girer. Kube proxy ise bir clusterdaki podslar arasındaki ağ bağlantısını sürdürmeyi sağlar.