Exercício – atribuir uma política a um cluster dos serviços do Kubernetes do Azure

Concluído

Agora você está pronto para configurar as políticas e iniciativas do Azure para o cluster do AKS (Serviço de Kubernetes do Azure).

Nesta unidade, você implantará um pod sem conformidade e aplica uma Política do Azure que impõe o uso apenas de registros confiáveis. Em seguida, você implantará outro pod sem conformidade para ver o efeito da Política. Você aprenderá as etapas para solucionar problemas e ver por que os pods não estão sendo criados. Você também vai implantar a iniciativa de Padrões restritos de segurança do pod de cluster do Kubernetes para cargas de trabalho baseadas em Linux.

Observação

Este exercício é opcional. Para concluir este exercício, será necessário criar uma assinatura do Azure antes de começar. Se você não tiver uma conta do Azure ou não quiser criar uma no momento, poderá ler as instruções para entender as informações que estão sendo apresentadas.

Implantar um pod sem conformidade no cluster

Começamos implantando uma imagem diretamente do Docker Hub no cluster. A primeira etapa é entrar no conectar.

  1. No Cloud Shell, entre no cluster do AKS.

    az aks get-credentials -n videogamecluster -g videogamerg 
    
  2. Execute o código a seguir para criar um pod simple-nginx do Docker Hub.

     cat <<EOF | kubectl apply -f -
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: simple-nginx
       labels:
         app: nginx
     spec:
       selector:
         matchLabels:
           app: nginx
       template:
         metadata:
           labels:
             app: nginx
         spec:
           containers:
           - name: simple-nginx
             image: docker.io/library/nginx:stable
             resources:
               requests:
                 cpu: 100m
                 memory: 100Mi
               limits:
                 cpu: 120m
                 memory: 120Mi
             ports:
             - containerPort: 80
    EOF
    
  3. Execute o código a seguir para implantar o serviço para expor a implantação.

    cat <<EOF | kubectl create -f -
     apiVersion: v1
     kind: Service
     metadata:
       name: simple-nginx
       labels:
         app: nginx
     spec:
       type: LoadBalancer
       ports:
       - port: 80
       selector:
         app: nginx
    EOF
    
  4. Liste todos os serviços implantados.

    kubectl get services
    
  5. Copie o IP externo do serviço simple-nginx e cole-o no navegador para ver se o serviço é executado conforme o esperado.

    Se o IP externo estiver listado como <pending>, execute o comando novamente. Leva tempo para alocar um endereço IP público para sua carga de trabalho.

    Uma captura de tela mostrando o nginx em execução, que veio do Docker Hub.

Aplicar o Azure Policy ao cluster do AKS

Você implantou com sucesso sua carga de trabalho em um cluster que não tem nenhuma aplicação de política. Agora, você adicionará uma Política ao cluster e verá como isso o afeta.

Atribuir uma política

Você quer garantir que apenas as imagens de determinados registros sejam permitidas no cluster. Você precisa criar uma definição de política e atribuí-la a um escopo. Nesse caso, o escopo é nosso grupo de recursos videogamerg. As políticas podem ser criadas e atribuídas por meio do portal do Azure, do Azure PowerShell ou da CLI do Azure. Este exercício o orienta na criação de uma política no portal.

Encontre as definições de política internas para gerenciar seu cluster por meio do portal do Azure com as seguintes etapas. Nesse caso, você aplicará a política "somente imagens permitidas".

  1. Vá para a página Policy no portal do Azure.

  2. No painel esquerdo da página do Azure Policy, selecione Definições.

  3. Na caixa de listagem suspensa Categoria, use Selecionar tudo para limpar o filtro e escolha Kubernetes.

    Captura de tela mostrando o Kubernetes selecionado em categoria.

  4. Selecione a definição de política Os contêineres de cluster do Kubernetes devem usar apenas imagens permitidas.

  5. Selecione o botão Atribuir.

  6. Defina o Escopo do grupo de recursos do cluster do Kubernetes que você criou. Nesse caso, o grupo de recursos é o videogamerg.

    Captura de tela mostrando a exibição de atribuição de política.

  7. Insira o seguinte no campo Regex de imagem de contêiner permitida e selecione o botão Examinar + criar

.+\.azurecr\.io/.+$
  1. Selecione o botão Criar.

Agora que a nova política foi habilitada, você pode selecionar Atribuições para ver a Política atribuída e selecionar a atribuição de política criada.

Captura de tela mostrando a política atribuída.

A atribuição da política deve ser parecida com a imagem a seguir. O efeito é definido como negar por padrão. Isso significa que somente as imagens hospedadas no Registro de Contêiner do Azure podem ser implantadas no cluster.

Captura de tela mostrando detalhes da atribuição de política.

Atribuir uma iniciativa de política

Agora que você atribuiu sua política com sucesso, atribua uma iniciativa antes de testar as políticas. Uma iniciativa do Azure Policy é uma coleção de definições do Azure Policy ou regras que são agrupadas para um objetivo ou uma meta específica. As iniciativas do Azure simplificam o gerenciamento das suas políticas agrupando um conjunto de políticas, logicamente, como um só item.

As iniciativas podem ser atribuídas da mesma maneira que as políticas. Siga essas etapas para atribuir a iniciativa "Padrões restritos de segurança do pod de cluster do Kubernetes para cargas de trabalho baseadas em Linux".

  1. Volte para a página Policy no portal do Azure.
  2. No painel esquerdo da página do Azure Policy, selecione Definições.
  3. Na caixa de listagem suspensa Categoria, use Selecionar tudo para limpar o filtro e escolha Kubernetes.
  4. Selecione a definição de iniciativa Padrões restritos de segurança do pod de cluster do Kubernetes para cargas de trabalho baseada em Linux. Reserve algum tempo para examinar as várias políticas que fazem parte da iniciativa.
  5. Selecione o botão Atribuir no canto superior esquerdo da tela.
  6. Defina o escopo para o grupo de recursos do cluster do Kubernetes que você criou. Neste caso, é videogamerg. Preencha o restante do formulário como fez na etapa anterior e selecione Examinar + criar.
  7. Selecione o botão Criar.

Aqui você pode encontrar a atribuição de política novamente clicando em Política e selecionando Atribuições. Clicar na atribuição de Política que você criou mostrará que o efeito foi definido como Auditar, nesse caso.

Testar o Azure Policy

Agora que a Política de restrição foi atribuída ao cluster, execute um teste para ver se a Política funciona. Para demonstrar isso, vamos criar uma implantação e ver se ela funciona. Começamos criando um arquivo de manifesto do Kubernetes e implantando-o.

Importante

Observe que as atribuições de Policy podem levar até 30 minutos para entrar em vigor. Devido a esse atraso, nas etapas a seguir, a validação da Policy pode ser bem-sucedida e a implantação não falhará. Se isso acontecer, aguarde por um tempo e tente realizar a implantação novamente.

Você pode verificar se a atribuição de política está em vigor executando o comando a seguir.

kubectl get ConstraintTemplates

Você verá um resultado semelhante à seguinte saída. Se você vir k8sazurecontainerallowedimages na lista, saberá que sua política está em vigor.

k8sazureallowedcapabilities              40m
k8sazureallowedseccomp                   20m
k8sazureallowedusersgroups               40m
k8sazureblockautomounttoken              40m
k8sazureblockdefault                     40m
k8sazureblockhostnamespace               40m
k8sazurecontainerallowedimages           40m
k8sazurecontainerallowedports            40m
k8sazurecontainerlimits                  40m
k8sazurecontainernoprivilege             40m
k8sazurecontainernoprivilegeescalation   40m
k8sazuredefenderblockvulnerableimages    40m
k8sazuredisallowedcapabilities           40m
k8sazureenforceapparmor                  40m
k8sazurehostfilesystem                   40m
k8sazurehostnetworkingports              40m
k8sazureingresshttpsonly                 40m
k8sazurereadonlyrootfilesystem           40m
k8sazureserviceallowedports              40m
k8sazurevolumetypes                      20m
  1. Crie outra implantação e serviço de nginx usando o código a seguir.

    cat <<EOF | kubectl create -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: second-simple-nginx
      labels:
        app: second-nginx
    spec:
      selector:
        matchLabels:
          app: second-nginx
      template:
        metadata:
          labels:
            app: second-nginx
        spec:
          containers:
          - name: second-simple-nginx
            image: docker.io/library/nginx:stable
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
              limits:
                cpu: 120m
                memory: 120Mi
            ports:
            - containerPort: 80
    EOF
    
  2. Criar o serviço

    cat <<EOF | kubectl create -f -
     apiVersion: v1
     kind: Service
     metadata:
       name: second-simple-nginx
       labels:
         app: second-nginx
     spec:
       type: LoadBalancer
       ports:
       - port: 80
       selector:
         app: second-nginx
    EOF
    
  3. Agora, podemos verificar se o pod foi criado.

    kubectl get pods
    

Na saída a seguir, embora pareça que a implantação foi criada, o pod não foi criado. A Política que você criou impediu a implantação. No entanto, o pod que foi criado antes de a Política ser atribuída não foi interrompido. A Policy também não impediu a criação do serviço. Se você tentar abrir EXTERNAL-IP em um navegador, não receberá nenhuma resposta, mostrando mais ainda que a implantação não foi bem-sucedida.

NAME                            READY   STATUS    RESTARTS   AGE
simple-nginx-66d884c498-msbpc   1/1     Running   0          63m

Diagnosticar por que o pod não foi implantado

Na seção anterior, percebemos que o segundo pod não foi implantado. Nesta seção, vamos usar a linha de comando para diagnosticar o motivo.

  1. Primeiro, vamos descrever a implantação. Vemos que o ReplicaSet foi criado, mas as réplicas não foram criadas.

    kubectl get replicasets
    

    Obtenha uma saída semelhante ao seguinte exemplo:

    NAME                             DESIRED   CURRENT   READY   AGE
    second-simple-nginx-64969b4566   1         0         0       8m45s
    simple-nginx-66d884c498          1         1         1       72m
    
  2. A seguir, vamos descrever o ReplicaSet com falha. Copie o nome do ReplicaSet que começa com second-simple-nginx, atualize o comando a seguir com esse valor e execute o comando.

    kubectl describe replicaset <ReplicaSet name>
    
  3. A saída do comando mostra que as réplicas falharam por causa da Política.

    Warning  FailedCreate  3m9s (x18 over 14m)  replicaset-controller  Error creating: admission webhook "validation.gatekeeper.sh" denied the request: [azurepolicy-container-allowed-images-bcfbd5e1e78f7c8b4104] Container image docker.io/library/nginx:stable for container second-simple-nginx has not been allowed.
    

Exclua a implantação para se preparar para a próxima etapa.

kubectl delete deployment second-simple-nginx

Como reimplantar os pods usando uma imagem do Registro de Contêiner do Azure

Agora que você sabe que a Política impede a criação das imagens do Docker Hub no cluster com base na sua Política. Vamos tentar reimplantar a mesma carga de trabalho usando uma imagem do ACR (Registro de Contêiner do Azure). Nesta seção, você criará um Registro de Contêiner do Azure. Depois, você copiará a imagem nginx do Docker Hub para o novo registro e tentará reimplantar o pod do registro de contêiner. Usaremos a CLI do Azure para criar o registro de contêiner.

  1. Volte para o Cloud Shell no portal do Azure e insira os comandos a seguir para criar um registro de contêiner.

    ACR_NAME=videogameacr$RANDOM
    az acr create --name $ACR_NAME \
                  --resource-group videogamerg \
                  --sku Premium
    
  2. Importe a imagem do Docker Hub para o novo registro de contêiner.

    az acr import --name $ACR_NAME --source docker.io/library/nginx:stable --image nginx:v1
    
  3. Verifique se a imagem foi importada. Você deve ver nginx na lista de resultados.

    az acr repository list --name $ACR_NAME
    
  4. Vincule seu cluster do AKS ao registro de contêiner que você criou.

    az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
    
  5. Agora, crie a implantação agora usando o registro de contêiner que acaba de ser criado executando o comando a seguir.

     cat <<EOF | kubectl apply -f -
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: second-simple-nginx
       labels:
         app: second-nginx
     spec:
       selector:
         matchLabels:
           app: second-nginx
       template:
         metadata:
           labels:
             app: second-nginx
         spec:
           containers:
           - name: second-simple-nginx
             image: ${ACR_NAME}.azurecr.io/nginx:v1
             resources:
               requests:
                 cpu: 100m
                 memory: 100Mi
               limits:
                 cpu: 120m
                 memory: 120Mi
             ports:
             - containerPort: 80
    EOF
    
  6. Obtenha o EXTERNAL-IP para testar se o serviço está em execução no cluster.

    kubectl get pods
    kubectl get services
    

    Captura de tela mostrando que os pods foram implantados desta vez.

    Copie o endereço IP externo e cole-o no navegador. Você verá que a página agora é carregada.

    Captura de tela mostrando que agora o pod foi implantado com êxito no navegador da Web.

Usar políticas para impor padrões

Nesta unidade, você viu como usar políticas para garantir que o cluster só permita que as Imagens do Registro de Contêiner do Azure sejam implantadas. Você também viu como adicionar uma das iniciativas de build que podem ajudar a controlar facilmente seu cluster e torná-lo mais seguro. No entanto, você viu que o pod que foi implantado antes de a Política ter sido atribuída ainda está em execução. Na próxima unidade, você verá como verificar a conformidade dos pods em execução no cluster.