Oefening: een toepassing implementeren in uw Azure Kubernetes Service-cluster

Voltooid

In deze oefening implementeert u de website van uw bedrijf als een test-app in Azure Kubernetes Service (AKS). De website is een statische website met een onderliggende technologiestack van HTML, CSS en JavaScript. Er worden niet zoveel aanvragen op ontvangen als op de andere services en het biedt ons een veilige manier om implementatieopties te testen.

Notitie

De code voor de web-app is beschikbaar in deze GitHub-opslagplaats als u de broncode verder wilt verkennen. Deze voorbeeld-app wordt ook alleen geïmplementeerd in een Linux-knooppuntgroep.

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.

Een implementatiemanifest maken

U maakt een implementatiemanifestbestand om uw toepassing te implementeren. Met het manifestbestand kunt u definiëren welk type resource u wilt implementeren en kunt u alle details definiëren die betrekking hebben op de werkbelasting.

In Kubernetes worden containers in logische structuren, genaamd pods, gegroepeerd. Pods hebben geen intelligentie. Met implementaties wordt de ontbrekende intelligentie toegevoegd om uw toepassing te maken. We gaan een implementatiebestand maken.

  1. Meld u aan bij Azure Cloud Shell.

  2. Maak in Cloud Shell een manifestbestand voor de Kubernetes-implementatie met de naam deployment.yaml met behulp van de geïntegreerde editor.

    touch deployment.yaml
    
  3. Open de geïntegreerde editor in Cloud Shell door code . in te voeren

  4. Open het deployment.yaml-bestand en voeg de volgende codesectie van YAML toe.

    # deployment.yaml
    apiVersion: apps/v1 # The API resource where this workload resides
    kind: Deployment # The kind of workload we're creating
    metadata:
      name: contoso-website # This will be the name of the deployment
    

    In deze code hebt u de eerste twee sleutels toegevoegd om aan Kubernetes de apiVersion en kind van het manifest dat u maakt, door te geven. De name is de naam van de implementatie. Gebruik deze om de implementatiegegevens te identificeren en op te vragen wanneer u deze gebruikt kubectl.

    Tip

    Zie de officiële Kubernetes-documentatie voor meer informatie over apiVersion en welke waarden u in deze sleutel moet opnemen. Zoek een koppeling aan het einde van deze module.

  5. Met een implementatie wordt een pod ingepakt. U gebruikt een sjabloondefinitie om de podinformatie in het manifestbestand te definiëren. De sjabloon wordt in het manifestbestand geplaatst, onder de sectie met de implementatiespecificatie.

    Werk het deployment.yaml-bestand bij zodat het overeenkomt met de volgende YAML.

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata: # Metadata for the pod
          labels:
            app: contoso-website
    

    Pods gebruiken niet dezelfde namen als de implementaties. De naam van de pod is een combinatie van de naam van de implementatie met een willekeurige id die aan het einde wordt toegevoegd.

    Let op het gebruik van de labels-sleutel. U voegt de labels-sleutel toe om implementaties toe te staan om pods te zoeken en te groeperen.

  6. In een pod worden een of meer containers ingepakt. Alle pods hebben een specificatiesectie waarin u de containers in die pod kunt definiëren.

    Werk het deployment.yaml-bestand bij zodat het overeenkomt met de volgende YAML.

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          containers: # Here we define all containers
            - name: contoso-website
    

    De containers-sleutel is een matrix met containerspecificaties omdat een pod een of meer containers kan hebben. De specificatie definieert een image, a name, resourcesen portsandere belangrijke informatie over de container.

    Alle actieve pods volgen de naam contoso-website-<UUID>, waarbij UUID een gegenereerde id is om alle resources uniek te identificeren.

  7. Het is een goede gewoonte om een minimum en een maximale hoeveelheid resources te definiëren die de app mag gebruiken vanuit het cluster. U gebruikt de resources-sleutel om deze informatie op te geven.

    Werk het deployment.yaml-bestand bij zodat het overeenkomt met de volgende YAML.

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          containers:
            - image: mcr.microsoft.com/mslearn/samples/contoso-website
              name: contoso-website
              resources:
                requests: # Minimum amount of resources requested
                  cpu: 100m
                  memory: 128Mi
                limits: # Maximum amount of resources requested
                  cpu: 250m
                  memory: 256Mi
    

    U ziet hoe u met de resourcesectie het minimumaantal resources als een aanvraag kunt opgeven en het maximumaantal resources als een limiet.

  8. De laatste stap is het definiëren van de poorten die deze container extern beschikbaar maakt via de ports sleutel. De ports-sleutel is een matrix met objecten; dit betekent dat een container in een pod meerdere poorten met meerdere namen beschikbaar kan maken.

    Werk het deployment.yaml-bestand bij zodat het overeenkomt met de volgende YAML.

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          nodeSelector:
            kubernetes.io/os: linux
          containers:
            - image: mcr.microsoft.com/mslearn/samples/contoso-website
              name: contoso-website
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
              ports:
                - containerPort: 80 # This container exposes port 80
                  name: http # We named that port "http" so we can refer to it later
    

    U ziet hoe u de poort een naam geeft met behulp van de name-sleutel. Door poorten een naam te geven, kunt u de beschikbaar gemaakte poort wijzigen zonder bestanden die naar die poort verwijzen te hoeven wijzigen.

  9. Voeg ten slotte een selectorsectie toe om de workloads te definiëren die de implementatie beheert. De selector-sleutel wordt in de implementatiespecificatiesectie van het manifestbestand geplaatst. Gebruik de matchLabels-sleutel om de labels weer te geven voor alle pods die door de implementatie worden beheerd.

    Werk het deployment.yaml-bestand bij zodat het overeenkomt met de volgende YAML.

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      selector: # Define the wrapping strategy
        matchLabels: # Match all pods with the defined labels
          app: contoso-website # Labels follow the `name: value` template
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          nodeSelector:
            kubernetes.io/os: linux
          containers:
            - image: mcr.microsoft.com/mslearn/samples/contoso-website
              name: contoso-website
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
              ports:
                - containerPort: 80
                  name: http
    

    Notitie

    In een AKS-cluster met meerdere knooppuntgroepen (Linux en Windows) definieert het distributiemanifestbestand dat eerder wordt vermeld, ook een nodeSelector om uw AKS-cluster te laten weten dat de pod van de voorbeeldtoepassing moet worden uitgevoerd op een knooppunt waarop Linux-containers kunnen worden uitgevoerd.

    Linux-knooppunten kunnen geen Windows-containers uitvoeren en omgekeerd.

  10. Sla het manifestbestand op en sluit de editor.

Het manifest toepassen

  1. Voer in Cloud Shell de kubectl apply-opdracht uit om de implementatiemanifest in te dienen bij uw cluster.

    kubectl apply -f ./deployment.yaml
    

    Met deze opdracht moet een resultaat worden uitgevoerd dat vergelijkbaar is met het volgende voorbeeld.

    deployment.apps/contoso-website created
    
  2. Voer de kubectl get deploy-opdracht uit om te controleren of de implementatie is geslaagd.

    kubectl get deploy contoso-website
    

    Met deze opdracht moet een tabel worden uitgevoerd dat vergelijkbaar is met het volgende voorbeeld.

    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    contoso-website   0/1     1            0           16s
    
  3. Voer de kubectl get pods-opdracht uit om te controleren of de pod wordt uitgevoerd.

    kubectl get pods
    

    Met deze opdracht moet een tabel worden uitgevoerd dat vergelijkbaar is met het volgende voorbeeld.

    NAME                               READY   STATUS    RESTARTS   AGE
    contoso-website-7c58c5f699-r79mv   1/1     Running   0          63s