Azure Cosmos DB kullanarak yeni bir veritabanı barındırma
Dış durumların temel kavramlarını ve Kubernetes'i kullanarak bunlarla nasıl başa çıkılacağını incelediğimize göre, navlun şirketinizin uygulamasını destekleyecek kaynakları oluşturalım ve ardından uygulamanın kendisini oluşturalım.
Kaynak grubu oluşturma
Önemli
Bu alıştırmayı çalıştırmak için kendi Azure aboneliğinize ihtiyacınız vardır ve ücret ödemeniz gerekebilir. Henüz bir Azure aboneliğiniz yoksa başlamadan önce ücretsiz hesap oluşturun.
Cloud Shell'i açın ve bash seçin.
az group create
komutunu kullanarak bir Azure kaynak grubu oluşturun ve bir bölge belirtin. eastus bölgesinde, rg-ship-manager adlı bir kaynak grubu oluşturur bu örnek.az group create --name rg-ship-manager --location eastus
Oluşturma işleminin tamamlanması birkaç dakika sürebilir.
Durumu oluştur
Daha önce de açıklandığı gibi, Kubernetes'te durumu işlemek mümkündür ancak önerilmez. Yüksek oranda kullanılabilir bir uygulama durumunu yönetmek, durumu kendiniz yönetmeniz gerektiğinde çok zor olabilir.
Bu sorunu çözmek için durumu dış durumla ilgilenme konusunda uzmanlaşmış bir uygulamayla dışlaştıracağız: Azure Cosmos DB.
Not
Uygulamayı çalıştırmak için gerekli kaynakların bir parçası olarak bir Azure Cosmos DB örneği oluşturuyor olsak da, Azure Kubernetes Service (AKS) ve Azure Cosmos DB birbiriyle ilişkili değildir.
Modülün geri kalanında kullanılmak üzere Azure Cosmos DB hesap adını ve kaynak grubu adını depolamak için Bash değişkenleri oluşturun.
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
az cosmosdb create
komutunu kullanarak yeni bir Azure Cosmos DB hesabı oluşturun.az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
Oluşturma işleminin tamamlanması birkaç dakika sürebilir.
az cosmosdb mongodb database create
komutunu kullanarak yeni bir veritabanı oluşturun. Bu örnekte veritabanına contoso-ship-manager adı verilmiştir.az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
az cosmosdb mongodb database list
komutunu kullanarak veritabanının başarıyla oluşturulduğunu doğrulayın.az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table
Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:
Name ResourceGroup -------------------- --------------- contoso-ship-manager rg-ship-manager
Artık ship manager uygulamasındaki tüm verileri depolamak için bir dış durum oluşturduğunuza göre, uygulamanın kendisini depolamak için AKS kaynağını oluşturalım.
AKS kümesini oluşturma
Modülün geri kalanında kullanılmak üzere küme adını depolamak için bir Bash değişkeni oluşturun.
AKS_CLUSTER_NAME=ship-manager-cluster
az aks create
komutunu kullanarak bir AKS kümesi oluşturun.az aks create --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME \ --node-count 3 \ --generate-ssh-keys \ --node-vm-size Standard_B2s \ --enable-addons http_application_routing
Oluşturma işleminin tamamlanması birkaç dakika sürebilir.
Not
Tüm Azure hizmetleri, belirli sanal makine (VM) SKU'ları için kullanım kısıtlamaları da dahil olmak üzere kaynaklar ve özellikler için varsayılan sınırları ve kotaları ayarlar. Seçtiğiniz bölgede istediğiniz VM SKU'sunun kullanılabilir olmadığını belirten bir hatayla karşılaşırsanız, büyük olasılıkla Azure destek isteği aracılığıyla bu kotayı artırmanız gerekir (Sorun türü için Kota seçin).
az aks get-credentials
komutunu kullanarak kubectl yapılandırmasını indirin.az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP
Mevcut kümeler hakkında herhangi bir ileti alırsanız, örneğin:
A different object named ship-manager-cluster already exists in your kubeconfig file. Overwrite? (y/n):
Üzerine yazmak için
y
girin.kubectl get nodes
komutunu kullanarak yapılandırmayı test edin.kubectl get nodes
Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:
NAME STATUS ROLES AGE VERSION aks-nodepool1-12345678-vmss000000 Ready agent 3m19s v1.27.7 aks-nodepool1-12345678-vmss000001 Ready agent 3m25s v1.27.7 aks-nodepool1-12345678-vmss000002 Ready agent 3m20s v1.27.7
Uygulamayı dağıt
Uygulamayı oluşturmak için Kubernetes'e dağıtılacak YAML dosyalarını oluşturmanız gerekir.
Arka uç API'sini dağıt
az cosmosdb keys list
komutunu kullanarak Azure Cosmos DB veritabanı bağlantı dizenizi alın.az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv
Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:
mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
backend-deploy.yml adlı yeni bir dosya oluşturun ve aşağıdaki dağıtım belirtimini yapıştırın:
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-backend spec: replicas: 1 selector: matchLabels: app: ship-manager-backend template: metadata: labels: app: ship-manager-backend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:backend name: ship-manager-backend resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 3000 name: http env: - name: DATABASE_MONGODB_URI value: "{your database connection string}" - name: DATABASE_MONGODB_DBNAME value: contoso-ship-manager
{your database connection string}
yer tutucusunun yerine önceki adımda aldığınız veritabanı bağlantı dizesini yazın.Not
Bağlantı dizesi bazen geçersiz YAML karakterleri sunduğundan, ortam değişkenlerine
"
tırnak işaretleri eklemeyi unutmayın. AKS'de bağlantı dizgisini depolamak ve almak için güvenli bir yol olarak gizli bilgileri kullanmayı düşünebilirsiniz.Dosyayı kaydedin ve kapatın.
kubectl apply
komutunu kullanarak arka uç API dağıtımını uygulayın.kubectl apply -f backend-deploy.yml
Aşağıdaki örnek çıktıya benzer bir ileti görmeniz gerekir:
deployment.apps/ship-manager-backend created
Bu uygulamayı herkesin kullanımına açmak için trafikle ilgilenmek için bir hizmet ve giriş oluşturmanız gerekir.
az aks show
komutunu kullanarak küme API'nizin sunucu adresini alın.az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn
Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:
ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io
backend-network.yml adlı yeni bir dosya oluşturun ve aşağıdaki ağ belirtimine yapıştırın:
apiVersion: v1 kind: Service metadata: name: ship-manager-backend spec: type: ClusterIP ports: - port: 80 targetPort: 3000 selector: app: ship-manager-backend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-backend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-backend port: number: 80 path: / pathType: Prefix
<host-name>
yer tutucusunun yerine önceki adımda aldığınız bağlantı dizesini yazın.Dosyayı kaydedin ve kapatın.
kubectl apply
komutunu kullanarak arka uç ağ dağıtımını uygulayın.kubectl apply -f backend-network.yml
Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:
service/ship-manager-backend created ingress.networking.k8s.io/ship-manager-backend created
Giriş kaynağınıza yapıştırdığınız ana makine adı aracılığıyla API'ye erişebilirsiniz. Azure DNS bölgesi kaynağının DNS algılamasını tamamlaması beş dakika kadar sürebilir. API'ye hemen erişemiyorsanız birkaç dakika bekleyip yeniden deneyin.
kubectl get ingress
komutunu kullanarak Kubernetes'i kullanılabilir girişler için sorgulayarak giriş durumunu denetleyin.kubectl get ingress
Çıktıdaki ADDRESS alanı doldurulduktan sonra, aşağıdaki örnek çıktıda gösterildiği gibi giriş dağıtılmış ve erişime hazır demektir:
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s
Ön uç arabirimini dağıt
frontend-deploy.yml adlı yeni bir dosya oluşturun ve aşağıdaki dağıtım belirtimini yapıştırın:
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-frontend spec: replicas: 1 selector: matchLabels: app: ship-manager-frontend template: metadata: labels: app: ship-manager-frontend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:frontend name: ship-manager-frontend imagePullPolicy: Always resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 volumeMounts: - name: config mountPath: /usr/src/app/dist/config.js subPath: config.js volumes: - name: config configMap: name: frontend-config --- apiVersion: v1 kind: ConfigMap metadata: name: frontend-config data: config.js: | const config = (() => { return { 'VUE_APP_BACKEND_BASE_URL': 'http://{YOUR_BACKEND_URL}', } })()
{YOUR_BACKEND_URL}
yer tutucusunu, önceki bölümde aldığınız arka uç API'sinin ana bilgisayar adı URL'si ile değiştirin.Dosyayı kaydedin ve kapatın.
kubectl apply
komutunu kullanarak ön uç dağıtımını uygulayın.kubectl apply -f frontend-deploy.yml
Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:
deployment.apps/ship-manager-frontend created configmap/frontend-config created
Ardından, bu uygulamanın web'e açık olması için gereken ağ kaynaklarını oluşturabilirsiniz.
frontend-network.yml adlı yeni bir dosya oluşturun ve aşağıdaki ağ belirtimine yapıştırın:
apiVersion: v1 kind: Service metadata: name: ship-manager-frontend spec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: app: ship-manager-frontend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-frontend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-frontend port: number: 80 path: / pathType: Prefix
<host-name>
yer tutucusunun yerine önceki bölümde aldığınız bağlantı dizesini yazın.Dosyayı kaydedin ve kapatın.
kubectl apply
komutunu kullanarak ön uç ağ dağıtımını uygulayın.kubectl apply -f frontend-network.yml
Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:
service/ship-manager-frontend created ingress.networking.k8s.io/ship-manager-frontend created
Giriş kaynağınıza yapıştırdığınız host adı aracılığıyla API'ye erişebilirsiniz. Azure DNS bölgesi kaynağının DNS algılamasını tamamlaması beş dakika kadar sürebilir. API'ye hemen erişemiyorsanız birkaç dakika bekleyip yeniden deneyin.
kubectl get ingress
komutunu kullanarak Kubernetes'i kullanılabilir girişler için sorgulayarak giriş durumunu denetleyin.kubectl get ingress
Çıktıdaki ADDRESS alanı doldurulduktan sonra, aşağıdaki örnek çıktıda gösterildiği gibi giriş dağıtılmış ve erişime hazır demektir:
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s ship-manager-frontend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 100s
Artık ingress kaynağının ana bilgisayar adından URL'ye erişerek Ship Manager uygulamasına giriş yapabilirsiniz.