Ativar o Workload Identity com o Apigee hybrid

Este tópico explica como ativar o Workload Identity para o Apigee hybrid.

Vista geral

O Workload Identity é uma forma de as aplicações em execução no GKE (Google Kubernetes Engine) acederem aos serviços do Google Cloud. Para ver descrições gerais do Workload Identity, consulte:

Uma conta de serviço da IAM do Google Cloud é uma identidade que uma aplicação pode usar para fazer pedidos às APIs Google. Estas contas de serviço são denominadas contas de serviço Google (GSA) no documento. Para mais informações sobre as ASGs, consulte o artigo Contas de serviço.

Em separado, o Kubernetes também tem o conceito de contas de serviço. Uma conta de serviço fornece uma identidade para processos executados num pod. As contas de serviço do Kubernetes são recursos do Kubernetes, enquanto as contas de serviço Google são específicas do Google Cloud. Para ver informações sobre contas de serviço do Kubernetes, consulte o artigo Configure contas de serviço para pods na documentação do Kubernetes.

Com o Apigee hybrid 1.4 e posterior, o Apigee cria e usa uma conta de serviço do Kubernetes para cada tipo de componente. A ativação do Workload Identity permite que os componentes híbridos interajam com as contas de serviço do Kubernetes.

Pré-requisitos

Antes de ativar o Workload Identity para o Apigee hybrid, o Workload Identity tem de estar ativado para o cluster do GKE que executa o Apigee.

Se seguiu as instruções para o Anthos Service Mesh (ASM), o Workload Identity já está ativado para o cluster.

Pode confirmar se o Workload Identity está ativado executando o seguinte comando:

gcloud container clusters describe $CLUSTER_NAME

O resultado deve incluir algo como o seguinte:



status: RUNNING
subnetwork: default
workloadIdentityConfig:
  workloadPool: PROJECT_ID.svc.id.goog

Quando executa o Apigee hybrid no GKE, a prática padrão é criar e transferir chaves privadas (ficheiros .json) para cada uma das contas de serviço. Quando usa o Workload Identity, não precisa de transferir chaves privadas de contas de serviço e adicioná-las a clusters do GKE.

Ative o Workload Identity para o Apigee Hybrid

Para começar, siga as instruções em Prepare-se para ativar o Workload Identity para atualizar os node pools e inicializar as variáveis antes de ativar o Workload Identity.

Em seguida, siga uma destas secções, consoante os passos que estiver a realizar:

Prepare-se para ativar o Workload Identity

Antes de iniciar o processo de instalação, siga os passos desta secção.

Inicialize variáveis

Inicialize (ou valide) as seguintes variáveis:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee #the namespace where apigee is installed

Defina o projeto para o projeto que está a modificar:

gcloud config set project $PROJECT_ID

Atualize os node pools

Certifique-se de que o Workload Identity está ativado por conjunto de nós com o seguinte comando:

gcloud container node-pools update $NODE_POOL_NAME \
  --cluster=$CLUSTER_NAME \
  --workload-metadata=GKE_METADATA

Ative o Workload Identity para uma instalação nova

Siga estas instruções quando ativar o Workload Identity durante uma nova instalação híbrida.

  1. Adicione a linha a negrito abaixo ao seu ficheiro overrides.yaml na secção gcp:
    gcp:
      projectID: "my-project"
      name: "my-project"
      region: "us-west1"
      workloadIdentityEnabled: true
  2. Crie contas de serviço Google. Existem dois métodos que pode usar:
    • Use a ferramenta create-service-account para criar uma conta de serviço Google por componente com o seguinte comando:
      $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

      Este comando cria as seguintes contas de serviço:

      • apigee-logger
      • apigee-metrics
      • apigee-cassandra
      • apigee-udca
      • apigee-synchronizer
      • apigee-mart
      • apigee-watcher
      • apigee-distributed-trace

      As instruções seguintes partem do princípio de que usou a ferramenta create-service-account para gerar as contas de serviço.

    • Defina convenções de nomenclatura personalizadas e contas de serviço por ambiente (para utilizadores avançados).
  3. Crie as contas de serviço do Kubernetes.

    Para componentes ao nível da organização:

    • Cassandra
      kubectl create sa -n $NAMESPACE apigee-cassandra-schema-setup-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-cassandra,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-cassandra-schema-setup-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      kubectl create sa -n $NAMESPACE apigee-cassandra-user-setup-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-cassandra,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-cassandra-user-setup-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • MART
      kubectl create sa -n $NAMESPACE apigee-mart-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-mart,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-mart-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Connect
      kubectl create sa -n $NAMESPACE apigee-connect-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-connect,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-connect-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      
    • Apigee Watcher
      kubectl create sa -n $NAMESPACE apigee-watcher-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-watcher,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-watcher-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • Métricas do Apigee
      kubectl create sa -n $NAMESPACE apigee-metrics-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-metrics,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-metrics-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

    Para cada ambiente:

    • Runtime
      kubectl create sa -n $NAMESPACE apigee-runtime-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-runtime,org=$ORG_NAME,env=$ENV_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-runtime-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA
      kubectl create sa -n $NAMESPACE apigee-udca-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-udca,org=$ORG_NAME,emv=$ENV_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-udca-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • Synchronizer
      kubectl create sa -n $NAMESPACE apigee-synchronizer-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-synchronizer,org=$ORG_NAME,env=$ENV_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-synchronizer-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
  4. Continue a instalar o Apigee hybrid como faria normalmente.

Atualize uma instalação para usar o Workload Identity

Siga estas instruções para adicionar o Workload Identity a uma instalação híbrida existente.

Segue-se um exemplo que mostra as contas de serviço Google (GSAs) criadas para o Apigee:

gcloud iam service-accounts list | grep apigee
apigee-connect   apigee-connect@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-runtime   apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-metrics   apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-mart      apigee-mart@$PROJECT_ID.iam.gserviceaccount.com       False
apigee-watcher   apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-sync      apigee-sync@$PROJECT_ID.iam.gserviceaccount.com       False
apigee-udca      apigee-udca@$PROJECT_ID.iam.gserviceaccount.com       False

Seguem-se exemplos de contas de serviço do Kubernetes (KSA) criadas para o Apigee (pressupõe que o Apigee Hybrid 1.4 ou superior está instalado):

kubectl get sa -n $NAMESPACE
apigee-cassandra-schema-setup-ORG_NAME-cb84b88-sa                1         xxd
apigee-cassandra-user-setup-ORG_NAME-cb84b88-sa                  1         xxd
apigee-connect-agent-ORG_NAME-cb84b88-sa                         1         xxd
apigee-init                                                        1         xxd
apigee-mart-ORG_NAME-cb84b88-sa                                  1         xxd
apigee-metrics-apigee-telemetry                                    1         xxd
apigee-runtime-ORG_NAME-ENV_NAME-1d0dc5e-sa                    1         xxd
apigee-synchronizer-ORG_NAME-ENV_NAME-1d0dc5e-sa               1         xxd
apigee-udca-ORG_NAME-ENV_NAME-1d0dc5e-sa                       1         xxd
apigee-watcher-ORG_NAME-cb84b88                                  1         xxd
  1. Adicione a função de identidade de carga de trabalho a cada conta de serviço:
    gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
      GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    Por exemplo, se estivesse a definir as autorizações para o Apigee Synchronizer, executaria o seguinte comando:

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:$PROJECT_ID.svc.id.goog[apigee/$KSA_NAME]" apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  2. Anote cada KSA com os detalhes da GSA:
    kubectl annotate serviceaccount \
      --namespace $NAMESPACE \
      $KSA_NAME \
     iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    Por exemplo, se estivesse a definir as autorizações para o Apigee Synchronizer, executaria o seguinte comando:

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    kubectl annotate serviceaccount --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Valide se os passos funcionaram:
    gcloud config set project $PROJECT_ID
    
    kubectl run --rm -it --image google/cloud-sdk:slim --serviceaccount $KSA_NAME --namespace $NAMESPACE workload-identity-test -- gcloud auth list
    

    Se não vir uma linha de comandos, experimente premir Enter.

    Se os passos foram executados corretamente, deve ver uma resposta semelhante à seguinte:

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
  4. Se estiver a fazer a atualização a partir de uma instalação anterior, limpe os segredos que continham chaves privadas de contas de serviço:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  5. Verifique os registos:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer