Exercício – Implantar um aplicativo no seu cluster do Serviço de Kubernetes do Azure

Concluído

Neste exercício, implante o site da sua empresa como um aplicativo de teste no AKS (Serviço de Kubernetes do Azure). O site é estático, com uma pilha de tecnologia subjacente composta por HTML, CSS e JavaScript. Ele não recebe tantas solicitações quanto os outros serviços e nos proporciona uma forma segura de testar as opções de implantação.

Observação

O código do aplicativo Web está disponível neste repositório GitHub caso deseje explorar o código-fonte mais detalhadamente. Além disso, esse aplicativo de exemplo será implantado somente em um pool de nós do Linux.

Importante

É preciso ter uma assinatura do Azure para fazer esse exercício, e isso pode gerar encargos. Caso ainda não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.

Criar um manifesto de implantação

Você cria um arquivo de manifesto de implantação para implantar seu aplicativo. O arquivo de manifesto permite que você defina o tipo de recurso que deseja implantar e todos os detalhes associados à carga de trabalho.

O Kubernetes agrupa os contêineres em estruturas lógicas chamadas pods, que não têm inteligência. As implantações adicionam a inteligência ausente para criar o seu aplicativo. Vamos criar um arquivo de implantação.

  1. Entre no Azure Cloud Shell.

  2. No Cloud Shell, crie um arquivo de manifesto para a implantação do Kubernetes chamado deployment.yaml usando o editor integrado.

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

  4. Abra o arquivo deployment.yaml e adicione a seguinte seção de código do 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
    

    Nesse código, você adicionou as duas primeiras chaves para informar ao Kubernetes o apiVersion e o kind do manifesto que você está criando. O name é o nome da implantação. Use-o para identificar e consultar as informações da implantação quando usar o kubectl.

    Dica

    Para obter mais informações sobre o apiVersion e quais valores colocar nessa chave, consulte a documentação oficial do Kubernetes. O link está localizado no final deste módulo.

  5. Uma implantação encapsula um pod. Você usa uma definição de modelo para definir as informações do pod dentro do arquivo de manifesto. O modelo é colocado no arquivo de manifesto na seção de especificação da implantação.

    Atualize o arquivo deployment.yaml para que ele corresponda ao seguinte 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
    

    Os pods não usam os mesmos nomes que as implantações. O nome do pod é uma combinação do nome da implantação com uma ID aleatória adicionada ao final.

    Observe o uso da chave labels. A chave labels é adicionada para permitir que as implantações encontrem e agrupem os pods.

  6. Um pod encapsula um ou mais contêineres. Todos os pods têm uma seção de especificação que permite a definição de contêineres dentro do pod em questão.

    Atualize o arquivo deployment.yaml para que ele corresponda ao YAML a seguir.

    # 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 de especificações de contêiner, pois um pod pode ter um ou mais contêineres. A especificação define uma image, um name, os resources, as ports e outras informações importantes sobre o contêiner.

    Todos os pods em execução seguem o nome contoso-website-<UUID>, em que a UUID é uma ID gerada para identificar todos os recursos de maneira exclusiva.

  7. É uma boa prática definir uma quantidade mínima e máxima de recursos que o aplicativo tem permissão para usar no cluster. A chave resources é usada para especificar essas informações.

    Atualize o arquivo deployment.yaml para que ele corresponda ao seguinte 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
    

    Observe como a seção de recursos permite que você especifique a quantidade mínima de recursos como uma solicitação e o valor máximo do recurso como um limite.

  8. A última etapa é definir as portas que são expostas externamente por esse contêiner por meio da chave ports. A chave ports é uma matriz de objetos, o que significa que um contêiner em um pod pode expor várias portas com vários nomes.

    Atualize o arquivo deployment.yaml para que ele corresponda ao YAML a seguir.

    # 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
    

    Observe como a porta é nomeada usando a chave name. A nomeação de portas permite que você altere a porta exposta sem alterar os arquivos que referenciam essa porta.

  9. Por fim, adicione uma seção de seletor para definir as cargas de trabalho gerenciadas pela implantação. A chave selector é colocada dentro da seção de especificação de implantação do arquivo de manifesto. Use a chave matchLabels para listar os rótulos de todos os pods gerenciados pela implantação.

    Atualize o arquivo deployment.yaml para que ele corresponda ao YAML a seguir.

    # 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
    

    Observação

    Em um cluster do 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 nodeSelector para instruir o cluster do AKS a executar o pod do aplicativo de exemplo em um nó que possa executar contêineres do Linux.

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

  10. Salve o arquivo de manifesto e feche o editor.

Aplicar o manifesto

  1. No Cloud Shell, execute o comando kubectl apply para enviar o manifesto de implantação ao cluster.

    kubectl apply -f ./deployment.yaml
    

    O comando vai gerar um resultado semelhante ao exemplo a seguir.

    deployment.apps/contoso-website created
    
  2. Execute o comando kubectl get deploy para verificar se a implantação foi bem-sucedida.

    kubectl get deploy contoso-website
    

    O comando vai gerar uma tabela semelhante ao exemplo a seguir.

    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 vai gerar uma tabela semelhante ao exemplo a seguir.

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