Kapsayıcılardan ve düzenleyicilerden yararlanma
İpucu
Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Azure için Buluta Özel .NET Uygulamaları Tasarlama adlı e-Kitap'tan bir alıntıdır.
Kapsayıcılar ve düzenleyiciler, monolitik dağıtım yaklaşımlarında yaygın olarak karşılaşılan sorunları çözmek için tasarlanmıştır.
Monolitik dağıtımlarla ilgili zorluklar
Geleneksel olarak çoğu uygulama tek bir birim olarak dağıtılır. Bu tür uygulamalar monolit olarak adlandırılır. Uygulamaları birden çok modülden veya derlemeden oluşsa bile tek birim olarak dağıtmaya yönelik bu genel yaklaşım, Şekil 3-1'de gösterildiği gibi monolitik mimari olarak bilinir.
Şekil 3-1. Monolitik mimari.
Basitlik avantajına sahip olsalar da, monolitik mimariler birçok zorlukla karşı karşıya kalır:
Dağıtım
Ayrıca, uygulamanın yeniden başlatılmasını gerektirir ve bu da dağıtım sırasında sıfır kapalı kalma teknikleri uygulanmazsa kullanılabilirliği geçici olarak etkileyebilir.
Ölçeklendirme
Monolitik bir uygulama, genellikle yüksek özellikli donanım gerektiren tek bir makine örneğinde tamamen barındırılır. Monolitenin herhangi bir parçası ölçeklendirme gerektiriyorsa, uygulamanın tamamının başka bir kopyası başka bir makineye dağıtılmalıdır. Monolit ile uygulama bileşenlerini tek tek ölçeklendiremezsiniz; hepsi veya hiç bir şey. Ölçeklendirme gerektirmeyen ölçeklendirme bileşenleri verimsiz ve maliyetli kaynak kullanımına neden olur.
Ortam
Monolitik uygulamalar genellikle önceden yüklenmiş işletim sistemi, çalışma zamanı ve kitaplık bağımlılıkları olan bir barındırma ortamına dağıtılır. Bu ortam, uygulamanın geliştirildiği veya test edildiği ortamla eşleşmeyebilir. Uygulama ortamlarındaki tutarsızlıklar, monolitik dağıtımlar için yaygın bir sorun kaynağıdır.
Kaplin
Monolitik bir uygulama, işlevsel bileşenleri arasında büyük olasılıkla yüksek bağlantı deneyimi yaşar. Sabit sınırlar olmadan, sistem değişiklikleri genellikle istenmeyen ve maliyetli yan etkilere neden olur. Yeni özellikler/düzeltmeler karmaşık, zaman alan ve uygulanması pahalı hale gelir. Güncelleştirmeler kapsamlı test gerektirir. Eşleştirme, bileşenleri yeniden düzenlemeyi veya alternatif uygulamalarda değiştirme işlemini de zorlaştırır. Katı bir endişe ayrımı ile inşa edildiğinde bile, monolitik kod tabanı olarak mimari erozyon kümeleri, hiç bitmeyen "özel durumlar" ile bozulur.
Platform kilidi
Tek bir teknoloji yığını ile monolitik bir uygulama oluşturulur. Tekdüzenlik sunarken, bu taahhüt yeniliklere engel olabilir. Yeni özellikler ve bileşenler, daha modern teknolojiler daha iyi bir seçim olsa bile uygulamanın geçerli yığını kullanılarak derlenecektir. Teknoloji yığınınızın eski ve eski olması uzun vadeli bir risktir. Bir uygulamanın tamamını yeni, daha modern bir platforma yeniden oluşturmak en pahalı ve risklidir.
Kapsayıcıların ve düzenleyicilerin avantajları nelerdir?
1. Bölüm'de kapsayıcılar kullanıma sunulmuştur. Cloud Native Computing Foundation'ın (CNCF), buluta özel yolculuğuna başlayan kuruluşlara yönelik rehberlik olan Buluta Özel Patika Haritası'nda kapsayıcılamanın ilk adım olarak nasıl sıralandığına dikkat ettik. Bu bölümde kapsayıcıların avantajları ele alınıyor.
Docker en popüler kapsayıcı yönetimi platformudur. Hem Linux hem de Windows üzerindeki kapsayıcılarla çalışır. Kapsayıcılar, herhangi bir sistemde aynı şekilde çalışan ayrı ama yeniden üretilebilir uygulama ortamları sağlar. Bu özellik, buluta özel hizmetler geliştirmek ve barındırmak için onları mükemmel hale getirir. Kapsayıcılar birbirinden yalıtılır. Aynı konak donanımındaki iki kapsayıcı, çakışmalara neden olmadan farklı yazılım sürümlerine sahip olabilir.
Kapsayıcılar, proje yapıtları haline gelen basit metin tabanlı dosyalar tarafından tanımlanır ve kaynak denetiminde denetlenir. Tam sunucuların ve sanal makinelerin güncelleştirilmek için el ile çalışması gerekse de kapsayıcılar kolayca sürüm denetimine sahip olur. Kapsayıcılarda çalıştırılacak şekilde derlenen uygulamalar, derleme işlem hattının bir parçası olarak otomatik araçlar kullanılarak geliştirilebilir, test edilebilir ve dağıtılabilir.
Kapsayıcılar sabittir. Kapsayıcıyı tanımladıktan sonra yeniden oluşturabilir ve aynı şekilde çalıştırabilirsiniz. Bu değişmezlik, bileşen tabanlı tasarıma kendini ödünç verir. Bir uygulamanın bazı bölümleri diğerlerinden farklı bir şekilde gelişiyorsa, en sık değişen bölümleri dağıtabiliyorken neden uygulamanın tamamını yeniden dağıtasınız? Bir uygulamanın farklı özellikleri ve çapraz kesme endişeleri ayrı birimlere ayrılabilir. Şekil 3-2'de, monolitik bir uygulamanın belirli özellikleri veya işlevleri temsilci olarak vererek kapsayıcılardan ve mikro hizmetlerden nasıl yararlanabileceği gösterilmektedir. Uygulamanın kendisinde kalan işlevsellik de kapsayıcılı hale getirilmiştir.
Şekil 3-2. Mikro hizmetleri benimsemek için monolitik bir uygulamayı ayrıştırma.
Her buluta özel hizmet ayrı bir kapsayıcıda oluşturulur ve dağıtılır. Her biri gerektiğinde güncelleştirilebilir. Tek tek hizmetler, her hizmete uygun kaynaklara sahip düğümlerde barındırılabilir. Her hizmetin çalıştığı ortam sabittir, geliştirme, test ve üretim ortamlarında paylaşılır ve kolayca sürüm oluşturulur. Uygulamanın farklı alanları arasında bağlantı, monolit içindeki derleme zamanı bağımlılıkları değil, hizmetler arasında çağrılar veya iletiler olarak açıkça gerçekleşir. Ayrıca, uygulamanın geri kalanında değişiklik yapmanıza gerek kalmadan belirli bir özelliği en iyi şekilde paketleyen teknolojiyi de seçebilirsiniz.
Kapsayıcılı hizmetler otomatik yönetim gerektirir. Bağımsız olarak dağıtılan büyük bir kapsayıcı kümesini el ile yönetmek mümkün olmaz. Örneğin, aşağıdaki görevleri göz önünde bulundurun:
- Kapsayıcı örnekleri birçok makineden oluşan bir kümede nasıl sağlanacak?
- Dağıtıldıktan sonra kapsayıcılar birbirlerini nasıl keşfedecek ve iletişim kuracak?
- Kapsayıcılar isteğe bağlı olarak nasıl ölçeklendirilebilir veya ölçeklendirilebilir?
- Her kapsayıcının durumunu nasıl izlersiniz?
- Kapsayıcıyı donanım ve yazılım hatalarına karşı nasıl korursunuz?
- Dinamik bir uygulama için kapsayıcıları sıfır kapalı kalma süresiyle nasıl yükseltirsiniz?
Kapsayıcı düzenleyicileri bu ve diğer sorunları ele alır ve otomatikleştirir.
Buluta özel eko-sistemde Kubernetes, de facto kapsayıcı düzenleyicisi haline gelmiştir. Cloud Native Computing Foundation (CNCF) tarafından yönetilen açık kaynaklı bir platform. Kubernetes, bir makine kümesi genelinde kapsayıcılı iş yüklerinin dağıtım, ölçeklendirme ve operasyonel sorunlarını otomatikleştirir. Ancak Kubernetes'i yüklemek ve yönetmek oldukça karmaşıktır.
Kubernetes'i bir bulut satıcısının yönetilen hizmeti olarak kullanmak çok daha iyi bir yaklaşımdır. Azure bulutu, Azure Kubernetes Service (AKS) adlı tam olarak yönetilen bir Kubernetes platformuna sahiptir. AKS, Kubernetes yönetiminin karmaşıklığını ve operasyonel yükünü özetler. Kubernetes'i bulut hizmeti olarak tüketirsiniz; Microsoft, yönetim ve destek sorumluluğunu üstlenir. AKS ayrıca diğer Azure hizmetleri ve geliştirme araçlarıyla sıkı bir şekilde tümleştirilir.
AKS, küme tabanlı bir teknolojidir. Federasyon sanal makinelerinden veya düğümlerden oluşan bir havuz Azure buluta dağıtılır. Birlikte yüksek oranda kullanılabilir bir ortam veya küme oluştururlar. Küme, buluta özel uygulamanızda sorunsuz ve tek bir varlık olarak görünür. Arka planda AKS, yükü eşit olarak dağıtan önceden tanımlanmış bir stratejiyi izleyerek kapsayıcılı hizmetlerinizi bu düğümler arasında dağıtır.
Ölçeklendirme avantajları nelerdir?
Kapsayıcılar üzerinde oluşturulan hizmetler, Kubernetes gibi düzenleme araçları tarafından sağlanan ölçeklendirme avantajlarından yararlanabilir. Tasarım kapsayıcıları yalnızca kendileri hakkında bilgi edinir. Birlikte çalışması gereken birden çok kapsayıcınız olduğunda, bunları daha yüksek bir düzeyde düzenlemeniz gerekir. Çok sayıda kapsayıcıyı ve ağ yapılandırması gibi paylaşılan bağımlılıklarını düzenlemek, düzenleme araçlarının günü kaydetmeye geldiği yerdir! Kubernetes, kapsayıcı grupları üzerinde bir soyutlama katmanı oluşturur ve bunları podlar halinde düzenler. Podlar düğüm olarak adlandırılan çalışan makinelerinde çalışır. Bu düzenli yapı küme olarak adlandırılır. Şekil 3-3'de Kubernetes kümesinin farklı bileşenleri gösterilmektedir.
Şekil 3-3. Kubernetes küme bileşenleri.
Kapsayıcılı iş yüklerini ölçeklendirme, kapsayıcı düzenleyicilerinin önemli bir özelliğidir. AKS iki boyutta otomatik ölçeklendirmeyi destekler: Kapsayıcı örnekleri ve işlem düğümleri. Birlikte AKS'ye talepteki ani artışlara hızlı ve verimli bir şekilde yanıt verme ve ek kaynaklar ekleme olanağı sağlar. Bu bölümün devamında AKS'de ölçeklendirmeyi ele alacağız.
Bildirim temelli ve kesinlik temelli karşılaştırması
Kubernetes hem bildirim temelli hem de kesinlik temelli yapılandırmayı destekler. Kesinlik temelli yaklaşım, Kubernetes'e her adımda ne yapması gerektiğini belirten çeşitli komutları çalıştırmayı içerir. Bu görüntüyü çalıştırın. Bu podu silin. Bu bağlantı noktasını kullanıma sunma. Bildirim temelli yaklaşımla, ne yapmak yerine ne istediğinizi açıklamak için bildirim olarak adlandırılan bir yapılandırma dosyası oluşturursunuz. Kubernetes bildirimi okur ve istediğiniz bitiş durumunu gerçek bitiş durumuna dönüştürür.
Kesinlik temelli komutlar, öğrenme ve etkileşimli denemeler için harikadır. Ancak, güvenilir ve tekrarlanabilir dağıtımlar sağlayan bir kod yaklaşımı olarak altyapıyı benimsemek için bildirim temelli olarak Kubernetes bildirim dosyaları oluşturmak isteyeceksiniz. Bildirim dosyası bir proje yapıtı haline gelir ve Kubernetes dağıtımlarını otomatikleştirmek için CI/CD işlem hattınızda kullanılır.
Kümenizi kesinlik temelli komutları kullanarak zaten yapılandırdıysanız, kullanarak kubectl get svc SERVICENAME -o yaml > service.yaml
bildirim temelli bir bildirimi dışarı aktarabilirsiniz. Bu komut aşağıda gösterilene benzer bir bildirim oluşturur:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2019-09-13T13:58:47Z"
labels:
component: apiserver
provider: kubernetes
name: kubernetes
namespace: default
resourceVersion: "153"
selfLink: /api/v1/namespaces/default/services/kubernetes
uid: 9b1fac62-d62e-11e9-8968-00155d38010d
spec:
clusterIP: 10.96.0.1
ports:
- name: https
port: 443
protocol: TCP
targetPort: 6443
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
Bildirim temelli yapılandırmayı kullanırken, yapılandırma dosyalarınızın bulunduğu klasörde kullanarak kubectl diff -f FOLDERNAME
bunları işlemeden önce yapılacak değişikliklerin önizlemesini görebilirsiniz. Değişiklikleri uygulamak istediğinizden emin olduktan sonra komutunu çalıştırın kubectl apply -f FOLDERNAME
. Klasör hiyerarşisini yinelemeli olarak işlemek için ekleyin -R
.
Bildirim temelli yapılandırmayı, biri dağıtım olan diğer Kubernetes özellikleriyle de kullanabilirsiniz. Bildirim temelli dağıtımlar yayınların, güncelleştirmelerin ve ölçeklendirmenin yönetilmesine yardımcı olur. Kubernetes dağıtım denetleyicisine yeni değişikliklerin nasıl dağıtılacağı, yükün ölçeğinin nasıl genişletılacağı veya önceki bir düzeltmeye nasıl geri döndürülecekleri hakkında bilgilendirilir. Bir küme kararsızsa bildirim temelli bir dağıtım otomatik olarak kümeyi istenen duruma geri döndürür. Örneğin, bir düğümün kilitlenmesi gerekiyorsa, dağıtım mekanizması istediğiniz duruma ulaşmak için bir değişikliği yeniden dağıtacaktır
Bildirim temelli yapılandırmanın kullanılması, altyapının uygulama koduyla birlikte iade edilebilen ve sürüm oluşturulabilen kod olarak temsil edilmesini sağlar. Derleme ve dağıtım işlem hattı kullanarak sürekli dağıtım için gelişmiş değişiklik denetimi ve daha iyi destek sağlar.
Kapsayıcılar ve düzenleyiciler için hangi senaryolar idealdir?
Aşağıdaki senaryolar kapsayıcıları ve düzenleyicileri kullanmak için idealdir.
Yüksek çalışma süresi ve ölçeklenebilirlik gerektiren uygulamalar
Yüksek çalışma süresi ve ölçeklenebilirlik gereksinimlerine sahip tek tek uygulamalar, mikro hizmetleri, kapsayıcıları ve düzenleyicileri kullanan buluta özel mimariler için ideal adaylardır. Bunlar kapsayıcılarda geliştirilebilir, sürümlenmiş ortamlarda test edilebilir ve sıfır kapalı kalma süresiyle üretime dağıtılabilir. Kubernetes kümelerinin kullanılması, bu tür uygulamaların isteğe bağlı olarak ölçeklendirilebilmesini ve düğüm hatalarından otomatik olarak kurtarılmasını sağlar.
Çok sayıda uygulama
Çok sayıda uygulamayı dağıtan ve koruyan kuruluşlar kapsayıcılardan ve düzenleyicilerden yararlanır. Kapsayıcılı ortamları ve Kubernetes kümelerini ayarlamanın ön çabası öncelikli olarak sabit bir maliyettir. Tek tek uygulamaları dağıtma, koruma ve güncelleştirmenin, uygulama sayısına göre değişen bir maliyeti vardır. Birkaç uygulamanın ötesinde, özel uygulamaları el ile tutmanın karmaşıklığı, kapsayıcıları ve düzenleyicileri kullanarak çözüm uygulama maliyetini aşıyor.
Kapsayıcıları ve düzenleyicileri kullanmaktan ne zaman kaçınmalısınız?
Uygulamanızı Twelve-Factor App ilkelerine göre oluşturamıyorsanız kapsayıcılardan ve düzenleyicilerden kaçınmayı göz önünde bulundurmanız gerekir. Bu gibi durumlarda, VM tabanlı bir barındırma platformu veya muhtemelen bir karma sistem düşünün. Bununla, belirli işlev parçalarını her zaman ayrı kapsayıcılara ve hatta sunucusuz işlevlere dönüştürebilirsiniz.
Geliştirme kaynakları
Bu bölümde, bir sonraki uygulamanız için kapsayıcıları ve düzenleyicileri kullanmaya başlamanıza yardımcı olabilecek geliştirme kaynaklarının kısa bir listesi gösterilir. Buluta özel mikro hizmetler mimari uygulamanızı tasarlama hakkında yönergeler arıyorsanız bu kitabın eşlikçisi olan .NET Microservices: Architecture for Containerized .NET Applications(Kapsayıcılı .NET Uygulamaları için Mimari) kitabını okuyun.
Yerel Kubernetes Geliştirme
Kubernetes dağıtımları üretim ortamlarında büyük değer sağlar, ancak geliştirme makinenizde yerel olarak da çalıştırılabilir. Tek tek mikro hizmetler üzerinde bağımsız olarak çalışabilirsiniz, ancak bazen sistemin tamamını yerel olarak çalıştırmanız gerekebilir; aynı üretim ortamına dağıtıldığında çalıştırılacağı gibi. Yardımcı olabilecek çeşitli araçlar vardır: Minikube ve Docker Desktop. Visual Studio ayrıca Docker geliştirme için araçlar sağlar.
Minikube
Minikube nedir? Minikube projesinde "Minikube macOS, Linux ve Windows üzerinde yerel bir Kubernetes kümesi uygular" ifadesi yer alır. Birincil hedefleri "yerel Kubernetes uygulama geliştirme için en iyi araç olmak ve uygun tüm Kubernetes özelliklerini desteklemektir." Minikube'un yüklenmesi Docker'dan ayrıdır ancak Minikube, Docker Desktop'ın desteklediğinden farklı hiper yöneticileri destekler. Aşağıdaki Kubernetes özellikleri şu anda Minikube tarafından desteklenmektedir:
- DNS
- NodePorts
- Yapılandırma Haritalar ve gizli diziler
- Panolar
- Kapsayıcı çalışma zamanları: Docker, rkt, CRI-O ve kapsayıcılı
- Kapsayıcı Ağ Arabirimini Etkinleştirme (CNI)
- Giriş
Minikube'u yükledikten sonra, görüntüyü indiren ve yerel Kubernetes kümesini başlatan komutunu çalıştırarak minikube start
kullanmaya hızlı bir şekilde başlayabilirsiniz. Küme başlatıldıktan sonra, standart Kubernetes kubectl
komutlarını kullanarak kümeyle etkileşim kurarsınız.
Docker Desktop
Kubernetes ile doğrudan Windows üzerinde Docker Desktop'tan da çalışabilirsiniz. Windows Kapsayıcıları kullanıyorsanız tek seçeneğinizdir ve Windows dışı kapsayıcılar için de harika bir seçimdir. Şekil 3-4'de Docker Desktop çalıştırılırken yerel Kubernetes desteğinin nasıl etkinleştirileceği gösterilmektedir.
Şekil 3-4. Docker Desktop'ta Kubernetes'i yapılandırma.
Docker Desktop, kapsayıcılı uygulamaları yerel olarak yapılandırmaya ve çalıştırmaya yönelik en popüler araçtır. Docker Desktop ile çalışırken, üretim ortamına dağıttığınız Docker kapsayıcı görüntülerinin aynısını yerel olarak geliştirebilirsiniz. Docker Desktop, kapsayıcılı uygulamaları yerel olarak "derlemek, test etmek ve göndermek" için tasarlanmıştır. Hem Linux hem de Windows kapsayıcılarını destekler. Görüntülerinizi Azure Container Registry veya Docker Hub gibi bir görüntü kayıt defterine gönderdiğinizde AKS bunları çekip üretime dağıtabilir.
Visual Studio Docker Araçları
Visual Studio, web tabanlı uygulamalar için Docker geliştirmesini destekler. Yeni bir ASP.NET Core uygulaması oluşturduğunuzda, Şekil 3-5'te gösterildiği gibi docker desteğiyle yapılandırma seçeneğiniz vardır.
Şekil 3-5. Visual Studio Docker Desteğini Etkinleştirme
Bu seçenek belirlendiğinde, proje, uygulamayı bir Docker kapsayıcısında derlemek ve barındırmak için kullanılabilen kökünde bir ile Dockerfile
oluşturulur. Şekil 3-6'da örnek bir Dockerfile gösterilmiştir.
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["eShopWeb/eShopWeb.csproj", "eShopWeb/"]
RUN dotnet restore "eShopWeb/eShopWeb.csproj"
COPY . .
WORKDIR "/src/eShopWeb"
RUN dotnet build "eShopWeb.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "eShopWeb.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "eShopWeb.dll"]
Şekil 3-6. Visual Studio tarafından oluşturulan Dockerfile
Destek eklendikten sonra uygulamanızı Visual Studio'daki bir Docker kapsayıcısında çalıştırabilirsiniz. Şekil 3-7'de Docker desteği eklenerek oluşturulan yeni bir ASP.NET Core projesinde kullanılabilen farklı çalıştırma seçenekleri gösterilmektedir.
Şekil 3-7. Visual Studio Docker Çalıştırma Seçenekleri
Ayrıca, mevcut bir ASP.NET Core uygulamasına istediğiniz zaman Docker desteği ekleyebilirsiniz. Visual Studio Çözüm Gezgini, Şekil 3-8'de gösterildiği gibi projeye sağ tıklayın ve Docker Desteği Ekle'yi>seçin.
Şekil 3-8. Visual Studio'ya Docker desteği ekleme
Visual Studio Code Docker Araçları
Visual Studio Code için Docker geliştirmeyi destekleyen birçok uzantı vardır.
Microsoft, Visual Studio Code için Docker uzantısını sağlar. Bu uzantı, uygulamalara kapsayıcı desteği ekleme işlemini basitleştirir. Gerekli dosyaları iskeleler, Docker görüntüleri oluşturur ve bir kapsayıcı içinde uygulamanızda hata ayıklamanıza olanak tanır. Uzantı, kapsayıcılar ve görüntüler üzerinde başlatma, durdurma, inceleme, kaldırma ve daha fazlası gibi eylemler gerçekleştirmeyi kolaylaştıran bir görsel gezgini içerir. Uzantı ayrıca Docker Compose'u da destekler ve birden çok çalışan kapsayıcıyı tek bir birim olarak yönetmenizi sağlar.