Usar restrições da política de custo e confiabilidade

O Policy Controller é fornecido com uma biblioteca padrão de modelos de restrição que podem ser usados com o pacote de política de custo e confiabilidade, que ajuda a adotar as práticas recomendadas para executar clusters econômicos do GKE sem comprometer o desempenho ou a confiabilidade das cargas de trabalho.

Restrições do pacote de políticas de custo e confiabilidade

Nome da restrição Descrição da restrição
cost-reliability-v2023-pod-disruption-budget Requer a configuração de PodDisruptionBudget para Deployments, ReplicaSets, StatefulSets e ReplicationControllers.
cost-reliability-v2023-pod-resources-best-practices Exige que os contêineres definam solicitações de recursos e sigam as práticas recomendadas.
cost-reliability-v2023-required-labels Exige que todos os pods e controladores (ReplicaSet, Deployment, StatefulSet e DaemonSet) tenham os rótulos necessários: ambiente, equipe e app.
cost-reliability-v2023-restrict-repos Restringe as imagens de contêiner a uma lista de repositórios permitidos que podem usar o Artifact Registry e aproveitar o streaming de imagens.
cost-reliability-v2023-spotvm-termination-grace Requer um terminationGracePeriodSeconds de 15 segundos ou menos para pods e modelos de pod com um nodeSelector ou nodeAfffinty para gke-spot.

Antes de começar

  1. Instale e inicialize a Google Cloud CLI, que fornece os comandos gcloud e kubectl usados nestas instruções. Se você usa o Cloud Shell, a Google Cloud CLI já vem pré-instalada.
  2. Instale o Policy Controller v1.15.3 ou mais recente no cluster com a biblioteca padrão de modelos de restrição. Você também precisa ativar a compatibilidade com restrições referenciais, já que este pacote contém restrições referenciais.

Configurar o Policy Controller com restrições referenciais

  1. Salve o seguinte manifesto YAML em um arquivo como policycontroller-config.yaml. O manifesto configura o Policy Controller para observar tipos específicos de objetos.

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Service"
          - group: "policy"
            version: "v1"
            kind: "PodDisruptionBudget"
    
  2. Aplique o manifesto policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

Configurar o cluster e a carga de trabalho

  1. Qualquer pod selecionado por um service precisa incluir uma sondagem de prontidão.
  2. deployment, replicaset, statefulset e replicationcontroller devem incluir poddisruptionbudget.
  3. Todos os contêineres precisam incluir solicitações cpu e memory, e o limite memory é igual a solicitações memory que seguem as práticas recomendadas.
  4. Adicione os rótulos environment, team e app a todos os pods e modelos de pod.
  5. Hospede imagens de contêiner usando o Artifact Registry na mesma região do cluster para ativar o streaming de imagem. Permita o Artifact Registry relevante seguindo o exemplo em cost-reliability-v2023-restrict-repos.
  6. Todos os pods e modelos de pod que usam gke-spot precisam incluir um terminationGracePeriodSeconds de 15 segundos ou menos.

Pacote de políticas de custo e confiabilidade da auditoria

O Policy Controller permite aplicar políticas ao cluster do Kubernetes. Para ajudar a testar suas cargas de trabalho e a conformidade delas com as políticas de custo e confiabilidade descritas na tabela anterior, implante essas restrições no modo de "auditoria" a fim de revelar violações e, principalmente, ter a chance de corrigi-las antes de aplicá-las no cluster do Kubernetes.

É possível aplicar essas políticas com spec.enforcementAction definido como dryrun usando kubectl, kpt ou Config Sync .

kubectl

  1. (Opcional) Visualize as restrições de política com o kubectl:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    
  2. Aplique as restrições da política com o kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    

    A saída é esta:

    gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace created
    k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos created
    k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget created
    k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices created
    k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels created
    
  3. Verifique se as restrições da política foram instaladas e se existem violações no cluster:

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023
    

    O resultado será assim:

    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace   dryrun               0
    
    NAME                                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget   dryrun               0
    
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos   dryrun               0
    
    NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels   dryrun               0
    

kpt

  1. Instale e configure o kpt.

    O kpt é usado nestas instruções para personalizar e implantar recursos do Kubernetes.

  2. Faça o download do pacote de políticas do PCI-DSS v3.2.1 no GitHub usando o kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    
  3. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como dryrun:

    kpt fn eval cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
    -- enforcementAction=dryrun
    
  4. Inicialize o diretório de trabalho com o kpt, que cria um recurso para acompanhar as alterações:

    cd cost-reliability-v2023 kpt live init
    
  5. Aplique as restrições da política ao kpt:

    kpt live apply
    
  6. Verifique se as restrições da política foram instaladas e se existem violações no cluster:

    kpt live status --output table --poll-until current
    

    O status CURRENT confirma a instalação bem-sucedida das restrições.

Config Sync

  1. Instale e configure o kpt.

    O kpt é usado nestas instruções para personalizar e implantar recursos do Kubernetes.

    Os operadores que usam o Config Sync para implantar políticas nos clusters podem usar as seguintes instruções:

  2. Altere para o diretório de sincronização do Config Sync:

    cd SYNC_ROOT_DIR
    

    Para criar ou anexar .gitignore com resourcegroup.yaml:

    echo resourcegroup.yaml >> .gitignore
    
  3. Crie um diretório policies dedicado:

    mkdir -p policies
    
  4. Faça o download do pacote de política de custo e confiabilidade no GitHub usando o kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023 policies/cost-reliability-v2023
    
  5. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como dryrun:

    kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  6. (Opcional) Visualize as restrições de política a serem criadas:

    kpt live init policies/cost-reliability-v2023
    kpt live apply --dry-run policies/cost-reliability-v2023
    
  7. Se o diretório de sincronização do Config Sync usar Kustomize, adicione policies/cost-reliability-v2023 à raiz kustomization.yaml. Caso contrário, remova o arquivo policies/cost-reliability-v2023/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/cost-reliability-v2023/kustomization.yaml
    
  8. Envie as alterações para o repositório do Config Sync:

    git add SYNC_ROOT_DIR/policies/cost-reliability-v2023 git commit -m 'Adding Cost and Reliability policy audit enforcement'
    git push
    
  9. Verifique o status da instalação:

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    O status SYNCED confirma a instalação das políticas.

Visualizar violações de políticas

Depois que as restrições de política são instaladas no modo de auditoria, as violações no cluster podem ser visualizadas na interface usando o Painel do Controlador de políticas.

Também é possível usar kubectl para visualizar violações no cluster usando o seguinte comando:

  kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
  

Se houver violações, uma lista das mensagens de violação por restrição poderá ser visualizada com:

  kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
  

Ação de cumprimento do pacote de políticas de custo e confiabilidade da mudança

Depois de analisar as violações de políticas no cluster, considere alterar o modo de aplicação para que o controlador de admissão warn ou deny bloqueie a aplicação de recursos sem compliance no cluster.

kubectl

  1. Use o kubectl para definir a ação de cumprimento das políticas como warn:

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. Verifique se a ação de cumprimento das restrições da política foi atualizada:

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023
    

kpt

  1. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como warn:

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. Aplique as restrições da política:

    kpt live apply
    

Config Sync

Os operadores que usam o Config Sync para implantar políticas nos clusters podem usar as seguintes instruções:

  1. Altere para o diretório de sincronização do Config Sync:

    cd SYNC_ROOT_DIR
    
  2. Execute a função set-enforcement-action do kpt para definir a ação de aplicação das políticas como warn:

    kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. Envie as alterações para o repositório do Config Sync:

    git add SYNC_ROOT_DIR/policies/cost-reliability-v2023
    git commit -m 'Adding Cost and Reliability policy bundle warn enforcement'
    git push
    
  4. Verifique o status da instalação:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Seu repo que aparece na coluna SYNCED confirma a instalação das políticas.

Aplicação da política de testes

Crie um recurso não compatível no cluster usando o seguinte comando:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        hostPort: 80
        name: wordpress
EOF

O controlador de admissão produzirá um alerta listando as violações da política que esse recurso viola, conforme mostrado no exemplo a seguir:

Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <cpu> request.
Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <memory> request.
Warning: [cost-reliability-v2023-required-labels] This app is missing one or more required labels: `environment`, `team`, and `app`.
Warning: [cost-reliability-v2023-restrict-repos] container <wordpress> has an invalid image repo <wordpress>, allowed repos are ["gcr.io/gke-release/", "gcr.io/anthos-baremetal-release/", "gcr.io/config-management-release/", "gcr.io/kubebuilder/", "gcr.io/gkeconnect/", "gke.gcr.io/"]
pod/wp-non-compliant created

Remover o pacote de políticas de custo e confiabilidade

Se necessário, o pacote de políticas de custo e confiabilidade pode ser removido do cluster.

kubectl

Use o kubectl para remover as políticas:

  kubectl delete constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023
  

kpt

Remova as políticas:

  kpt live destroy
  

Config Sync

Os operadores que usam o Config Sync para implantar políticas nos clusters podem usar as seguintes instruções:

  1. Envie as alterações para o repositório do Config Sync:

    git rm -r SYNC_ROOT_DIR/policies/cost-reliability-v2023
    git commit -m 'Removing Cost and Reliability policies'
    git push
    
  2. Verifique o status:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Seu repo que aparece na coluna SYNCED confirma a remoção das políticas.