Een nieuwe database hosten met Behulp van Azure Cosmos DB

Voltooid

Nu we de basisconcepten van externe statussen hebben bekeken en hoe we hiermee omgaan met kubernetes, gaan we de resources maken die de toepassing van uw vrachtbedrijf ondersteunen en vervolgens de toepassing zelf maken.

Een brongroep maken

Belangrijk

U hebt uw eigen Azure-abonnement nodig om deze oefening te kunnen uitvoeren. Dit kan kosten met zich meebrengen. Als u nog geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

  1. Meld u aan bij Azure Portal met uw eigen abonnement.

  2. Open Cloud Shell en selecteer Bash.

  3. Maak een Azure-resourcegroep met behulp van de az group create opdracht en geef een regio op. In dit voorbeeld wordt een resourcegroep met de naam rg-ship-manager gemaakt in de regio Eastus :

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

    Dit proces kan even duren.

De status maken

Zoals we eerder hebben beschreven, is het mogelijk, maar niet aanbevolen om de status in Kubernetes af te handelen. Het beheren van een maximaal beschikbare toepassingsstatus kan te moeilijk worden wanneer u de status zelf moet beheren.

Om dit probleem op te lossen, externaliseren we de status naar een toepassing die gespecialiseerd is in het omgaan met externe status: Azure Cosmos DB.

Notitie

Hoewel we een Azure Cosmos DB-exemplaar maken als onderdeel van de vereiste resources om de toepassing uit te voeren, hebben Azure Kubernetes Service (AKS) en Azure Cosmos DB niet met elkaar te maken.

  1. Maak Bash-variabelen om de azure Cosmos DB-accountnaam en de naam van de resourcegroep op te slaan voor gebruik in de rest van de module.

    export RESOURCE_GROUP=rg-ship-manager
    export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
    
  2. Maak een nieuw Azure Cosmos DB-account met behulp van de az cosmosdb create opdracht.

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

    Dit proces kan even duren.

  3. Maak een nieuwe database met behulp van de az cosmosdb mongodb database create opdracht. In dit voorbeeld heeft de database de naam contoso-ship-manager.

    az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
    
  4. Controleer of de database is gemaakt met behulp van de az cosmosdb mongodb database list opdracht.

    az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    Name                  ResourceGroup
    --------------------  ---------------
    contoso-ship-manager  rg-ship-manager
    

Nu u een externe status hebt gemaakt om alle gegevens van de ship manager-toepassing op te slaan, gaan we de AKS-resource maken om de toepassing zelf op te slaan.

Het AKS-cluster maken

  1. Maak een Bash-variabele om de clusternaam op te slaan voor gebruik in de rest van de module.

    AKS_CLUSTER_NAME=ship-manager-cluster
    
  2. Maak een AKS-cluster met behulp van de az aks create opdracht.

    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
    

    Dit proces kan even duren.

    Notitie

    Alle Azure-services stellen standaardlimieten en quota in voor resources en functies, inclusief gebruiksbeperkingen voor bepaalde VM-SKU's (virtuele machines). Als er een fout optreedt waarin wordt voorgesteld dat de gewenste VM-SKU niet beschikbaar is in de regio die u hebt geselecteerd, moet u dit quotum waarschijnlijk verhogen via een ondersteuning voor Azure-aanvraag (voor probleemtype selecteert u Quotum).

  3. Download de kubectl-configuratie met behulp van de az aks get-credentials opdracht.

    az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP
    

    Als u berichten over bestaande clusters ontvangt, bijvoorbeeld:

    A different object named ship-manager-cluster already exists in your kubeconfig file.
    Overwrite? (y/n):
    

    Voer in y om te overschrijven.

  4. Test de configuratie met behulp van de kubectl get nodes opdracht.

    kubectl get nodes
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    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
    

De toepassing implementeren

Als u de toepassing wilt maken, moet u de YAML-bestanden maken om te implementeren in Kubernetes.

De back-end-API implementeren

  1. Haal uw Azure Cosmos DB-database op verbindingsreeks met behulp van de az cosmosdb keys list opdracht.

    az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
    
  2. Maak een nieuw bestand met de naam backend-deploy.yml en plak de volgende implementatiespecificatie:

    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. Vervang de {your database connection string} tijdelijke aanduiding door de database verbindingsreeks die u in de vorige stap hebt opgehaald.

    Notitie

    Vergeet niet om aanhalingstekens " toe te voegen aan de omgevingsvariabelen, omdat de verbindingsreeks soms ongeldige YAML-tekens bevat. U kunt overwegen geheimen te gebruiken als een veilige manier om verbindingsreeks op te slaan en op te halen in AKS.

  4. Sla het bestand op en sluit het bestand.

  5. Pas de implementatie van de back-end-API toe met behulp van de kubectl apply opdracht.

    kubectl apply -f backend-deploy.yml
    

    Er wordt een bericht weergegeven dat lijkt op de volgende voorbeelduitvoer:

    deployment.apps/ship-manager-backend created
    

Als u deze toepassing beschikbaar wilt maken voor iedereen, moet u een service en inkomend verkeer maken.

  1. Haal het adres van uw cluster-API-server op met behulp van de az aks show opdracht.

    az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io
    
  2. Maak een nieuw bestand met de naam backend-network.yml en plak de volgende netwerkspecificatie:

    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. Vervang de <host-name> tijdelijke aanduiding door de verbindingsreeks die u in de vorige stap hebt opgehaald.

  4. Sla het bestand op en sluit het bestand.

  5. Pas de back-endnetwerkimplementatie toe met behulp van de kubectl apply opdracht.

    kubectl apply -f backend-network.yml
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    service/ship-manager-backend created
    ingress.networking.k8s.io/ship-manager-backend created
    

    U hebt toegang tot de API via de hostnaam die u in uw toegangsbeheerobjectresource hebt geplakt. De Azure DNS-zoneresource kan er vijf minuten over doen om de DNS-detectie te voltooien. Als u de API niet meteen kunt openen, wacht u een paar minuten en probeert u het opnieuw.

  6. Controleer de status van inkomend verkeer door een query uit te voeren op Kubernetes voor de beschikbare ingresses met behulp van de kubectl get ingress opdracht.

    kubectl get ingress
    

    Zodra het veld ADDRESS in de uitvoer is ingevuld, betekent dit dat het inkomend verkeer is geïmplementeerd en dat het klaar is om te worden geopend, zoals wordt weergegeven in de volgende voorbeelduitvoer:

    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
    

De front-end-interface implementeren

  1. Maak een nieuw bestand met de naam frontend-deploy.yml en plak de volgende implementatiespecificatie:

    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. Vervang de {YOUR_BACKEND_URL} tijdelijke aanduiding door de hostnaam-URL van de back-end-API die u in de vorige sectie hebt opgehaald.

  3. Sla het bestand op en sluit het bestand.

  4. Pas de front-endimplementatie toe met behulp van de kubectl apply opdracht.

    kubectl apply -f frontend-deploy.yml
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    deployment.apps/ship-manager-frontend created
    configmap/frontend-config created
    

Vervolgens kunt u de netwerkresources maken die deze toepassing moet openen voor het web.

  1. Maak een nieuw bestand met de naam frontend-network.yml en plak de volgende netwerkspecificatie:

    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. Vervang de <host-name> tijdelijke aanduiding door de verbindingsreeks die u in de vorige sectie hebt opgehaald.

  3. Sla het bestand op en sluit het bestand.

  4. Pas de front-endnetwerkimplementatie toe met behulp van de kubectl apply opdracht.

    kubectl apply -f frontend-network.yml
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    service/ship-manager-frontend created
    ingress.networking.k8s.io/ship-manager-frontend created
    

    U hebt toegang tot de API via de hostnaam die u in uw toegangsbeheerobjectresource hebt geplakt. De Azure DNS-zoneresource kan er vijf minuten over doen om de DNS-detectie te voltooien. Als u de API niet meteen kunt openen, wacht u een paar minuten en probeert u het opnieuw.

  5. Controleer de status van inkomend verkeer door een query uit te voeren op Kubernetes voor de beschikbare ingresses met behulp van de kubectl get ingress opdracht.

    kubectl get ingress
    

    Zodra het veld ADDRESS in de uitvoer is ingevuld, betekent dit dat het inkomend verkeer is geïmplementeerd en dat het klaar is om te worden geopend, zoals wordt weergegeven in de volgende voorbeelduitvoer:

    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
    

U hebt nu toegang tot de URL vanaf de hostnaam van de toegangsbeheerobjectresource om de toepassing Ship manager te gebruiken.