Azure Cosmos DB kullanarak yeni bir veritabanı barındırma

Tamamlandı

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.

  1. Kendi aboneliğinizi kullanarak azure portal oturum açın.

  2. Cloud Shell'i açın ve bash seçin.

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

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

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

  1. 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
    
  2. 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).

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

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

  1. 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
    
  2. 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
    
  3. {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.

  4. Dosyayı kaydedin ve kapatın.

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

  1. 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
    
  2. 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
    
  3. <host-name> yer tutucusunun yerine önceki adımda aldığınız bağlantı dizesini yazın.

  4. Dosyayı kaydedin ve kapatın.

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

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

  1. 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}',
          }
        })()
    
  2. {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.

  3. Dosyayı kaydedin ve kapatın.

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

  1. 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
    
  2. <host-name> yer tutucusunun yerine önceki bölümde aldığınız bağlantı dizesini yazın.

  3. Dosyayı kaydedin ve kapatın.

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

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