Azure Kubernetes Services içerisinde SQL Server
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;
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.ContainerServiceaz 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 pvkubectl 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Ç