9.3. 假设您自己的 pod 中的 AWS IAM 角色
按照本节中的步骤,启用服务帐户在用户定义的项目中部署的 pod 中假定 AWS Identity and Access Management (IAM)角色。
您可以创建所需资源,包括 AWS IAM 角色、服务帐户、包括 AWS SDK 的容器镜像,以及使用镜像部署的 pod。在示例中,使用了 Python 的 AWS Boto3 SDK。您还可以验证 pod 身份 Webhook 是否将 AWS 环境变量、卷挂载和令牌卷放入 pod。另外,您可以检查服务帐户是否在 pod 中假设 AWS IAM 角色,并可成功运行 AWS SDK 操作。
9.3.1. 为服务帐户设置 AWS IAM 角色
创建一个 AWS Identity and Access Management (IAM)角色,供 Red Hat OpenShift Service on AWS 集群中的服务帐户假定。附加您的服务帐户在 pod 中运行 AWS SDK 操作所需的权限。
先决条件
- 您有在 AWS 帐户中安装和配置 IAM 角色所需的权限。
- 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别用户权限。
您有 Amazon Resource Name (ARN)的 OpenID Connect (OIDC)供应商,该供应商在带有 STS 集群的 Red Hat OpenShift Service on AWS 中被配置为服务帐户签发者。
注意在带有 STS 集群的 Red Hat OpenShift Service on AWS 中,OIDC 供应商会在安装过程中创建,默认设置为服务帐户签发者。如果您不知道 OIDC 供应商 ARN,请联络您的集群管理员。
-
已安装 AWS CLI (
aws
)。
流程
使用以下 JSON 配置创建一个名为
trust-policy.json
的文件:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "<oidc_provider_arn>" 1 }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "<oidc_provider_name>:sub": "system:serviceaccount:<project_name>:<service_account_name>" 2 } } } ] }
- 1
- 将
<oidc_provider_arn
> 替换为 OIDC 供应商的 ARN,如arn:aws:iam::<aws_account_id>:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g58so46aeohduomfres
。 - 2
- 将角色限制为指定的项目和服务帐户。将
<oidc_provider_name
> 替换为 OIDC 供应商的名称,如rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g58so46aeohduomfres
。将<project_name>:<service_account_name
> 替换为您的项目名称和服务帐户名称,如my-project:test-service-account
。注意另外,您可以使用 "<
oidc_provider_name>:sub": "system:serviceaccount:<project_name>:*",将角色
限制为指定项目内的任何服务帐户。如果提供*
通配符,则必须在上一行中将StringEquals
替换为StringLike
。
创建一个 AWS IAM 角色,它使用
trust-policy.json
文件中定义的信任策略:$ aws iam create-role \ --role-name <aws_iam_role_name> \ 1 --assume-role-policy-document file://trust-policy.json 2
输出示例
ROLE arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 2022-09-28T12:03:17+00:00 / AQWMS3TB4Z2N3SH7675JK <aws_iam_role_name> ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRoleWithWebIdentity Allow STRINGEQUALS system:serviceaccount:<project_name>:<service_account_name> PRINCIPAL <oidc_provider_arn>
在输出中为角色保留 ARN。角色 ARN 的格式为
arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>
。附加服务帐户在 pod 中运行 AWS SDK 操作时所需的受管 AWS 权限:
$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess \ 1 --role-name <aws_iam_role_name> 2
- 可选:在角色中添加自定义属性或权限边界。如需更多信息,请参阅 AWS 文档中的创建角色将权限委派给 AWS 服务。
9.3.2. 在项目中创建服务帐户
在用户定义的项目中添加服务帐户。在服务帐户配置中包含 eks.amazonaws.com/role-arn
注解,该注解引用 AWS Identity and Access Management (IAM)角色的 Amazon Resource Name (ARN)角色。
先决条件
- 您已为您的服务帐户创建 AWS IAM 角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色。
- 您可以使用 AWS 安全令牌服务(STS)集群访问 Red Hat OpenShift Service on AWS。不需要 admin 级别用户权限。
-
已安装 OpenShift CLI(
oc
)。
流程
在 Red Hat OpenShift Service on AWS 集群中,创建一个项目:
$ oc new-project <project_name> 1
- 1
- 将
<project_name
> 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。
注意在创建时,您将自动切换到项目。
使用以下服务帐户配置,创建名为
test-service-account.yaml
的文件:apiVersion: v1 kind: ServiceAccount metadata: name: <service_account_name> 1 namespace: <project_name> 2 annotations: eks.amazonaws.com/role-arn: "<aws_iam_role_arn>" 3
在项目中创建服务帐户:
$ oc create -f test-service-account.yaml
输出示例
serviceaccount/<service_account_name> created
查看服务帐户的详情:
$ oc describe serviceaccount <service_account_name> 1
- 1
- 将
<service_account_name
> 替换为服务帐户的名称。
输出示例
Name: <service_account_name> 1 Namespace: <project_name> 2 Labels: <none> Annotations: eks.amazonaws.com/role-arn: <aws_iam_role_arn> 3 Image pull secrets: <service_account_name>-dockercfg-rnjkq Mountable secrets: <service_account_name>-dockercfg-rnjkq Tokens: <service_account_name>-token-4gbjp Events: <none>
9.3.3. 创建 AWS SDK 容器镜像示例
此流程中的步骤提供了创建包含 AWS SDK 的容器镜像的示例方法。
示例步骤使用 Podman 创建容器镜像和 Quay.io 来托管该镜像。有关 Quay.io 的更多信息,请参阅 Quay.io 入门。容器镜像可用于部署可运行 AWS SDK 操作的 pod。
在本例中,Python 的 AWS Boto3 SDK 安装到容器镜像中。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南。
先决条件
- 您已在安装主机上安装了 Podman。
- 您有一个 Quay.io 用户帐户。
流程
将以下配置添加到名为
Containerfile
的文件中:FROM ubi9/ubi 1 RUN dnf makecache && dnf install -y python3-pip && dnf clean all && pip3 install boto3>=1.15.0 2
在包含文件的目录中,构建名为
awsboto3sdk
的容器镜像:$ podman build -t awsboto3sdk .
登录到 Quay.io:
$ podman login quay.io
标记镜像以准备上传到 Quay.io:
$ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest 1
- 1
- 将
<quay_username&
gt; 替换为您的 Quay.io 用户名。
将标记的容器镜像推送到 Quay.io:
$ podman push quay.io/<quay_username>/awsboto3sdk:latest 1
- 1
- 将
<quay_username&
gt; 替换为您的 Quay.io 用户名。
创建包含镜像 public 的 Quay.io 存储库。这会发布镜像,以便它可用于在 Red Hat OpenShift Service on AWS 集群上部署 pod:
- 在 https://quay.io/ 上,导航到包含该镜像的存储库的 Repository Settings 页面。
- 单击 Make Public,使存储库公开可用。
9.3.4. 部署包含 AWS SDK 的 pod
从包含 AWS SDK 的容器镜像,在用户定义的项目中部署 pod。在 pod 配置中,指定包含 eks.amazonaws.com/role-arn
注解的服务帐户。
随着服务帐户引用 pod,pod 身份 Webhook 会将 AWS 环境变量、卷挂载和令牌卷注入 pod。pod 变异可让服务帐户在 pod 中自动假设 AWS IAM 角色。
先决条件
- 您已为服务帐户创建了 AWS Identity and Access Management (IAM)角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色。
- 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别用户权限。
-
已安装 OpenShift CLI(
oc
)。 -
您已在项目中创建了一个服务帐户,其中包含一个
eks.amazonaws.com/role-arn
注解,该注解引用您想要服务帐户的 IAM 角色的 Amazon Resource Name (ARN)。 您有一个包含 AWS SDK 的容器镜像,且镜像可供集群使用。具体步骤请参阅创建示例 AWS SDK 容器镜像。
注意在这个示例中使用 Python 的 AWS Boto3 SDK。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南。
流程
使用以下 pod 配置创建一个名为
awsboto3sdk-pod.yaml
的文件:apiVersion: v1 kind: Pod metadata: namespace: <project_name> 1 name: awsboto3sdk 2 spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault serviceAccountName: <service_account_name> 3 containers: - name: awsboto3sdk image: quay.io/<quay_username>/awsboto3sdk:latest 4 command: - /bin/bash - "-c" - "sleep 100000" 5 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] terminationGracePeriodSeconds: 0 restartPolicy: Never
- 1
- 将
<project_name
> 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。 - 2
- 指定 pod 的名称。
- 3
- 将 <
service_account_name
> 替换为配置为假定 AWS IAM 角色的服务帐户的名称。名称必须与您在 AWS IAM 角色配置中指定的服务帐户名称匹配。 - 4
- 指定
awsboto3sdk
容器镜像的位置。将<quay_username&
gt; 替换为您的 Quay.io 用户名。 - 5
- 在本例中,此行使 pod 保持运行 100000 秒,以便在 pod 中直接启用验证测试。如需详细的验证步骤,请参阅 pod 中验证假定的 IAM 角色。
部署
awsboto3sdk
pod:$ oc create -f awsboto3sdk-pod.yaml
输出示例
pod/awsboto3sdk created
9.3.5. 在 pod 中验证假定的 IAM 角色
在项目中部署 awsboto3sdk
pod 后,验证 pod 身份 Webhook 是否已修改 pod。检查 pod 中是否存在所需的 AWS 环境变量、卷挂载和 OIDC 令牌卷。
您还可以在 pod 中运行 AWS SDK 操作时,验证服务帐户是否假定 AWS 帐户的 AWS Identity and Access Management (IAM)角色。
先决条件
- 您已为您的服务帐户创建 AWS IAM 角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色。
- 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别用户权限。
-
已安装 OpenShift CLI(
oc
)。 -
您已在项目中创建了一个服务帐户,其中包含一个
eks.amazonaws.com/role-arn
注解,该注解引用您想要服务帐户的 IAM 角色的 Amazon Resource Name (ARN)。 您已在包含 AWS SDK 的用户定义的项目中部署了 pod。pod 引用了使用 pod 身份 Webhook 的服务帐户,以假设运行 AWS SDK 操作所需的 AWS IAM 角色。具体步骤请参阅部署包含 AWS SDK 的 pod。
注意在本例中,使用包括 Python 的 AWS Boto3 SDK 的 pod。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南。
流程
验证 AWS 环境变量、卷挂载和 OIDC 令牌卷是否在部署的
awsboto3sdk
pod 的描述中列出:$ oc describe pod awsboto3sdk
输出示例
Name: awsboto3sdk Namespace: <project_name> ... Containers: awsboto3sdk: ... Environment: AWS_ROLE_ARN: <aws_iam_role_arn> 1 AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token 2 Mounts: /var/run/secrets/eks.amazonaws.com/serviceaccount from aws-iam-token (ro) 3 ... Volumes: aws-iam-token: 4 Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 86400 ...
- 1
- 列出由 pod 身份 webhook 注入 pod 的
AWS_ROLE_ARN
环境变量。变量包含服务帐户假定的 AWS IAM 角色的 ARN。 - 2
- 列出由 pod 身份 Webhook 注入的
AWS_WEB_IDENTITY_TOKEN_FILE
环境变量。变量包含用于验证服务帐户身份的 OIDC 令牌的完整路径。 - 3
- 列出 Pod 身份 Webhook 注入 pod 的卷挂载。
- 4
- 列出挂载到
/var/run/secrets/eks.amazonaws.com/serviceaccount
挂载点的aws-iam-token
卷。卷包含用于验证服务帐户的 OIDC 令牌,以假定 AWS IAM 角色。
在
awsboto3sdk
pod 中启动一个交互式终端:$ oc exec -ti awsboto3sdk -- /bin/sh
在 pod 的交互式终端中,验证 pod 身份 webhook 是否将
$AWS_ROLE_ARN
环境变量放入 pod 中:$ echo $AWS_ROLE_ARN
输出示例
arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 1
- 1
- 输出必须指定 AWS IAM 角色的 ARN,该角色具有运行 AWS SDK 操作所需的权限。
在 pod 的交互式终端中,验证
$AWS_WEB_IDENTITY_TOKEN_FILE
环境变量是否被 pod 身份 webhook 放入 pod 中:$ echo $AWS_WEB_IDENTITY_TOKEN_FILE
输出示例
/var/run/secrets/eks.amazonaws.com/serviceaccount/token 1
- 1
- 输出必须为服务帐户指定 pod 中到 OIDC 令牌的完整路径。
在 pod 的交互式终端中,验证包含 OIDC 令牌文件的
aws-iam-token
卷挂载是否由 pod 身份 webhook 挂载:$ mount | grep -is 'eks.amazonaws.com'
输出示例
tmpfs on /run/secrets/eks.amazonaws.com/serviceaccount type tmpfs (ro,relatime,seclabel,size=13376888k)
在 pod 的交互式终端中,验证
/var/run/secrets/eks.amazonaws.com/serviceaccount/
挂载点中是否存在名为token
的 OIDC 令牌文件:$ ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token
输出示例
/var/run/secrets/eks.amazonaws.com/serviceaccount/token 1
- 1
aws-iam-token
卷中的 OIDC 令牌文件,它由 pod 身份 Webhook 挂载到 pod 中。令牌用于验证 AWS 中服务帐户的身份。
在 pod 中,验证 AWS Boto3 SDK 操作是否已成功运行:
在 pod 的交互式终端中,启动一个 Python 3 shell:
$ python3
在 Python 3 shell 中导入
boto3
模块:>>> import boto3
创建包含 Boto3
s3
服务资源的变量:>>> s3 = boto3.resource('s3')
打印 AWS 帐户中的所有 S3 存储桶的名称:
>>> for bucket in s3.buckets.all(): ... print(bucket.name) ...
输出示例
<bucket_name> <bucket_name> <bucket_name> ...
如果服务帐户成功假定 AWS IAM 角色,则输出会列出 AWS 帐户中提供的所有 S3 存储桶。