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ğinizin olması gerekir ve ücret ödeyebilirsiniz. Mevcut bir Azure aboneliğiniz yoksa başlamadan önce ücretsiz hesap oluşturun.

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

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

  3. komutunu kullanarak az group create bir Azure kaynak grubu oluşturun ve bir bölge belirtin. Bu örnek eastus bölgesinde rg-ship-manager adlı bir kaynak grubu oluşturur:

    az group create --name rg-ship-manager --location eastus
    

    Oluşturma işlemlerinin tamamlanması birkaç dakika sürebilir.

Durumu oluşturma

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

Azure Cosmos DB örneğini uygulamayı çalıştırmak için gerekli kaynaklar kapsamında oluşturuyor olsak da Azure Kubernetes Service (AKS) ile Azure Cosmos DB birbiriyle bağlantılı 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. komutunu kullanarak az cosmosdb create yeni bir Azure Cosmos DB hesabı oluşturun.

    az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
    

    Oluşturma işlemlerinin tamamlanması birkaç dakika sürebilir.

  3. komutunu kullanarak az cosmosdb mongodb database create yeni bir veritabanı oluşturun. Bu örnekte veritabanı contoso-ship-manager olarak adlandırılmıştır.

    az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
    
  4. komutunu kullanarak veritabanının başarıyla oluşturulduğunu az cosmosdb mongodb database list 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. komutunu kullanarak az aks create 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şlemlerinin 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 bir Azure desteği isteği aracılığıyla bu kotayı artırmanız gerekir (Sorun türü için Kota'yı seçin).

  3. komutunu kullanarak az aks get-credentials 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 girin y .

  4. komutunu kullanarak yapılandırmayı test edin kubectl get nodes .

    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ğıtma

Uygulamayı oluşturmak için Kubernetes'e dağıtılacak YAML dosyalarını oluşturmanız gerekir.

Arka uç API'sini dağıtma

  1. komutunu kullanarak az cosmosdb keys list Azure Cosmos DB veritabanınızı bağlantı dizesi 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. Yer tutucuyu {your database connection string} önceki adımda aldığınız veritabanı bağlantı dizesi değiştirin.

    Not

    bağlantı dizesi bazen geçersiz YAML karakterleri sunduğundan, ortam değişkenlerine tırnak eklemeyi " unutmayın. GIZLI dizileri, AKS'de bağlantı dizesi depolamak ve almak için güvenli bir yol olarak kullanmayı düşünebilirsiniz.

  4. Dosyayı kaydedip kapatın

  5. komutunu kullanarak arka uç API dağıtımını kubectl apply 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. komutunu kullanarak az aks show 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. Yer tutucuyu <host-name> önceki adımda aldığınız bağlantı dizesi değiştirin.

  4. Dosyayı kaydedip kapatın

  5. komutunu kullanarak arka uç ağ dağıtımını kubectl apply 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
    

    API'ye erişmek için giriş kaynağınıza yapıştırdığınız ana bilgisayar adını kullanabilirsiniz. Azure DNS bölgesi kaynağının DNS algılama sürecini tamamlaması beş dakika kadar sürebilir. API'ye şu an erişemiyorsanız birkaç dakika bekledikten sonra yeniden deneyin.

  6. komutunu kullanarak kubectl get ingress Kubernetes'i kullanılabilir girişler için sorgulayarak giriş durumunu denetleyin.

    kubectl get ingress
    

    Çıktıdaki ADRES alanı doldurulduktan sonra, aşağıdaki örnek çıktıda gösterildiği gibi giriş dağıtıldı 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ğıtma

  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. Yer tutucusunu {YOUR_BACKEND_URL} , önceki bölümde aldığınız arka uç API'sinin ana bilgisayar adı URL'si ile değiştirin.

  3. Dosyayı kaydedip kapatın

  4. komutunu kullanarak ön uç dağıtımını kubectl apply 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. Yer tutucuyu <host-name> önceki bölümde aldığınız bağlantı dizesi ile değiştirin.

  3. Dosyayı kaydedip kapatın

  4. komutunu kullanarak ön uç ağ dağıtımını kubectl apply 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
    

    API'ye erişmek için giriş kaynağınıza yapıştırdığınız ana bilgisayar adını kullanabilirsiniz. Azure DNS bölgesi kaynağının DNS algılama sürecini tamamlaması beş dakika kadar sürebilir. API'ye şu an erişemiyorsanız birkaç dakika bekledikten sonra yeniden deneyin.

  5. komutunu kullanarak kubectl get ingress Kubernetes'i kullanılabilir girişler için sorgulayarak giriş durumunu denetleyin.

    kubectl get ingress
    

    Çıktıdaki ADRES alanı doldurulduktan sonra, aşağıdaki örnek çıktıda gösterildiği gibi giriş dağıtıldı 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 giriş kaynağı ana bilgisayar adı ile URL'ye erişebilir ve nakliye yönetim uygulamasına giriş yapabilirsiniz.