Exercício – atribuir uma política a um cluster dos serviços do Kubernetes do Azure
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.
No Cloud Shell, entre no cluster do AKS.
az aks get-credentials -n videogamecluster -g videogamerg
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
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
Liste todos os serviços implantados.
kubectl get services
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.
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".
Vá para a página Policy no portal do Azure.
No painel esquerdo da página do Azure Policy, selecione Definições.
Na caixa de listagem suspensa Categoria, use Selecionar tudo para limpar o filtro e escolha Kubernetes.
Selecione a definição de política Os contêineres de cluster do Kubernetes devem usar apenas imagens permitidas.
Selecione o botão Atribuir.
Defina o Escopo do grupo de recursos do cluster do Kubernetes que você criou. Nesse caso, o grupo de recursos é o videogamerg.
Insira o seguinte no campo Regex de imagem de contêiner permitida e selecione o botão Examinar + criar
.+\.azurecr\.io/.+$
- 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.
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.
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".
- Volte para a página Policy no portal do Azure.
- No painel esquerdo da página do Azure Policy, selecione Definições.
- Na caixa de listagem suspensa Categoria, use Selecionar tudo para limpar o filtro e escolha Kubernetes.
- 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.
- Selecione o botão Atribuir no canto superior esquerdo da tela.
- 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.
- 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
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
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
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.
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
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>
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.
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
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
Verifique se a imagem foi importada. Você deve ver nginx na lista de resultados.
az acr repository list --name $ACR_NAME
Vincule seu cluster do AKS ao registro de contêiner que você criou.
az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
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
Obtenha o EXTERNAL-IP para testar se o serviço está em execução no cluster.
kubectl get pods kubectl get services
Copie o endereço IP externo e cole-o no navegador. Você verá que a página agora é carregada.
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.