Mevcut .NET Uygulamalarını Azure Kubernetes Service’e Migrate Etmek

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:

  • Düşük maliyet: doğru seçimler ile IT ve operasyon maliyetleri oldukça azaltılabilmekte.
  • Ölçeklenebilirlik: belki de en önemli sebeplerden birisi. Kolaylıkla mevcut resource’lar genişletilebilmekte.
  • Esneklik/Yüksek Erişilebilirlik: cloud’a geçiş ile birlikte, hata durumlarına karşı satın alınan ekstra donanım gereksinimleri de ortadan kaldırılabilmekte.


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.

Peki, ya mevcut uygulamalar?

.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.

.NET Framework Uygulamalarını AKS’e Migrate Etmek

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.

AKS Cluster’ının Oluşturulması

Ö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.

ASP.NET Framework Web Uygulamasının Containerize Edilmesi

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.

Container’ın AKS’e Deployment İşlemi

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.

Sonuç

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.

Referanslar

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

Gökhan Gökalp

View Comments

Recent Posts

Containerized Uygulamaların Supply Chain’ini Güvence Altına Alarak Güvenlik Risklerini Azaltma (Güvenlik Taraması, SBOM’lar, Artifact’lerin İmzalanması ve Doğrulanması) – Bölüm 1

{: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.…

8 ay ago

Identity & Access Management İşlemlerini Azure AD B2C ile .NET Ortamında Gerçekleştirmek

{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…

12 ay ago

Azure Service Bus Kullanarak Microservice’lerde Event’ler Nasıl Sıralanır (FIFO Consumers)

{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…

2 yıl ago

.NET Microservice’lerinde Outbox Pattern’ı ile Eventual Consistency için Atomicity Sağlama

{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…

2 yıl ago

Dapr ve .NET Kullanarak Minimum Efor ile Microservice’ler Geliştirmek – 02 (Azure Container Apps)

{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…

2 yıl ago