Criar um contêiner do Windows Server em um cluster do AKS (Serviço de Kubernetes do Azure) usando a CLI do Azure

O AKS (Serviço de Kubernetes do Azure) é um serviço de Kubernetes gerenciado que permite implantar e gerenciar clusters rapidamente. Neste artigo, você implantará um cluster do AKS que executa contêineres do Windows Server 2019 usando a CLI do Azure. Também implanta um aplicativo de exemplo do ASP.NET em um contêiner do Windows Server para o cluster.

Captura de tela que mostra a navegação para o aplicativo de exemplo do ASP.NET.

Este artigo pressupõe uma compreensão básica dos conceitos do Kubernetes. Para obter mais informações, confira Principais conceitos do Kubernetes para o AKS (Serviço de Kubernetes do Azure).

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

  • Este artigo exige a versão 2.0.64 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.

  • A identidade que você está usando para criar o cluster tem as permissões mínimas apropriadas. Para obter mais detalhes sobre acesso e identidade do AKS, consulte Opções de acesso e identidade para o AKS (Serviço de Kubernetes do Azure).

  • Se tiver várias assinaturas do Azure, selecione a ID da assinatura adequada para cobrança dos recursos usando o comando az account.

Limitações

As seguintes limitações se aplicam quando você cria e gerencia clusters do AKS com suporte a vários pools de nós:

  • Não é possível excluir o primeiro pool de nós.

As seguintes limitações adicionais se aplicam aos pools de nós do Windows Server:

  • O cluster AKS pode ter um máximo de dez pools de nós.
  • O cluster AKS pode ter um máximo de 100 nós em cada pool de nós.
  • O nome do pool de nós do Windows Server tem um limite de seis caracteres.

Criar um grupo de recursos

Um grupo de recursos do Azure é um grupo lógico no qual os recursos do Azure são implantados e gerenciados. Ao criar um grupo de recursos, você é solicitado a especificar um local. Essa é a localização na qual os metadados do grupo de recursos são armazenados e na qual os recursos são executados no Azure, caso você não especifique outra região durante a criação de recursos. Crie um grupo de recursos usando o comando az group create.

O exemplo a seguir cria um grupo de recursos chamado myResourceGroup no local eastus.

Observação

Este artigo usa a sintaxe do Bash para os comandos deste tutorial. Se você estiver usando o Azure Cloud Shell, verifique se a lista suspensa no canto superior esquerdo da janela do Cloud Shell está definida como Bash.

az group create --name myResourceGroup --location eastus

A seguinte saída de exemplo mostra o grupo de recursos criado com êxito:

{
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
  "location": "eastus",
  "managedBy": null,
  "name": "myResourceGroup",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": null
}

Criar um cluster AKS

Para executar um cluster AKS que dá suporte a pools de nós para contêineres do Windows Server, o cluster precisa usar uma política de rede que usa plug-in de rede CNI do Azure (avançado). Para obter informações mais detalhadas para ajudar a planejar os intervalos de sub-rede e as considerações de rede necessárias, confira configurar a rede do CNI do Azure. Use o comando az aks create para criar um cluster do AKS chamado myAKSCluster. Esse comando criará os recursos de rede necessários, caso ainda não existam.

  • O cluster está configurado com dois nós.
  • Os parâmetros --windows-admin-password e --windows-admin-username definem as credenciais de administrador para qualquer nó do Windows Server no cluster e devem atender aos requisitos de senha do Windows Server. Se o parâmetro --windows-admin-password não for especificado, será solicitado que você forneça um valor.
  • O pool de nós usa VirtualMachineScaleSets.

Observação

Para verificar se o seu cluster está operando de maneira confiável, execute pelo menos dois nós no pool de nós padrão.

Crie um nome de usuário para usá-lo como as credenciais de administrador nos nós do Windows Server no seu cluster. Os comandos a seguir solicitam um nome de usuário e o definem como WINDOWS_USERNAME para uso em um comando posterior (lembre-se de que os comandos deste artigo são inseridos em um shell do Bash).

echo "Please enter the username to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_USERNAME

Crie o seu cluster e não deixe de especificar o parâmetro --windows-admin-username. O comando de exemplo a seguir cria um cluster usando o valor WINDOWS_USERNAME definido no comando anterior. Como alternativa, você pode fornecer um nome de usuário diferente diretamente no parâmetro, em vez de usar WINDOWS_USERNAME. O comando a seguir também solicitará que você crie uma senha para as credenciais de administrador dos nós do Windows Server no seu cluster. Como alternativa, você pode usar o parâmetro --windows-admin-password e especificar ali seu próprio valor.

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 2 \
    --enable-addons monitoring \
    --generate-ssh-keys \
    --windows-admin-username $WINDOWS_USERNAME \
    --vm-set-type VirtualMachineScaleSets \
    --network-plugin azure

Observação

Se você receber um erro de validação de senha, verifique se a senha que você definiu atende aos requisitos de senha do Windows Server. Se a senha atender aos requisitos, tente criar o grupo de recursos em outra região. Em seguida, tente criar o cluster com o novo grupo de recursos.

Se você não especificar um nome de usuário e senha do administrador ao definir --vm-set-type VirtualMachineScaleSets e --network-plugin azure, o nome de usuário será definido como azureuser e a senha será definida como um valor aleatório.

O nome de usuário do administrador não pode ser alterado, mas você pode alterar a senha de administrador que o cluster do AKS usa para nós do Windows Server usando az aks update. Para obter mais detalhes, confira Perguntas frequentes sobre pools de nós do Windows Server.

Após alguns minutos, o comando será concluído e retornará informações no formato JSON sobre o cluster. Ocasionalmente, o cluster pode levar mais de alguns minutos para ser provisionado. Aguarde até dez minutos nesses casos.

Adicionar um pool de nós do Windows Server 2019

Por padrão, um cluster AKS é criado com um pool de nós que pode executar contêineres do Linux. Use o comando az aks nodepool add para adicionar mais um pool de nós que pode executar contêineres do Windows Server juntamente com o pool de nós do Linux.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --os-type Windows \
    --name npwin \
    --node-count 1

O comando acima cria um pool de nós chamado npwin e o adiciona ao myAKSCluster. O comando acima também usa a sub-rede padrão na VNet padrão criada durante a execução de az aks create.

Adicionar um pool de nós do Windows Server 2022 (versão prévia)

Ao criar um pool de nós do Windows, o sistema operacional padrão será Windows Server 2019. Para usar nós do Windows Server 2022, você precisará especificar um tipo de SKU do SO de Windows2022.

Importante

As versões prévias do recurso AKS estão disponíveis em uma base de autoatendimento e aceitação. As versões prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

Instalar a extensão aks-preview

Você também precisa de aks-preview, a extensão da CLI do Azure versão 0.5.68 ou posterior. Instale a extensão da CLI do Azure aks-preview usando o comando az extension add ou instale qualquer atualização disponível usando o comando az extension update.

# Install the aks-preview extension
az extension add --name aks-preview
# Update the extension to make sure you have the latest version installed
az extension update --name aks-preview

Registrar a versão prévia do recurso AKSWindows2022Preview

Para usar o recurso, você também deve habilitar o sinalizador de recursos AKSWindows2022Preview em sua assinatura.

Registre o sinalizador de recursos AKSWindows2022Preview usando o comando az feature register, conforme mostrado no seguinte exemplo:

az feature register --namespace "Microsoft.ContainerService" --name "AKSWindows2022Preview"

Demora alguns minutos para o status exibir Registrado. Verifique o status do registro usando o comando lista de funcionalidades az.

az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKSWindows2022Preview')].{Name:name,State:properties.state}"

Quando estiver pronto, atualize o registro do provedor de recursos Microsoft.ContainerService usando o comando az provider register:

az provider register --namespace Microsoft.ContainerService

Use o comando az aks nodepool add para adicionar um pool de nós do Windows Server 2022:

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --os-type Windows \
    --os-sku Windows2022 \ 
    --name npwin \
    --node-count 1

Opcional: usar containerd com pools de nós do Windows Server

A partir do Kubernetes versão 1.20 e superior, você pode especificar containerd como o runtime de contêiner para pools de nós do Windows Server 2019. Começando no Kubernetes 1.23, o contêiner será o runtime de contêiner padrão do Windows.

Importante

Ao usar containerd com pools de nós do Windows Server 2019:

  • O painel de controle e os pools de nós do Windows Server 2019 devem usar o Kubernetes versão 1.20 ou superior.
  • Ao criar ou atualizar um pool de nós para executar contêineres do Windows Server, o valor padrão para --node-vm-size é Standard_D2s_v3 que era o tamanho mínimo recomendado para pools de nós do Windows Server 2019 antes do Kubernetes 1.20. O tamanho mínimo recomendado para pools de nós do Windows Server 2019 usando containerd é Standard_D4s_v3. Ao definir o parâmetro --node-vm-size, confira a lista de tamanhos de VM restritos.
  • É altamente recomendável que você use taints ou rótulos com seus pools de nós do Windows Server 2019 que executam containerd e tolerations ou seletores de nós com suas implantações para garantir que as cargas de trabalho sejam agendadas corretamente.

Adicionar um pool de nós do Windows Server com containerd

Use o comando az aks nodepool add para adicionar um pool de nós que pode executar contêineres do Windows Server com o runtime containerd.

Observação

Se você não especificar o cabeçalho personalizado WindowsContainerRuntime=containerd, o pool de nós usará o Docker como o runtime do contêiner.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --os-type Windows \
    --name npwcd \
    --node-vm-size Standard_D4s_v3 \
    --kubernetes-version 1.20.5 \
    --aks-custom-headers WindowsContainerRuntime=containerd \
    --node-count 1

O comando acima cria um novo pool de nós do Windows Server usando containerd como o runtime chamado npwcd e adiciona-o ao myAKSCluster. O comando acima também usa a sub-rede padrão na VNet padrão criada durante a execução de az aks create.

Atualizar um pool de nós do Windows Server existente para containerd

Use o comando az aks nodepool upgrade para atualizar um pool de nós específico do Docker para containerd.

az aks nodepool upgrade \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name npwd \
    --kubernetes-version 1.20.7 \
    --aks-custom-headers WindowsContainerRuntime=containerd

O comando acima atualiza um pool de nós chamado npwd para o runtime containerd.

Para atualizar todos os pools de nós existentes em um cluster para usar o runtime containerd para todos os pools de nós Windows Server:

az aks upgrade \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --kubernetes-version 1.20.7 \
    --aks-custom-headers WindowsContainerRuntime=containerd

O comando acima atualiza todos pools de nós Windows Server no runtime myAKSCluster para usar o runtime containerd.

Observação

Depois de atualizar todos os pools de nós Windows Server existentes para usar o runtime containerd, o Docker ainda será o runtime padrão ao adicionar novos pools de nós Windows Server.

Conectar-se ao cluster

Para gerenciar um cluster do Kubernetes, use kubectl, o cliente de linha de comando do Kubernetes. Se você usar o Azure Cloud Shell, o kubectl já estará instalado. Para instalar o kubectl localmente, use o comando az aks install-cli:

az aks install-cli

Para configurar o kubectl para se conectar ao cluster do Kubernetes, use o comando az aks get-credentials. Este comando baixa as credenciais e configura a CLI do Kubernetes para usá-las.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Para verificar a conexão com o cluster, use o comando kubectl get para retornar uma lista dos nós de cluster.

kubectl get nodes -o wide

A saída de exemplo a seguir mostra todos os nós no cluster. Verifique se o status de todos os nós é Pronto:

NAME                                STATUS   ROLES   AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION     CONTAINER-RUNTIME
aks-nodepool1-12345678-vmss000000   Ready    agent   34m    v1.20.7   10.240.0.4    <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aks-nodepool1-12345678-vmss000001   Ready    agent   34m    v1.20.7   10.240.0.35   <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aksnpwcd123456                      Ready    agent   9m6s   v1.20.7   10.240.0.97   <none>        Windows Server 2019 Datacenter   10.0.17763.1879    containerd://1.4.4+unknown
aksnpwin987654                      Ready    agent   25m    v1.20.7   10.240.0.66   <none>        Windows Server 2019 Datacenter   10.0.17763.1879    docker://19.3.14

Observação

O runtime do contêiner para cada pool de nós é mostrado em CONTAINER-RUNTIME. Observe que aksnpwin987654 começa com docker://, o que significa que ele está usando Docker para o runtime do contêiner. Observe que aksnpwcd123456 começa com containerd://, o que significa que ele está usando containerd para o runtime do contêiner.

Implantar o aplicativo

Um arquivo de manifesto do Kubernetes define um estado desejado para o cluster, como as imagens de contêiner a serem executadas. Neste artigo, um manifesto é usado para criar todos os objetos necessários para executar o aplicativo de exemplo ASP.NET em um contêiner do Windows Server. Esse manifesto inclui uma implantação do Kubernetes para o aplicativo de exemplo ASP.NET e um serviço do Kubernetes externo para acessar ao aplicativo da Internet.

O aplicativo de exemplo ASP.NET é fornecido como parte das Amostras .NET Framework e é executado em um contêiner do Windows Server. O AKS requer que os contêineres do Windows Server sejam baseados em imagens do Windows Server 2019 ou posterior. O arquivo de manifesto Kubernetes também deve definir um seletor de nó para instruir o cluster AKS a executar o pod de seu aplicativo de exemplo ASP.NET em um nó que possa executar contêineres do Windows Server.

Crie um arquivo chamado sample.yaml e copie a definição YAML a seguir. Se você usar o Azure Cloud Shell, esse arquivo poderá ser criado usando code, vi ou nano, como se você estivesse trabalhando em um sistema físico ou virtual:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample
  labels:
    app: sample
spec:
  replicas: 1
  template:
    metadata:
      name: sample
      labels:
        app: sample
    spec:
      nodeSelector:
        "kubernetes.io/os": windows
      containers:
      - name: sample
        image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp
        resources:
          limits:
            cpu: 1
            memory: 800M
        ports:
          - containerPort: 80
  selector:
    matchLabels:
      app: sample
---
apiVersion: v1
kind: Service
metadata:
  name: sample
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
  selector:
    app: sample

Implante o aplicativo usando o comando kubectl apply e especifique o nome do manifesto YAML:

kubectl apply -f sample.yaml

A seguinte saída de exemplo mostra a Implantação e o Serviço criado com êxito:

deployment.apps/sample created
service/sample created

Testar o aplicativo

Quando o aplicativo é executado, um serviço de Kubernetes expõe o front-end do aplicativo à Internet. A conclusão desse processo pode levar alguns minutos. Ocasionalmente, o serviço pode levar mais de alguns minutos para ser provisionado. Aguarde até dez minutos nesses casos.

Para monitorar o andamento, use o comando kubectl get service com o argumento --watch.

kubectl get service sample --watch

Inicialmente, o EXTERNAL-IP para o serviço de exemplo é mostrado como pendente.

NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
sample             LoadBalancer   10.0.37.27   <pending>     80:30572/TCP   6s

Quando o endereço EXTERNAL-IP for alterado de pendente para um endereço IP público real, use CTRL-C para interromper o processo de inspeção do kubectl. A seguinte saída de exemplo mostra um endereço IP público válido atribuído ao serviço:

sample  LoadBalancer   10.0.37.27   52.179.23.131   80:30572/TCP   2m

Para ver o aplicativo de exemplo em ação, abra um navegador da Web no endereço IP externo do serviço.

Captura de tela que mostra a navegação para o aplicativo de exemplo do ASP.NET.

Observação

Se você receber o erro de tempo limite de conexão ao tentar carregar a página, verifique se o aplicativo de exemplo está pronto usando o comando [kubectl get pods --watch]. Às vezes, o contêiner do Windows não será iniciado no momento em que o endereço IP externo estiver disponível.

Excluir cluster

Para evitar encargos do Azure, se você não planeja passar pelos tutoriais a seguir, use o comando az group delete para remover o grupo de recursos, o serviço de contêiner e todos os recursos relacionados.

az group delete --name myResourceGroup --yes --no-wait

Observação

Se o cluster do AKS tiver sido criado com a identidade gerenciada atribuída pelo sistema (opção de identidade padrão usada neste guia de início rápido), a identidade será gerenciada pela plataforma e não exigirá remoção.

Próximas etapas

Neste artigo, você implantou um cluster do Kubernetes e um aplicativo ASP.NET de exemplo em um contêiner do Windows Server para ele.

Para saber mais sobre o AKS e percorrer um código completo de exemplo de implantação, prossiga para o tutorial de cluster Kubernetes.