Quickstart: Implementar um cluster Azure Container Linux (ACL) Azure Kubernetes Service (AKS) usando a CLI do Azure

Neste guia de início rápido, utiliza a CLI do Azure para criar um cluster do Azure Kubernetes Service (AKS) que utiliza o Azure Container Linux (ACL) como sistema operativo (SO) dos nós. Depois de implementar o cluster, liga-se ao mesmo utilizando kubectl e verifica se os nós ACL estão a funcionar como esperado.

Considerações e limitações

Antes de começar, reveja as seguintes considerações e limitações para o ACL:

Pré-requisitos

Note

Pode usar Azure Cloud Shell ou uma instalação local do CLI do Azure para executar os comandos neste quickstart.

Registe o fornecedor de recursos Microsoft.ContainerService

Talvez seja necessário registrar provedores de recursos em sua assinatura do Azure. Verifique o status do registro usando o az provider show comando.

az provider show --namespace Microsoft.ContainerService --query registrationState

Se necessário, registar o fornecedor de recursos usando o az provider register comando.

az provider register --namespace Microsoft.ContainerService

Criar um grupo de recursos

Um grupo de recursos do Azure é um grupo lógico, no qual os recursos do Azure são implementados e geridos. Ao criar um grupo de recursos, você precisa especificar um local. Esta localização é:

  • O local de armazenamento dos metadados do grupo de recursos.
  • Onde seus recursos serão executados no Azure se você não especificar outra região ao criar um recurso.

Crie um grupo de recursos usando o comando az group create. O exemplo seguinte define variáveis de ambiente para o nome do grupo de recursos, região e nome do cluster AKS, criando depois um grupo de recursos na localização especificada. Podes substituir os valores das variáveis de ambiente pelos teus próprios nomes e regiões preferidas.

export MY_RESOURCE_GROUP_NAME="myACLResourceGroup"
export REGION="westus"
export MY_AKS_CLUSTER_NAME="myACLCluster"

az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION

Exemplo de saída:

{
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myACLResourceGroup",
  "location": "westus",
  "managedBy": null,
  "name": "myACLResourceGroup",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Criar um cluster ACL

Crie um cluster AKS usando o az aks create comando com o --os-sku AzureContainerLinux parâmetro para provisionar o cluster AKS com uma imagem ACL.

az aks create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $MY_AKS_CLUSTER_NAME \
  --os-sku AzureContainerLinux \
  --node-count 3 \
  --generate-ssh-keys

Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.

Ligar ao cluster

Para gerenciar um cluster Kubernetes, use o cliente de linha de comando Kubernetes, kubectl. kubectl já está instalado se usares Azure Cloud Shell. Para instalar kubectl localmente, use o az aks install-cli comando.

  1. Configure kubectl para se conectar ao cluster do Kubernetes usando o az aks get-credentials comando. Este comando baixa credenciais e configura a CLI do Kubernetes para usá-las.

    az aks get-credentials --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_AKS_CLUSTER_NAME
    
  2. Verifique a conexão ao seu cluster utilizando o comando kubectl get. Este comando devolve uma lista dos nodes do cluster.

    kubectl get nodes
    

Implementar a aplicação

Para implementar a aplicação, utiliza-se um ficheiro manifesto para criar todos os objetos necessários para executar a aplicação AKS Store. Um arquivo de manifesto do Kubernetes define o estado desejado de um cluster, como quais imagens de contêiner devem ser executadas. O manifesto inclui as seguintes implantações e serviços do Kubernetes:

  • Vitrine: aplicativo Web para que os clientes visualizem produtos e façam pedidos.
  • Serviço do produto: Mostra as informações do produto.
  • Serviço de pedidos: Faz pedidos.
  • Rabbit MQ: Fila de mensagens para processamento de pedidos.

Note

Não recomendamos a execução de contentores com estado, como o RabbitMQ, sem armazenamento persistente para produção. Eles são usados aqui para simplificar, mas recomendamos o uso de serviços gerenciados, como o Azure Cosmos DB ou o Azure Service Bus.

  1. Crie um arquivo nomeado aks-store-quickstart.yaml e copie no seguinte manifesto:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: rabbitmq
    spec:
      serviceName: rabbitmq
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env:
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    
  2. Implante o aplicativo usando o kubectl apply comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f aks-store-quickstart.yaml
    

Testar a aplicação

Você pode validar se o aplicativo está em execução visitando o endereço IP público ou a URL do aplicativo.

Obtenha a URL do aplicativo usando os seguintes comandos:

runtime="5 minutes"
endtime=$(date -ud "$runtime" +%s)
while [[ $(date -u +%s) -le $endtime ]]
do
   STATUS=$(kubectl get pods -l app=store-front -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}')
   echo "Status: $STATUS"
   if [ "$STATUS" == 'True' ]
   then
      export IP_ADDRESS=$(kubectl get service store-front --output 'jsonpath={..status.loadBalancer.ingress[0].ip}')
      echo "Service IP Address: $IP_ADDRESS"
      break
   else
      sleep 10
   fi
done
echo "http://$IP_ADDRESS"

Eliminar o cluster

Se não planeias seguir os tutoriais, limpa recursos desnecessários para evitar cobranças do Azure.

Remova o grupo de recursos, o serviço de contêiner e todos os recursos relacionados usando o az group delete comando.

az group delete --name $MY_RESOURCE_GROUP_NAME --yes --no-wait

Para saber mais sobre ACL para AKS, veja O que é Azure Container Linux (ACL) para Azure Kubernetes Service (AKS)?