Exercício – Configurar o Azure Policy para Kubernetes em um cluster do AKS

Concluído

O Azure Policy para o Kubernetes ajuda as organizações a atenderem a requisitos legais e de governança, além de implementar melhores práticas e estabelecer convenções organizacionais para os ambientes de nuvem.

As equipes de desenvolvimento da sua empresa estão adotando o AKS (Serviço de Kubernetes do Azure) como uma plataforma de desenvolvimento. Você percebe que a melhor maneira de gerenciar custos é implementar regras de negócios que definam limites entre recursos e cargas de trabalho. É recomendável que você verifique se os desenvolvedores só podem implantar cargas de trabalho dentro de limites específicos de alocação de CPU e de memória. O sistema precisa impedir as cargas de trabalho que excedam esses limites.

Neste exercício, você habilitará o Azure Policy para AKS em seu cluster e adicionará a política Os limites de CPU e recursos de memória dos contêineres de cluster do Kubernetes não devem exceder os limites especificados. Em seguida, você testará se a política nega o agendamento de cargas de trabalho que excedem os parâmetros de recurso da política.

Habilitar os provedores de recursos ContainerService e PolicyInsights

  1. Entre no Azure Cloud Shell usando a sua conta do Azure. Selecione a versão Bash do Cloud Shell.

  2. O Azure Policy para AKS exige que a versão do cluster seja 1.14 ou posterior. Execute o seguinte script para validar a versão do cluster do AKS:

    az aks list
    

    Verifique se a versão do cluster relatada é a 1.14 ou posterior.

  3. Registre o provedor do Serviço de Kubernetes do Azure executando o comando az provider register:

    az provider register --namespace Microsoft.ContainerService
    
  4. Registre o provedor do Azure Policy executando o comando az provider register:

    az provider register --namespace Microsoft.PolicyInsights
    
  5. Habilite a instalação do complemento executando o comando az feature register:

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. Verifique se o registro foi bem-sucedido consultando a tabela de lista de recursos. Use o comando az feature list para executar a consulta. O registro de recursos pode levar vários minutos para ser concluído e, portanto, você precisará verificar o resultado periodicamente.

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

    Se a sessão do Cloud Shell atingir o tempo limite, você poderá acompanhar o processo de registro por meio do portal do Azure usando o painel de integração da versão prévia.

  7. Execute o comando az provider register para propagar a atualização depois de confirmar que o comando de consulta da lista de recursos mostra 'Registrado':

    az provider register -n Microsoft.ContainerService
    

Habilitar o Azure Policy no seu cluster

  1. Execute o comando az aks enable-addons para habilitar o complemento azure-policy para o cluster:

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. Verifique se o pod da política do Azure está instalado no namespace kube-system e se o pod do Gatekeeper está instalado no namespace gatekeeper-system. Para fazer isso, execute os seguintes comandos kubectl get pods:

    kubectl get pods -n kube-system
    

    A saída deve ser semelhante ao seguinte:

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    A saída deve ser semelhante ao seguinte:

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. Por fim, verifique se o complemento mais recente está instalado executando o comando az aks show. Esse comando recupera as informações de configuração do cluster.

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    A saída deve ser semelhante ao seguinte:

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    Agora você já pode voltar ao portal do Azure e configurar a política chamada Os limites de recursos de memória e de CPU dos contêineres de cluster do Kubernetes não devem exceder os limites especificados.

Atribuir uma definição de política interna

Para configurar o novo Azure Policy, use o serviço Policy no portal do Azure.

  1. Entre no portal do Azure.

  2. Localize o serviço Policy no portal do Azure. Para fazer isso, na barra de pesquisa na parte superior do portal do Azure, pesquise Política e selecione essa opção.

  3. Selecione o serviço Policy na lista de serviços, conforme mostrado aqui:

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    O dashboard do Policy é aberto com uma visão geral que mostra todas as políticas atribuídas e o status dos recursos e como as políticas os afetam. Se você não tiver atribuído nenhuma política, o painel de controle estará vazio.

  4. No painel do menu esquerdo, em Criação, selecione Atribuições:

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. Lembre-se da nossa descrição anterior, mostrando que há duas opções para criar uma atribuição de política: você pode atribuir uma iniciativa ou uma política. Na barra de menus superior, selecione Atribuir política:

    Screenshot that shows the new policy assignment option.

    O painel Atribuir política é exibido.

  6. Na guia Informações Básicas, insira os valores a seguir para cada configuração a fim de criar a sua política.

    Setting Valor
    Escopo
    Escopo Selecione o botão de reticências. O painel Escopo é exibido. Em assinatura, selecione a assinatura que contém o seu grupo de recursos. Para Grupo de recursos, selecione rg-akscostsaving e, em seguida, selecione o botão Selecionar.
    Exclusões Deixe em branco.
    Noções básicas
    Definição de política Selecione o botão de reticências. O painel Definições Disponíveis é exibido. Na caixa Pesquisa, filtre a seleção inserindo CPU. Na guia Definições de política, selecione a política Os limites de CPU e recursos de memória de contêineres de cluster do Kubernetes não devem exceder os limites especificados e, em seguida, selecione Adicionar.
    Nome da atribuição Aceite o padrão.
    Descrição Deixe em branco.
    Aplicação de políticas Verifique se essa opção está definida como Habilitada.
    Atribuída por Aceite o padrão.

    Aqui está um exemplo da guia Informações Básicas preenchida:

    Screenshot that shows the information captured in the Basics tab.

  7. Selecione a guia Parâmetros para especificar os parâmetros da política.

  8. Defina os seguintes valores para cada uma das configurações de parâmetros:

    Setting Valor
    Máximo de unidades de CPU permitidas Defina o valor como 200m. A política corresponde esse valor ao valor da solicitação de recurso da carga de trabalho e ao valor limite da carga de trabalho, conforme especificado no arquivo de manifesto da carga de trabalho.
    Máximo de bytes de memória permitidos Defina o valor como 256Mi. A política corresponde esse valor ao valor da solicitação de recurso da carga de trabalho e ao valor limite da carga de trabalho, conforme especificado no arquivo de manifesto da carga de trabalho.

    Aqui está um exemplo da guia Parâmetros preenchida:

    Screenshot that shows the information captured in the Parameters tab.

  9. Selecione a guia Correção. Nesta guia, você selecionará como a nova política afeta os recursos que já existem. Por padrão, a nova política verifica apenas os recursos recém-criados. Mantenha a configuração básica padrão.

    Aqui está um exemplo da guia Correção preenchida:

    Screenshot that shows the information captured in the Remediation tab.

  10. Selecione a guia Examinar + criar. Examine os valores escolhidos e selecione Criar.

Importante

Se você estiver usando um cluster do AKS existente, a atribuição de política poderá levar cerca de 15 minutos para ser aplicada.

Testar as solicitações de recursos

A etapa final é testar a nova política. Implante sua carga de trabalho de teste com solicitações de recursos e limites que violem a nova política. Se tudo correr corretamente, o servidor retornará um erro informando negado pela política.

  1. Abra o Azure Cloud Shell e selecione a versão Bash do Cloud Shell.

  2. Crie um arquivo de manifesto para a implantação do Kubernetes usando o editor integrado. Chame o arquivo test-policy.yaml:

    code test-policy.yaml
    

    Dica

    O Cloud Shell inclui um editor de arquivos integrado. O editor do Cloud Shell dá suporte a recursos como o realce de linguagem, a paleta de comandos e um explorador de arquivos. Para criação e edição de arquivo simples, inicie o editor executando code . no terminal do Cloud Shell. Essa ação abre o editor com o diretório de trabalho ativo definido no terminal. Para abrir o arquivo de manifesto diretamente para edição rápida, execute code test-policy.yaml. Esse comando abre o editor sem o explorador de arquivos.

  3. Cole o seguinte texto no arquivo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Pressione Ctrl+S para salvar o arquivo e pressione Ctrl+Q para fechar o editor.

  5. Execute o comando kubectl apply para aplicar a configuração e implantar o aplicativo no namespace costsavings:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Sua saída deve ser semelhante ao seguinte:

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    Observe como o webhook de admissão, validation.gatekeeper.sh, negou a solicitação para agendar o pod.

  6. Abra o arquivo de manifesto e corrija a solicitação de recurso:

    code test-policy.yaml
    

    Substitua o texto pelo seguinte texto:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Pressione Ctrl+S para salvar o arquivo e pressione Ctrl+Q para fechar o editor.

  8. Execute o comando kubectl apply para aplicar a configuração e implantar o aplicativo no namespace costsavings:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Você obterá a seguinte saída:

    pod/nginx created
    
  9. Observe os pods recém-criados no seu namespace de costsavings.

    kubectl get pods --namespace costsavings
    

    Em poucos segundos, os pods fazem a transição para o estado Running.

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Pressione Ctrl+C para parar de observar assim que você perceber que os pods estão em execução.