Exercício – Implementar uma aplicação no seu cluster do Azure Kubernetes Service

Concluído

Neste exercício, implante o site da sua empresa como um aplicativo de teste no Serviço Kubernetes do Azure (AKS). O site é estático e tem uma pilha de tecnologia subjacente de HTML, CSS e JavaScript. Não recebe tantos pedidos como os outros serviços e fornece-nos a forma mais segura de testar opções de implementação.

Nota

O código da aplicação Web está disponível neste repositório do GitHub se quiser explorar o código fonte em maior detalhe. Além disso, esse aplicativo de exemplo será implantado somente em um pool de nós Linux.

Importante

Precisa da sua própria subscrição do Azure para executar este exercício e poderá incorrer em custos. Se ainda não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

Criar um manifesto de implementação

Irá criar um ficheiro de manifesto de implementação para implementar a sua aplicação. O ficheiro de manifesto permite-lhe definir que tipo de recurso quer implementar e todos os detalhes associados à carga de trabalho.

O Kubernetes agrupa contentores em estruturas lógicas denominadas pods, que não possuem informações. As implementações adicionam as informações em falta para criar a sua aplicação. Vamos criar um ficheiro de implementação.

  1. Entre no Azure Cloud Shell.

  2. No Cloud Shell, crie um ficheiro de manifesto para a implementação do Kubernetes chamado deployment.yaml através do editor integrado.

    touch deployment.yaml
    
  3. Abra o editor integrado no Cloud Shell ao introduzir code .

  4. Abra o ficheiro deployment.yaml e adicione a seguinte secção de código de YAML.

    # 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
    

    No código acima, adicionou as duas primeiras chaves para indicar ao Kubernetes os campos apiVersion e kind de manifesto que está a criar. O campo name é o nome da implementação. Use-o para identificar e consultar as informações de implantação quando você usar kubectlo .

    Gorjeta

    Para obter mais informações sobre apiVersion e quais os valores a colocar nesta chave, veja a documentação oficial do Kubernetes. Encontrará uma ligação no final deste módulo.

  5. Uma implementação encapsula um pod. O utilizador dá uso a uma definição de modelo para definir as informações do pod dentro do ficheiro de manifesto. O modelo é colocado no ficheiro de manifesto por baixo da secção de especificações de implementação.

    Atualize o ficheiro deployment.yaml para corresponder ao YAML seguinte.

    # 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
    

    Os pods não usam os mesmos nomes das implantações. O nome do pod é uma mistura do nome da implantação com um ID aleatório adicionado ao final.

    Repare na utilização da chave labels. Adiciona a chave labels para permitir que as implementações encontrem e agrupem os pods.

  6. Um pod encapsula um ou mais contentores. Todos os pods têm uma secção de especificações que lhe permite definir os contentores dentro desse pod.

    Atualize o ficheiro deployment.yaml para corresponder ao YAML seguinte.

    # 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
    

    A chave containers é uma matriz das especificações de contentores, pois um pod pode ter um ou mais contentores. A especificação define um image, a name, , portsresourcese outras informações importantes sobre o recipiente.

    Todos os pods em execução seguem o nome contoso-website-<UUID>, onde UUID é um ID gerado para identificar todos os recursos exclusivamente.

  7. É uma boa prática definir uma quantidade mínima e máxima de recursos que o aplicativo pode usar do cluster. Utiliza a chave resources para especificar estas informações.

    Atualize o ficheiro deployment.yaml para corresponder ao YAML seguinte.

    # 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
    

    Observe como a secção de recursos lhe permite especificar a quantidade mínima de recursos como um pedido e a quantidade máxima de recursos como um limite.

  8. A última etapa é definir as portas que esse contêiner expõe externamente através da ports chave. A chave ports é uma matriz dos objetos, o que significa que um contentor num pod pode expor múltiplas portas com múltiplos nomes.

    Atualize o ficheiro deployment.yaml para corresponder ao YAML seguinte.

    # 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
    

    Repare como é atribuído o nome à porta com a chave name. Atribuir nomes às portas permite-lhe alterar a porta exposta sem alterar os ficheiros que referenciam essa porta.

  9. Por fim, adicione uma seção seletora para definir as cargas de trabalho gerenciadas pela implantação. A chave selector é colocada dentro da secção de especificações de implementação do ficheiro de manifesto. Utilize a chave matchLabels para listar as etiquetas de todos os pods geridos pela implementação.

    Atualize o ficheiro deployment.yaml para corresponder ao YAML seguinte.

    # 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
    

    Nota

    Em um cluster AKS que tem vários pools de nós (Linux e Windows), o arquivo de manifesto de implantação listado anteriormente também define um para dizer ao cluster AKS para executar o pod do aplicativo de exemplo em um nodeSelector nó que possa executar contêineres Linux.

    Os nós Linux não podem executar contêineres do Windows e vice-versa.

  10. Guarde o ficheiro de manifesto e feche o editor.

Aplicar o manifesto

  1. No Cloud Shell, execute o comando kubectl apply para submeter o manifesto de implementação ao seu cluster.

    kubectl apply -f ./deployment.yaml
    

    O comando deve ter um resultado semelhante ao do seguinte exemplo.

    deployment.apps/contoso-website created
    
  2. Execute o comando kubectl get deploy para verificar se a implementação foi concluída com êxito.

    kubectl get deploy contoso-website
    

    O comando deve apresentar uma tabela semelhante à do seguinte exemplo.

    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    contoso-website   0/1     1            0           16s
    
  3. Execute o comando kubectl get pods para verificar se o pod está em execução.

    kubectl get pods
    

    O comando deve apresentar uma tabela semelhante à do seguinte exemplo.

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