Exercício - Configurar a Política do Azure para Kubernetes em um cluster AKS

Concluído

A Política do Azure para Kubernetes ajuda as organizações a atender aos requisitos legais e de governança, implementar práticas recomendadas e estabelecer convenções organizacionais para ambientes de nuvem.

As equipas de desenvolvimento da sua empresa estão a adotar o Serviço Kubernetes do Azure (AKS) como uma plataforma de desenvolvimento. Você percebe que a melhor maneira de gerenciar custos é aplicando regras de negócios que definem limites de recursos de carga de trabalho. Você deseja garantir que os desenvolvedores possam implantar cargas de trabalho somente dentro de limites específicos para alocação de CPU e memória. O sistema deve evitar cargas de trabalho que excedam esses limites.

Neste exercício, irá ativar a Política do Azure para AKS no seu cluster e adicionar a política , onde os limites de recursos de CPU e memória dos contêineres do cluster 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 recursos da política.

Ative os provedores de recursos ContainerService e PolicyInsights

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

  2. A Política do Azure para AKS requer que a versão do cluster seja 1.14 ou posterior. Execute o seguinte script para validar a versão do cluster AKS:

    az aks list
    

    Certifique-se de que a versão do cluster relatada é 1.14 ou posterior.

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

    az provider register --namespace Microsoft.ContainerService
    
  4. Registre o provedor de Política do Azure 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 do recurso pode levar vários minutos para ser concluído, então você tem que 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 expirar, poderá acompanhar o processo de registo por meio do portal do Azure usando o painel de pré-visualização de integração do .

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

    az provider register -n Microsoft.ContainerService
    

Habilitar a Política do Azure em 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 azure-policy está instalado no namespace kube-system e se o pod gatekeeper está instalado no namespace gatekeeper-system. Para fazer isso, execute os seguintes comandos kubectl get pods:

    kubectl get pods -n kube-system
    

    Sua saída deve ser semelhante à 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
    

    Sua saída deve ser semelhante à seguinte:

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. Finalmente, verifique se o complemento mais recente está instalado executando az aks show comando. Este 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"
    

    O seu resultado deve ser semelhante ao seguinte:

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

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

Atribuir uma definição de política interna

Para configurar a nova Política do Azure, use o serviço Política no portal do Azure.

  1. Inicie sessão no portal do Azure.

  2. Localize o serviço Policy no portal do Azure. Para tal, na barra de pesquisa no topo do portal, procure e selecione Política.

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

    Captura de ecrã da caixa de pesquisa geral do portal do Azure com um resultado que mostra o serviço de Política do Azure.

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

  4. No painel de menu esquerdo, sob Autor, selecione Atribuições:

    Captura de tela do painel de navegação do serviço de política que mostra o local da opção Atribuições.

  5. Lembre-se, a partir de nossa descrição anterior, de que você tem duas opções para criar uma atribuição de política: você atribui uma iniciativa ou uma política. Na barra de menu superior, selecione Atribuir política:

    Captura de tela que mostra a nova opção de atribuição de política.

    O painel Atribuir política é exibido.

  6. Na guia Noções básicas, insira os seguintes valores para cada configuração para criar a sua diretriz.

    Cenário Valor
    Âmbito
    Âmbito de aplicação Selecione o botão de reticências. O painel Escopo é exibido. Em de subscrição , selecione a subscrição que contém o seu grupo de recursos. Para o Grupo de Recursos , selecione rg-akscostsaving e, em seguida, clique no botão Selecionar.
    Exclusões Deixe vazio.
    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 de pesquisa , filtre a seleção inserindo CPU. Na guia Definições de Política, selecione a os limites de recursos de CPU e memória dos contêineres de cluster do Kubernetes não devem exceder os limites especificadose, em seguida, selecione Adicionar.
    Nome da atribuição Aceitar padrão.
    Descrição Deixe vazio.
    Aplicação de políticas Certifique-se de que esta opção está definida como Ativado.
    Atribuído por Aceitar valor padrão.

    Aqui está um exemplo da guia Noções básicas concluída:

    Captura de tela que mostra as informações capturadas na guia Noções básicas.

  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âmetro:

    Configuração Valor
    Máximo de unidades de CPU permitidas Defina o valor como 200m. A política alinha esse valor tanto ao valor de pedido de recursos da carga de trabalho quanto ao valor de limite especificado no arquivo de manifesto dessa carga de trabalho.
    Max bytes de memória permitidos Defina o valor como 256Mi. A política alinha este valor tanto ao valor de solicitação de recursos da carga de trabalho, quanto ao valor-limite especificado no ficheiro de manifesto da carga de trabalho.

    Aqui está um exemplo da guia de Parâmetros concluída:

    Captura de tela que mostra as informações capturadas na guia Parâmetros.

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

    Aqui está um exemplo da guia de remediação concluída:

    Captura de tela que mostra as informações capturadas na guia Remediação.

  10. Selecione o separador Rever e criar. Revise os valores que escolheu e, em seguida, selecione Criar.

Importante

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

Testar solicitações de recursos

O último passo é testar a nova política. Implante sua carga de trabalho de teste com solicitações de recursos e limites que violam a nova política. Se tudo correr conforme esperado, o servidor retornará um erro indicando que foi negado por política.

  1. Abra o Azure Cloud Shell e certifique-se de selecionar 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 suporta recursos como realce de idioma, paleta de comandos e um explorador de arquivos. Para criação e edição simples de arquivos, inicie o editor executando code . no terminal Cloud Shell. Esta 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. O comando Ths 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, em seguida, 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 à 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 o pedido de agendamento do pod.

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

    code test-policy.yaml
    

    Substitua o texto pelo seguinte:

    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, em seguida, 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. Obtenha os pods dos pods recém-criados em seu namespace costsavings.

    kubectl get pods --namespace costsavings
    

    Em poucos segundos, os pods transitam para o estado Running.

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Pressione Ctrl+C para parar de monitorizar quando vir os pods em execução.