Cet article explique comment activer Workload Identity pour Apigee hybrid.
Présentation
Workload Identity permet aux applications s'exécutant dans GKE (Google Kubernetes Engine) d'accéder aux services Google Cloud. Pour en savoir plus sur Workload Identity, consultez les sections suivantes :
- Introducing Workload Identity: Better authentication for your GKE applications
- Utiliser Workload Identity
Un compte de service Google Cloud IAM est une identité qu'une application peut utiliser pour envoyer des requêtes à Google APIs. Ces comptes de service sont appelés GSA ("Google Service Accounts" ou comptes de service Google) dans ce document. Pour en savoir plus sur les GSA, consultez la section Comptes de service.
De son côté, Kubernetes utilise également le concept de comptes de service. Un compte de service fournit une identité pour les processus exécutés dans un pod. Les comptes de service Kubernetes sont des ressources Kubernetes, tandis que les comptes de service Google sont spécifiques à Google Cloud. Pour plus d'informations sur les comptes de service Kubernetes, consultez la section Configurer des comptes de service pour les pods dans la documentation de Kubernetes.
Avec Apigee hybrid 1.4 et versions ultérieures, Apigee crée et utilise un compte de service Kubernetes pour chaque type de composant. L'activation de Workload Identity permet aux composants hybrides d'interagir avec les comptes de service Kubernetes.
Prérequis
Avant d'activer Workload Identity pour Apigee hybrid, Workload Identity doit être activé pour le cluster GKE exécutant Apigee.
Si vous avez suivi les instructions pour Anthos Service Mesh (ASM), Workload Identity est déjà activé pour le cluster.
Vous pouvez vérifier si Workload Identity est activé en exécutant la commande suivante :
gcloud container clusters describe $CLUSTER_NAME
Le résultat doit inclure les éléments suivants :
… … status: RUNNING subnetwork: default workloadIdentityConfig: workloadPool: PROJECT_ID.svc.id.goog
Lorsque vous exécutez Apigee hybrid sur GKE, il est recommandé de créer et de télécharger des clés privées (fichiers .json
) pour chacun des comptes de service. Si vous utilisez Workload Identity, vous n'avez pas besoin de télécharger les clés privées des comptes de service et de les ajouter aux clusters GKE.
Activer Workload Identity pour Apigee hybrid
Pour commencer, suivez les instructions de la page Préparer l'activation de Workload Identity pour mettre à jour les pools de nœuds et initialiser les variables avant d'activer Workload Identity.
Suivez ensuite l'une de ces sections, en fonction des étapes que vous êtes en train d'effectuer :- Activer Workload Identity pour une nouvelle installation. Suivez ces instructions pour effectuer une nouvelle ou une première installation Apigee hybrid.
- Mettre à niveau une installation pour utiliser Workload Identity. Suivez ces instructions pour activer Workload Identity sur votre installation Apigee hybrid existante.
Préparer l'activation de Workload Identity
Avant de commencer le processus d'installation, suivez les étapes de cette section.
Initialiser les variables
Initialisez (ou vérifiez) les variables suivantes :
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee #the namespace where apigee is installed
Définissez le projet sur le projet que vous modifiez :
gcloud config set project $PROJECT_ID
Mettre à jour les pools de nœuds
Assurez-vous que Workload Identity est activé par pool de nœuds à l'aide de la commande suivante :
gcloud container node-pools update $NODE_POOL_NAME \ --cluster=$CLUSTER_NAME \ --workload-metadata=GKE_METADATA
Activer Workload Identity pour une nouvelle installation
Suivez ces instructions lors de l'activation de Workload Identity au cours d'une nouvelle installation hybride.
- Ajoutez la ligne en gras ci-dessous à votre fichier
overrides.yaml
sous le stanzagcp
:gcp: projectID: "my-project" name: "my-project" region: "us-west1" workloadIdentityEnabled: true
- Créez les comptes de service Google. Vous avez pour cela deux méthodes à votre disposition :
- Utilisez l'outil
create-service-account
pour créer un compte de service Google par composant à l'aide de la commande suivante :$APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts
Cette commande crée les comptes de service suivants :
apigee-logger
apigee-metrics
apigee-cassandra
apigee-udca
apigee-synchronizer
apigee-mart
apigee-watcher
apigee-distributed-trace
Les instructions suivantes supposent que vous avez utilisé l'outil
create-service-account
pour générer les comptes de service. - Définissez des conventions personnalisées d'attribution des noms et des comptes de service par environnement (pour les utilisateurs avancés).
- Utilisez l'outil
- Créez les comptes de service Kubernetes.
Pour les composants au niveau de l'organisation :
- 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étriques 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
Pour chaque environnement :
- Exécution
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
- Synchronisateur
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
- Cassandra
- Continuez à installer Apigee hybrid comme vous le feriez normalement.
Mettre à niveau une installation pour utiliser Workload Identity
Suivez ces instructions pour ajouter Workload Identity à une installation hybride existante.
Voici un exemple illustrant les comptes de service Google (GSA) créés pour 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
Voici un exemple de comptes de service Kubernetes (KSA) créés pour Apigee (en supposant qu'Apigee hybrid 1.4 ou une version ultérieure soit installée) :
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
- Ajoutez le rôle Workload Identity à chaque compte de service :
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
Par exemple, si vous définissez les autorisations pour le synchronisateur Apigee, vous devez exécuter :
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
- Annotez chaque KSA avec les détails des GSA :
kubectl annotate serviceaccount \ --namespace $NAMESPACE \ $KSA_NAME \ iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
Par exemple, si vous définissez les autorisations pour le synchronisateur Apigee, vous devez exécuter :
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
- Vérifiez si les étapes ont fonctionné :
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
Si l'invite de commande ne s'affiche pas, essayez d'appuyer sur la touche Entrée.
Si les étapes ont été correctement exécutées, vous devriez obtenir une réponse semblable à celle-ci :
Credentialed Accounts ACTIVE ACCOUNT * GSA@PROJECT_ID.iam.gserviceaccount.com
- Si vous effectuez une mise à niveau à partir d'une installation précédente, nettoyez les secrets contenant des clés privées de compte de service :
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- Vérifiez les journaux :
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer