Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Assign IAM rôles pour Kubernetes comptes de service
Cette rubrique explique comment configurer un Kubernetes compte de service pour assumer un rôle AWS Identity and Access Management (IAM). N’importe quel compte Pods qui sont configurés pour utiliser le compte de service peuvent ensuite accéder à tout AWS service auquel le rôle est autorisé à accéder.
Prérequis
-
Un cluster existant. Si vous n'en avez pas, vous pouvez en créer un en suivant l'un des guides présentés dansCommencez avec Amazon EKS.
-
Un existant IAM OpenID Connect (OIDC) fournisseur pour votre cluster. Pour déterminer si vous en avez déjà un ou comment en créer un, consultez Créez un IAM OIDC fournisseur pour votre cluster.
-
Version
2.12.3
ou version ultérieure1.27.160
ou version ultérieure de l'interface de ligne de AWS commande (AWS CLI) installée et configurée sur votre appareil ou AWS CloudShell. Pour vérifier votre version actuelle, utilisezaws --version | cut -d / -f2 | cut -d ' ' -f1
. Des gestionnaires de packages tels queyum
apt-get
, ou Homebrew for macOS ont souvent plusieurs versions de retard par rapport à la dernière version du AWS CLI. Pour installer la dernière version, consultez la section Installation et configuration rapide avec aws configure dans le Guide de l'utilisateur de l'interface de ligne de AWS commande. La AWS CLI version installée AWS CloudShell peut également avoir plusieurs versions de retard par rapport à la dernière version. Pour le mettre à jour, consultez la section Installation AWS CLI dans votre répertoire personnel dans le guide de AWS CloudShell l'utilisateur. -
L'outil de ligne de
kubectl
commande est installé sur votre appareil ou AWS CloudShell. La version peut être identique ou supérieure à une version mineure antérieure ou ultérieure à Kubernetes version de votre cluster. Par exemple, si la version de votre cluster est1.29
, vous pouvez utiliser la versionkubectl
1.28
,1.29
ou1.30
. Pour installer ou mettre à niveaukubectl
, veuillez consulter Configurer kubectl et eksctl. -
Un fichier existant
kubectl
config
qui contient la configuration de votre cluster. Pour créer un fichierkubectl
config
, consultez Connect kubectl à un EKS cluster en créant un fichier kubeconfig.
Étape 1 : Création d'une IAM politique
Si vous souhaitez associer une IAM politique existante à votre IAM rôle, passez à l'étape suivante.
-
Créez une IAM politique. Vous pouvez créer votre propre politique ou copier une politique AWS gérée qui accorde déjà certaines des autorisations dont vous avez besoin et la personnaliser en fonction de vos besoins spécifiques. Pour plus d'informations, consultez la section Création IAM de politiques dans le guide de IAM l'utilisateur.
-
Créez un fichier qui inclut les autorisations pour les AWS services que vous souhaitez Pods pour accéder. Pour obtenir la liste de toutes les actions pour tous les AWS services, consultez la référence d'autorisation des services.
Vous pouvez exécuter la commande suivante pour créer un exemple de fichier de politique autorisant l'accès en lecture seule à un compartiment Amazon S3. Vous pouvez éventuellement stocker des informations de configuration ou un script d'amorçage dans ce compartiment, ainsi que les conteneurs dans votre Pod peut lire le fichier depuis le bucket et le charger dans votre application. Si vous souhaitez créer cet exemple de politique, copiez le contenu suivant sur votre appareil. Remplacez
my-pod-secrets-bucket
avec le nom de votre compartiment et exécutez la commande.cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws: s3:::my-pod-secrets-bucket" } ] } EOF
-
Créez la IAM politique.
aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
Étape 2 : créer et associer IAM un rôle
Créez un IAM rôle et associez-le à Kubernetes compte de service. Sinon, vous pouvez utiliser eksctl
ou AWS CLI.
Créer et associer un rôle (eksctl)
Version 0.194.0
ou version ultérieure de l'outil de ligne de eksctl
commande installé sur votre appareil ou AWS CloudShell. Pour installer ou mettre à jour eksctl
, veuillez consulter Installationeksctl
.
Remplacez my-service-account
avec le nom du Kubernetes compte de service que vous eksctl
souhaitez créer et associer à un IAM rôle. Remplacez default
avec l'espace de noms dans lequel vous eksctl
souhaitez créer le compte de service. Remplacez my-cluster
avec le nom de votre cluster. Remplacez my-role
avec le nom du rôle auquel vous souhaitez associer le compte de service. S'il n'existe pas déjà, eksctl
créez-le pour vous. Remplacez 111122223333
avec votre identifiant de compte et my-policy
avec le nom d'une politique existante.
eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws: iam::111122223333:policy/my-policy --approve
Important
Si le rôle ou le compte de service existe déjà, la commande précédente peut échouer. eksctl
propose différentes options que vous pouvez fournir dans ces situations. Pour de plus amples informations, exécutez eksctl create iamserviceaccount --help
.
Créer et associer un rôle (AWS CLI)
Si vous possédez déjà un Kubernetes compte de service dans lequel vous souhaitez assumer un IAM rôle, vous pouvez alors ignorer cette étape.
-
Créez un Kubernetes compte de service. Copiez les contenus suivants sur votre appareil. Remplacez
my-service-account
avec le nom que vous souhaitez etdefault
avec un espace de noms différent, si nécessaire. Si vous changezdefault
, l'espace de noms doit déjà exister.cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
-
Définissez l'ID de votre AWS compte sur une variable d'environnement à l'aide de la commande suivante.
account_id=$(aws sts get-caller-identity --query "Account" --output text)
-
Définissez les OIDC fournisseur d'identité vers une variable d'environnement avec la commande suivante. Remplacez
my-cluster
avec le nom de votre cluster.oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
-
Définissez des variables pour l'espace de noms et le nom du compte de service. Remplacez
my-service-account
avec le Kubernetes compte de service dans lequel vous souhaitez assumer le rôle. Remplacezdefault
avec l'espace de noms du compte de service.export namespace=default export service_account=my-service-account
-
Exécutez la commande suivante pour créer un fichier de politique de confiance pour le IAM rôle. Si vous souhaitez autoriser tous les comptes de service d'un espace de noms à utiliser le rôle, copiez le contenu suivant sur votre appareil. Remplacez
StringEquals
avecStringLike
et remplacer$service_account
avec\*
. Vous pouvez ajouter plusieurs entrées dans les conditionsStringEquals
ouStringLike
pour autoriser plusieurs comptes de service ou espaces de noms à endosser le rôle. Pour autoriser les rôles provenant d'un AWS compte différent de celui dans lequel se trouve votre cluster à assumer le rôle, consultez Authentifiez-vous sur un autre compte avec IRSA pour plus d'informations.cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws: iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
-
Créez le rôle. Remplacez
my-role
avec un nom pour votre IAM rôle, etmy-role-description
avec une description de votre rôle.aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
-
Associez une IAM politique à votre rôle. Remplacez
my-role
avec le nom de votre IAM rôle etmy-policy
avec le nom d'une politique existante que vous avez créée.aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws: iam::$account_id:policy/my-policy
-
Annotez votre compte de service avec le nom de ressource Amazon (ARN) du IAM rôle que vous souhaitez que le compte de service assume. Remplacez
my-role
avec le nom de votre IAM rôle actuel. Supposons que vous ayez autorisé un rôle provenant d'un AWS compte différent de celui dans lequel se trouve votre cluster à assumer ce rôle lors d'une étape précédente. Assurez-vous ensuite de spécifier le AWS compte et le rôle de l'autre compte. Pour de plus amples informations, veuillez consulter Authentifiez-vous sur un autre compte avec IRSA.kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws: iam::$account_id:role/my-role
-
(Facultatif) Configurer le point de terminaison du service AWS Security Token pour un compte de service Configurez le point de terminaison du service AWS Security Token pour un compte de service. AWS recommande d'utiliser un point de AWS STS terminaison régional plutôt que le point de terminaison global. Cela réduit la latence, fournit une redondance intégrée et augmente la validité des jetons de session.
Étape 3 : Confirmer la configuration
-
Vérifiez que la politique de confiance du IAM rôle est correctement configurée.
aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
L'exemple qui suit illustre un résultat.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws: iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
-
Vérifiez que la stratégie que vous avez associée à votre rôle lors d'une étape précédente est associée au rôle.
aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text
L'exemple qui suit illustre un résultat.
arn:aws: iam::111122223333:policy/my-policy
-
Définissez une variable pour stocker le nom de ressource Amazon (ARN) de la politique que vous souhaitez utiliser. Remplacez
my-policy
avec le nom de la politique pour laquelle vous souhaitez confirmer les autorisations.export policy_arn=arn:aws: iam::111122223333:policy/my-policy
-
Affichez la version par défaut de la stratégie.
aws iam get-policy --policy-arn $policy_arn
L'exemple qui suit illustre un résultat.
{ "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws: iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
-
Consultez le contenu de la politique pour vous assurer qu'elle inclut toutes les autorisations que votre Pod besoins. Si nécessaire, remplacez
1
dans la commande suivante avec la version renvoyée dans la sortie précédente.aws iam get-policy-version --policy-arn $policy_arn --version-id v1
L'exemple qui suit illustre un résultat.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws: s3:::my-pod-secrets-bucket" } ] }
Si vous avez créé l'exemple de stratégie lors d'une étape précédente, le résultat est le même. Si vous avez créé une autre politique, le
example
le contenu est différent. -
Confirmez que Kubernetes le compte de service est annoté avec le rôle.
kubectl describe serviceaccount my-service-account -n default
L'exemple qui suit illustre un résultat.
Name: my-service-account Namespace: default Annotations: eks.amazonaws.com/role-arn: arn:aws: iam::111122223333:role/my-role Image pull secrets: <none> Mountable secrets: my-service-account-token-qqjfl Tokens: my-service-account-token-qqjfl [...]