Azure Kubernetes Services içerisinde SQL Server

By | March 25, 2021

Bu makalede, Azure Kubernetes Service’te bir Kubernetes clusterının nasıl oluşturulacağını, ve Kubernetes clusterı içerisine SQL sunucusunun nasıl kurulacağını anlatıyor olacağım. Bu konu bir noktada Azure Arc Enabled Data Services konusunun girişini temsil ediyor olacaktır.

Öncelikli olarak hiç bilmeyenlerin aklında ki kubernetes sorusunun cevabını vererek konuya başlamanın daha iyi olacağını düşünüyorum. Kubernetes kelimesi Yunancadan geliyor ve anlamı helmsman (dümenci demektir ki bu yüzden logosu gemi dümenine benzer). Çoğu kaynaklarda k8s olarak kısaltılarak yazılır ve bunun sebebi de K harfi ile S harfi arasında 8 adet  harf olmasıdır.

Bakınız : Kubernetes

Kubernetes’in kelime anlamı ve kısa yazılımından bahsettikten sonra ne amaç için geliştirildiğinin de bilgisini paylaştıktan sonra asıl konumuz olan ve Microsoft Azure üzerindeki Kubernetes servisinde SQL Server veritabanı nasıl kurulum ve yönetimini yapabildiğimizden bahsedeceğim. Kubernetes, konteyner haline getirilmiş olan iş yüklerinizi ve hizmetlerinizi yönetmek, genişletmek ve rahatça taşınabilir hale getirilmesine imkan veren bir Açık kaynaklı GO dili ile geliştirilmiş bir platformdur.

Eski zamanlarda iş yüklerinizin nasıl çalıştığını hatırlarsanız en temelde donanım ve üzerinde bir işletim sistemi ve onun da üzerlerinde çalıştırılan iş yükleriniz olurdu. Daha sonra ise çeşitli çözümler ve gelişen teknoloji ile iş yüklerimizi sanallaştırma katmanları üzerinde çalıştırmaya başladık. Bu sefer ise iş yüklerimiz ile işletim sistemi arasında bir hypervisor girdi ve iş yüklerimizi bir hypervisor üzerinde birbirlerinden bağımsız sanal sunucular üzerinde çalıştırabilir olduk ve şuan içinde çok kullanılan ve tercih edilen bir alt yapı yönetimi haline gelmiştir. Fakat her gün gelişen teknoloji ve platformlar ile sanallaştırmanın bir adım ötesi konterner dağıtım modeli geliştirildi. Aslında sanallaştırma yapısına benzer bir çözüm olmak ile beraber İşletim Sistemini (OS) uygulamalar arasında paylaştırmak için rahat yalıtım özelliklerine sahiptirler. Bu nedenle konteynerler hafif (lightweight) kabul edilir. VM’ye benzer şekilde, bir konteynerin kendi dosya sistemi, CPU’su, belleği, işlem alanı ve daha fazlası vardır. Altta yatan altyapıdan ayrıştırıldıklarından, bulutlarda ve işletim sistemi dağıtımlarında taşınabilirler. Peki Kubernetes bu işin neresinde? Kubernetes, bir arada çalışan konteynerların yönetimini ve kesintisiz ve esnek bir şekilde çalıştırmanız için size esnek bir ortam sağlayan bir platformdur. Biz Microsoft SQL Server’ı Konteyner yapısına uygun hale getirilmiş halinin kurulumunu yapacağız ve bu konteynerları da Azure Kubernetes servisi ile esnek bir şekilde dağıtımını, genişletilmesi ve yönetimini sağlıyor olacağız.

Bu kadar temel bilgiden sonra asıl konu başlığımız olan Azure Kubernetes Services içerisine SQL Server kurulumuna geçebiliriz.

İlk adım olarak bir azure hesabına ihtiyacımız var. Bu adımı yerine getirmiş olduğunuzu varsayarak yazıma devam ediyorum ve Azure hesabıma giriş yapıyorum. Portal’a giriş yaptıktan sonra sol üst tarafta bulunan ve Resim-1 de gösterdiğim “>” kutusuna tıklayıp azure cloud shell’e giriş yapıyoruz. Eğer ki daha önce azure cloud shell kullanımı gerçekleştirmediyseniz sizden bir depolama adresi oluşturmanızı isteyecektir.

Resim1 : Azure Cloud Shell çalıştırılması

Fakat Azure üzerinde işlemlerimize devam etmeden önce kullanmakta olduğumuz ve Azure kaynaklarını yönetmek istediğimiz bilgisayarımızda Azure CLI ve Kubectl kurmamız gerekiyor. Azure CLI, Azure kaynaklarını yönetmek için kullanacağımız komut satırı aracıdır. Kubectl ise Azure Kubernetes Services’te Kubernetes clusterında komut çalıştırmamıza yönelik bir komut satır aracıdır. Her iki kurulumda bizlere hem cmd – command prompt – dan hem de powershell den kullanmamıza imkan sağlayacaktır.

Azure CLI kurulumu için aşağıda yer alan yazıdan faydalanabilirsiniz. Daha fazla bilgi vererek yazının akışını bozmak istemiyorum.

https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?view=azure-cli-latest&tabs=azure-cli Azure CLI

kurulumlarını yukarıdaki adresten faydalandıktan sonra komut satırı üzerinden Azure hesabında oturum açmak için aşağıdaki komutu kullanıyoruz.

az login

Resim2 : Az login ile Azure hesabına giriş

Azure CLI, varsayılan tarayıcınızı açar ve Azure hesabınızı kullanarak oturum açmanızı ister.

Kubectl komutlarını da komut satırı üzerinden yada powershell den çalıştırmak için kubectl.exe indirmeniz ve ortam değişkenlerinden tanımlamasını yapmanız gerekmektedir.

Kubectl’i indirmek ve kurmak için;

https://kubernetes.io/docs/tasks/tools/install-kubectl-windows/#install-with-powershell-from-psgallery

Kurulum sonrasında ortam değişkenlerine eklemek için;

Windows Tuşu + S tuşuna basıp “Gelişmiş Sistem Ayarlarını Görüntüle” kısımına açın.  

Resim3: Gelişmiş Sistem ayarlarını görüntüle

Gelen ekranda yer alan ortam değişkenleri kısımını tıklayın ve gelen ekranda path kısımına düzenle diyerek indirdiğiniz kubectl.exe’nin yol bilgisini ekleyin ve tamam diyip çıkış yapın.

Resim4: ortam değişkenleri

Ben kubectl.exe dosyasını c dizini içerisinde .kubectl klasörünün içerisinde tutuyorum ve path bilgisinde bu adres bilgisini girişini yaptım. Böylece kubectl kurulumunu da tamamlamış olduk.

Şimdi ise sırada Azure Kubernetes Service’in kurulması var.Bu işlemi yapabilmek adına Azure Cloud Shell’de aşağıda belirtiğim Resource Provider’ların register edilmesi gerekiyor.

az provider register -n Microsoft.Compute
az provider register -n Microsoft.ContainerService
az provider register -n Microsoft.Networkaz provider register -n Microsoft.Storage

Resim5: Azure Cloud Shell Register Azure Kubernetes Services Resource Provider

Resource Provider’ları da register ettiğimize göre artık bir Azure Resource Group oluşturup ihtiyaç duyacağımız kaynaklarını bu group içerisinde toplayalım.

az group create -n rg-dmc-azure-k8s –location westus2 Yukarıdaki kod bloğu ile rg-dmc-azure-k8s isimli westus2 bölgesinde bir kaynak grubu oluşturduk.

Resim6: rg-dmc-azure-k8s resource group oluşturulması

Resource group oluşturmasını tamamladık,şimdi aşağıdaki kod bloğu ile bu resource group içerisinde iki node’lu bir kubernetes cluster kurulumu yapalım. Kubernetes cluster’ın özelliği ise standard_D8_v4 yani 8 vCPU,32 GM Ram olarak oluşturuyoruz.

az aks create –resource-group rg-dmc-azure-k8s –name dmc-demok8s –node-count 2 –generate-ssh-keys –node-vm-size=Standard_D8_v4

Resim7: Azure Kubernetes Service oluşturma

Yaklaşık on dakika içerisinde kubernetes clusterımızı oluşmuş olacaktır. İşlemleriniz tamamlandıktan sonra Azure Portal üzerinden oluşturduğumuz resource group içerisinden tüm kaynakları görebiliriz.

Resim8: Azure Portal – Tüm kaynakların görüntülenmesi

Aşağıdaki komutu kullanarak cluster’ın kimlik bilgilerini alalım.

Resim9: Kubernetes Cluster Credentials Alınması

Bu işlem sonrasında kubectl get pods –all -namespaces komutu ile cluster içerisindeki tüm pod’ları görüntüleyebiliriz.

Resim10 : Tüm Pod’ların görüntülenmesi

Şimdi belkide en önemli konulardan biri olan Kubernetes bel kemiği diyebileceğimiz Persistent volume (Pv) ve Persistent volume Claim (Pvc) yapılandırmasını yapacağız. Fakat öncelikli olarak bu iki terimin ne olduğunun açıklanmasının daha iyi olacağını düşünüyorum ve bu sebepten aşağıdaki tabloyu paylaşıyorum.

Resim11: PV ve PVC kavramları

Şöyle Pv ve Pvc kavramlarının yapılandırılmasının önemi aslında bir pod çöktüğü yada yeniden ayağa kalktığı zaman içerisinde barındırdığı verilerin kayıp olup olmamasının ayarlanmasının sağlandığı yer bu pv ve pvc kavramlarının yapılandırılmasından geçtiğinden bahsedebilirim.Aşağıdaki kod bloğunu bir not defterine dmc_pv_pvc.yaml olarak kayıt edin. Kayıt ettikten sonra Resim12 de gösterdiğim gibi Azure Cloud Shell aracılığı ile yaml dosyamızı upload edelim. Kod bloğuna ayrıca erişmek isterseniz de buradaki adresten erişebilirsiniz.

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: azure-disk
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Standard_LRS
  kind: Managed
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mssql-data
  annotations:
    volume.beta.kubernetes.io/storage-class: azure-disk
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi

Resim12: Azure Cloud Shell Upload File

Upload işlemi bittikten sonra Resim13’deki gibi bir bilgilendirme göreceğiz.

Resim13: Yaml aktarımı başarılı.

Aşağıdaki kod bloğu ile aktarımını yaptığımız yaml dosyamızı çalıştıralım.

kubectl apply -f /home/caglarozenc/dmc_pv_pvc.yaml

Resim14: dmc_pv_pvc.yaml çalıştırılması

Resim14’de görüldüğü üzere pv ve pvc yapılandırılmasını tamamladık. Aşağıdaki kod blokları ile pv ve pvc kontrol edebiliriz. Kubectl get pv
kubectl get pvc

Resim15: kubectl ile pv- pvc bilgilerini görme

Kubernetes tarafındaki işlemlerimizi tamamladığımıza göre şimdi sırada Cluster’ımıza Microsoft SQL Server’ın kurulumunu gerçekleştirebiliriz.

İlk olarak Kubernetes Cluster içerisinde kullanacağımız SA kullanıcısının parolasının belirlenmesi gerekmektedir. Aşağıdaki kod bloğu ile bu işlemi gerçekleştiriyoruz. DMC-CaglarOZENC*! İsimli bir şifre belirledim.

kubectl create secret generic mssql –from-literal=SA_PASSWORD=”DMC-CaglarOZENC*!”

Resim16: SA şifresinin belirlenmesi

Pv ve Pvc tanımlamarında kullandığımız gibi SQL Server kurulumlarını yapabilmek adına aşağıdaki gibi bir yaml dosyası oluşturuyorum ve upload ediyorum. Port bilgisi 1433 olacaktır. SQL Server 2019 Developer Edition kurulumu yapıyorum ve SA şifresi ise Resim16’da belirlediğim şifre olacaktır. Kod Bloğuna harici erişmek için lütfen tıklayın.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mssql-deployment
spec:
  replicas: 1
  selector:
     matchLabels:
       app: mssql
  template:
    metadata:
      labels:
        app: mssql
    spec:
      terminationGracePeriodSeconds: 30
      hostname: mssqlinst
      securityContext:
        fsGroup: 10001
      containers:
      - name: mssql
        image: mcr.microsoft.com/mssql/server:2019-latest
        ports:
        - containerPort: 1433
        env:
        - name: MSSQL_PID
          value: "Developer"
        - name: ACCEPT_EULA
          value: "Y"
        - name: SA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mssql
              key: SA_PASSWORD 
        volumeMounts:
        - name: mssqldb
          mountPath: /var/opt/mssql
      volumes:
      - name: mssqldb
        persistentVolumeClaim:
          claimName: mssql-data
---
apiVersion: v1
kind: Service
metadata:
  name: dmcsql
spec:
  selector:
    app: mssql
  ports:
    - protocol: TCP
      port: 1433
      targetPort: 1433
  type: LoadBalancer

Yaml dosyasını da başarılı bir şekilde upload ettikten sonra aşağıdaki kod bloğu ile yaml dosyamı uygulamaya alıyorum.

kubectl apply -f /home/caglarozenc/dmc_k8s_sqlserver_kurulumu.yaml

Resim17: SQL Server Kurulumu

Kurulumun durumunu sorgulamak için aşağıdaki sorguyu çalıştırabilirsiniz.

Kubectl get pods

Resim18: SQL Server Pods

Resim18 de görüldüğü üzere kurulum başarılı şekilde tamamlanmış ve bizim SQL Server kurulu Pod’umuzu 3 dakika 10sn’dir çalışır durumda. Çalışan Pod ile ilgili daha fazla detay almak isterseniz de aşağıdaki kod bloğunu kullanabilirsiniz.

kubectl describe pods mssql-deployment-7cb7b5c689-ktvk9

Resim19: Pod Hakkında detaylı bilgilendirme

Resim19 da gördüğünüz gibi detaylı bilgilendirmeler içerisinde Pulling yaptığı adres ve Attach ettiği Pvc bilgilerini dahi görebiliyoruz.

Sonraki adım olarak çalışan SQL Server’ın IP adresi bilgisinin öğrenmemiz gerekiyor. Bu işlem için aşağıdaki kod bloğundan faydalanabiliriz.

kubectl get services

Resim20: SQL Server IP adresinin öğrenilmesi

Resim20’de görüldüğü üzere hem Cluster’ın iç IP adresi hem de Dış IP adresini öğrenmiş olduk. Şimdi kullandığımız SQL Server Management Studio yada Azure Data Studio ile kurduğumuz SQL Server’a erişip test etmeye geldi.

Resim21: SQL Server Bağlantısı başarılı

Gördüğünüz gibi kurduğumuz SQL Server’a erişimde herhangi bir sorun yaşamadık. Şimdi hazır bağlandık, hemen yeni bir DB Oluşturup birkaç kayıt ekleyelim. Kod Bloğuna harici erişimek için lütfen tıklayınız.

create database DMC 

go 

use DMC

go 

create table BLOG 

(

    BlogName varchar(50)

)

Go 

insert into BLOG(BlogName) values(‘www.dmcteknoloji.com’)

insert into BLOG(BlogName) values(‘www.caglarozenc.com’)

insert into BLOG(BlogName) values(‘www.sqlekibi.com’)

insert into BLOG(BlogName) values(‘www.mshowto.org’)

DMC isiminde bir veritabanı oluşturduk, BLOG isimli bir tablo oluşturup içerisine dört adet veri girişi de yaptık.

Resim22: DMC veritabanın oluşturulması

Şimdi ise aslında işin en önemli kısımına geldik, ve oluşturduğumuz Pod’u aşağıdaki komutu kullanarak silelim bakalım neler olacak 😊

az aks delete –name dmc-demok8s  –resource-group rg-dmc-azure-k8s

Resim23: SQL Server Kurulu olduğu Pod’u siliyoruz

Silme işlemi de başarılı oldu. Tekrar Pod kontrolü yapıyoruz.

Resim24: Yeni Pod Gelmiş

Resim24 de görüldüğü üzere ben mevcut Pod silmeme rağmen bana yeni bir Pod oluşturulmuş. Oluşturulan Pod detaylarını kontrol etmek için aşağıdaki kodu çalıştırıyorum.

kubectl get services

Resim25: SQL IP Adresi

Resim25 de görüldüğü üzere eski Pod IP adresini yeni Pod’a atanmış ve service isimleri de aynı durumda fakat biz bu podu silmiştik. Acaba veriler duruyor mu diye tekrar SQL Server Management Studio ile yada Azure Data Studio ile tekrar bağlantı sağlayıp oluşturduğum DMC veritabanı içerisinde BLOG tablosunu kontrol etmek istiyorum.

Resim26: Bingo! Veriler duruyor.

Gördüğünüz üzere Pv ve Pvc yapılandırmalarını başarılı bir şekilde gerçekleştirdikten sonra Pod’un çökmesi yada silinmesi yada yeniden başlatılması bizim için bir veri kaybına sebebiyet vermiyor. Hatta IP adresimiz dahi değişmiyor.

Azure Kubernetes Service üzerinde SQL Server kurulumunu başarılı bir şekilde gerçekleştirdiğimize göre artık Azure tarafında oluşturduğumuz kaynak grubunu ve içerisindeki kaynaklarımızı silmeyi unutmayalım ki Microsoft bize fatura çıkartmasın 😊

az aks delete –name dmc-demok8s  –resource-group rg-dmc-azure-k8s

Resim27: Silme işlemi için onay isteniyor

Dmc-azure-k8s ile işimizi bitirdiğimize göre gönül rahatlığı ile onay verebiliriz ve azure kubernetes cluster servisimizi silebiliriz. İsterseniz de cluster’ı sildikten sonra bu işlem için oluşturduğumuz resource group’da silebilirsiniz. Unutmadan, Resource Group içerisinde boş ise size ayrıca faturalandırma yapılmaz.

Bir sonraki yazımızda görüşmek üzere,hoşçakalın.

DMC Bilgi Teknolojileri
Çağlar ÖZENÇ

Leave a Reply

Your email address will not be published. Required fields are marked *