Günümüz teknoloji çağında, özellikle büyük ölçekli firmalar için uygulamaları cloud ortamında host etmenin ne kadar da önemli olduğunu hepimiz biliyoruz. Bir çok anket verilerine göre de, özellikle geçtiğimiz 2 yıl içerisinde hem public hem de private cloud kullanım oranları oldukça artmış durumda.
Başlıca birkaç sebebi ise, aşağıdaki gibi sıralayabiliriz:
REF: https://vmokshagroup.com/wp-content/uploads/2015/08/Save-money-date-and-time-using-cloud.png
Durum böyle olunca, yeni geliştirdiğimiz uygulamaların olabildiğince containerize edilmiş cloud-native uygulamaları olmasına gayret gösteriyoruz. Kubernetes gibi container-orchestration platform’ları ile de, uygulamaların yönetim işlemlerini gerçekleştiriyoruz.
.NET Core ile yeni geliştirdiğimiz uygulamalar için kubernetes gibi platform’lara migration işlemleri kolaylıkla yapılabiliyorken, bu süreç .NET Framework ile geliştirilmiş olan mevcut uygulamalar için biraz daha zorlu olabiliyor.
Genelde uygulamaların öncelikle .NET Core‘a transformation işlemi oldukça tercih edilen bir seçenek olabiliyorken, bazen de zaman ve maliyetler göz önünde alındığında maalesef bir seçenek olamıyor.
Bu makale kapsamında ise mevcut .NET Framework uygulamalarımızı, redesign/redevelopment yapmadan nasıl containerize edilmiş bir şekilde Azure Kubernetes Service üzerinde host edebiliz konusuna değinmek istiyorum.
Azure Kubernetes Service üzerinde mevcut .NET Framework uygulamalarını, .NET Core’a port etmeden windows container’lar oluşturarak host edebilmek mümkün.
Sadece .NET Core‘a oranla base image size’ı, container içerisinde Windows Server Core image’i kullanıldığı için oldukça büyük durumda. Neyseki 2019 yılı sonlarında ise bu image size’ı, %40 gibi ciddi bir oranda daha küçük bir hale getirildi. Bu konu hakkındaki detaylı bilgiye, buradan erişebilirsiniz.
Öncelikle AKS üzerinde Windows Server container’lar oluşturabilmek ve kullanabilmek için, “aks-preview CLI” extension’ının ve “WindowsPreview” feature’ının etkinleştirilmesi gerekiyor.
Bu feature ile node pool içerisine, windows server node’lar ekleyebileceğiz.
Bunun için buraya tıklayarak, “Install aks-preview CLI extension” ve “Register Windows preview feature” başlıkları altındaki işlemleri gerçekleştirelim.
NOT: Azure subscription’ının içerisinde “WindowsPreview” feature’ının etkinleştirilmesi, birkaç dakika sürebilir.
Extension ve feature’ın etkinleştirme işleminden sonra, aşağıdaki gibi bir resource group oluşturarak içerisinde AKS cluster oluşturma işlemine CLI yardımıyla başlayabiliriz.
NOT: Öncesinde CLI üzerinden ilgili Azure subscription’a login olmayı unutmayın.
az group create -n my-aks-rg -l westeurope
az aks create \ --kubernetes-version 1.14.7 \ --resource-group my-aks-rg \ --name my-test-aks \ --node-vm-size Standard_D2_v2 \ --node-count 1 \ --max-pods=250 \ --location westeurope \ --generate-ssh-keys \ --windows-admin-username testadmin \ --windows-admin-password P@ssw0rd1234 \ --vm-set-type VirtualMachineScaleSets \ --network-plugin azure
AKS cluster oluşturma işlemi başarıyla tamamlandıktan sonra, aşağıdaki gibi bir response görüyor olmalıyız.
Şimdi oluşturduğumuz cluster içerisine windows node ekleyebilmek için, aşağıdaki komut satırını çalıştırmamız gerekmektedir.
az aks nodepool add --resource-group my-aks-rg \ --cluster-name my-test-aks \ --os-type Windows --name npool2 \ --node-vm-size Standard_D2_v2 \ --node-count 1 \ --kubernetes-version 1.14.7
Windows node ekleme işlemi tamamlandıktan sonra, cluster’a bağlanabilmemiz için aşağıdaki gibi kubectl’i configure edelim.
az aks get-credentials --resource-group my-aks-rg --name my-test-aks
Ardından eklemiş olduğumuz node’ları “OS” label’ı ile görebilmek için ise, aşağıdaki komut satırını kullanalım.
kubectl get nodes --label-columns beta.kubernetes.io/os
Yukarıdaki resimde de gördüğümüz gibi, windows node başarıyla eklenmiş durumda. Böylece windows node’lu AKS cluster oluşturma işlemini tamamlamış olduk.
Ben örnek amaçlı “MyOldTodoAPP” adında basit bir ASP.NET Framework Web Application(4.8) projesi oluşturacağım. Dilerseniz siz mevcut .NET Framework uygulamalarınızı kullanabilirsiniz.
Uygulamayı dockerize etmeden önce, build ve publish işlemlerini aşağıdaki gibi container dışında gerçekleştirelim.
Container dışarısında build işlemi, windows container case’i için daha doğru bir tercih olacaktır.
Publish işleminden sonra, ilgili publish folder’ı altında aşağıdaki gibi bir “Dockerfile” oluşturalım.
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-20191210-windowsservercore-ltsc2019 COPY . /inetpub/wwwroot
Burada dikkat etmemiz gereken tek nokta, kullanacak olduğumuz base image OS versiyonunun, host OS versiyonu ile uyumlu olmasıdır. Detaylı bilgiye ise, buradan erişebilirsiniz.
Windows node’un OS versiyonuna ise, Azure portal’dan veya aşağıdaki komut satırı üzerinden erişilebilmektedir.
kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME aks-nodepool1-42915174-vmss000000 Ready agent 3d11h v1.14.7 10.240.0.4 Ubuntu 16.04.6 LTS 4.15.0-1066-azure docker://3.0.8 aksnpool2000000 Ready agent 2d12h v1.14.7 10.240.0.255 Windows Server 2019 Datacenter 10.0.17763.737 docker://19.3.2
Bu base image ile, “.NET Framework Web“, “MVC“, “Web API” ve “SignalR” uygulamaları container içerisinde çalıştırılabilmekte.
Ayrıca “ASPNET” base image’i içerisinde IIS process’i “entrypoint” olarak configure edildiği için, dockerfile içerisinde bir entrypoint configure etmedik.
Şimdi uygulamayı dockerize etmeye başlayabiliriz. Bunun için, ilgili publish folder path’ine girerek, CLI üzerinden aşağıdaki komutu çalıştıralım.
docker build -t my-existing-app .
AKS‘e deploy etmeden önce her şeyin doğru gittiğinden emin olabilmek için, dockerize ettiğimiz uygulamayı “8080” port’u üzerinden aşağıdaki gibi çalıştırıp test edelim.
docker run -d -p 8080:80 my-existing-app
Her şey yolunda gitti ise, aşağıdaki gibi default ASP.NET response’unu görüyor olmalıyız.
Şimdi container’ı aşağıdaki gibi tag’leyip, ardından container registry’e gönderelim.
Oluşturmuş olduğumuz container’ı AKS‘e deploy edebilmek için, aşağıdaki gibi “deploy-to-aks” adında bir “yaml” file’ı oluşturalım.
apiVersion: apps/v1 kind: Deployment metadata: name: sample labels: app: sample spec: replicas: 1 template: metadata: name: sample labels: app: sample spec: nodeSelector: "beta.kubernetes.io/os": windows containers: - name: my-app image: mytestaksregistry.azurecr.io/my-existing-app:1.0 resources: limits: cpu: 1 memory: 800M requests: cpu: .1 memory: 300M ports: - containerPort: 80 selector: matchLabels: app: sample --- apiVersion: v1 kind: Service metadata: name: sample spec: type: LoadBalancer ports: - protocol: TCP port: 80 selector: app: sample
Burada önemli olan nokta ise “spec” altındaki “nodeSelector” değerinin, “windows” olarak set edilmiş olmasıdır. Böylece container, windows olan node pool içerisinde çalıştırılacaktır. Ayrıca “containers” altındaki “image” değerini de, tag’lediğimiz container değeri ile güncellemeyi unutmayalım.
Şimdi oluşturmuş olduğumuz bu yaml file’ını, CLI üzerinden aşağıdaki gibi execute edelim ve deployment işlemini başlatalım.
kubectl apply -f deploy-to-aks.yaml
Ardından aşağıdaki komut ile de ilgili pod’un, “Running” durumuna gelmesini bekleyelim. AKS ilgili container image’ini ilk kez çekeceği ve ilgili image size’ı biraz büyük olduğu için, bu işlem birkaç dakika sürebilir.
kubectl get pods -w
Container “Running” status’üne geçtikten sonra ise, container’ın expose olduğu load-balancer IP adresini de aşağıdaki komut vasıtasıyla alıp, browser vasıtasıyla test edelim.
kubectl get svc
Gördüğümüz gibi external IP adresi üzerinden başarıyla containerize ettiğimiz .NET Framework uygulamasına AKS üzerinden erişebildik.
Windows node özelliği AKS için her ne kadar şimdilik preview olsa da, sanırım önümüzdeki birkaç ay içerisinde global available hale getirilmesi bekleniyor. Ayrıca kısmi de olsa, Microsoft tarafından müşteri desteği de verilmektedir. Bence, eski uygulamalarımızı herhangi bir ekstra efor sarfetmeden containerize edebilmek için harika bir seçenek.
https://docs.microsoft.com/en-us/azure/aks/windows-container-cli?WT.mc_id=AZ-MVP-5003382
https://docs.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc?WT.mc_id=AZ-MVP-5003382
{:tr} Makalenin ilk bölümünde, Software Supply Chain güvenliğinin öneminden ve containerized uygulamaların güvenlik risklerini azaltabilmek…
{:tr}Bildiğimiz gibi modern yazılım geliştirme ortamında containerization'ın benimsenmesi, uygulamaların oluşturulma ve dağıtılma şekillerini oldukça değiştirdi.…
{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…
{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…
{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…
{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…
View Comments
Thanks Gökhan nice job ;)
Thanks :)