18.5. 在 Amazon Web Services Secure Token Service 中使用手动模式
Amazon Web Services(AWS)支持使用 STS 的手动模式。
此凭证策略只支持新的 OpenShift Container Platform 集群,且必须在安装过程中进行配置。您无法重新配置使用不同凭证策略的现有集群,以使用此功能。
18.5.1. 关于 AWS Secure Token Service 的手动模式
在带有 STS 的手动模式中,各个 OpenShift Container Platform 集群组件使用 AWS Secure Token Service(STS)来分配提供简短、有限权限安全凭证的组件 IAM 角色。这些凭证与特定于发布 AWS API 调用的每个组件的 IAM 角色关联。
使用适当配置的 AWS IAM OpenID Connect(OIDC)身份提供程序以及 AWS IAM 角色会自动请求新的和刷新的凭证。OpenShift Container Platform 为服务帐户令牌签名,这些令牌由 AWS IAM 信任,并可投射到 pod 中并用于身份验证。令牌会在一小时后刷新。
图 18.1. STS 验证流程
使用带有 STS 的手动模式更改为各个 OpenShift Container Platform 组件提供的 AWS 凭证的内容。
使用长期凭证的 AWS secret 格式
apiVersion: v1 kind: Secret metadata: namespace: <target-namespace> 1 name: <target-secret-name> 2 data: aws_access_key_id: <base64-encoded-access-key-id> aws_secret_access_key: <base64-encoded-secret-access-key>
使用 STS 的 AWS secret 格式
apiVersion: v1 kind: Secret metadata: namespace: <target-namespace> 1 name: <target-secret-name> 2 stringData: credentials: |- [default] role_name: <operator-role-name> 3 web_identity_token_file: <path-to-token> 4
18.5.2. 使用 STS 为手动模式安装 OpenShift Container Platform 集群
要安装配置为在带有 STS 的手动模式中使用 Cloud Credential Operator(CCO)的集群:
因为在使用 STS 时集群以手动模式运行,所以无法使用所需的权限为组件创建新凭证。当升级到不同版本的 OpenShift Container Platform 时,通常会有新的 AWS 权限要求。在升级使用 STS 的集群前,集群管理员必须手动确保 AWS 权限足以用于现有组件,并可供任何新组件使用。
18.5.2.1. 配置 Cloud Credential Operator 工具
当 Cloud Credential Operator(CCO)使用 STS 以手动模式运行时,要从集群外创建和管理云凭证,提取并准备 CCO 实用程序(ccoctl
)二进制文件。
ccoctl
是一个必须在 Linux 环境中运行的 Linux 二进制文件。
流程
获取 OpenShift Container Platform 发行镜像。
$ RELEASE_IMAGE=$(./openshift-install version | awk '/release image/ {print $3}')
从 OpenShift Container Platform 发行镜像获取 CCO 容器镜像:
$ CCO_IMAGE=$(oc adm release info --image-for='cloud-credential-operator' $RELEASE_IMAGE)
注意确保
$RELEASE_IMAGE
的架构与将使用ccoctl
工具的环境架构相匹配。将 CCO 容器镜像中的
ccoctl
二进制文件提取到 OpenShift Container Platform 发行镜像中:$ oc image extract $CCO_IMAGE --file="/usr/bin/ccoctl" -a ~/.pull-secret
更改权限以使
ccoctl
可执行:$ chmod 775 ccoctl
验证
要验证
ccoctl
是否可以使用,请显示帮助文件:$ ccoctl aws --help
ccoctl aws --help
的输出:Creating/updating/deleting cloud credentials objects for AWS cloud Usage: ccoctl aws [command] Available Commands: create-all Create all the required credentials objects create-iam-roles Create IAM roles create-identity-provider Create IAM identity provider create-key-pair Create a key pair delete Delete credentials objects Flags: -h, --help help for aws Use "ccoctl aws [command] --help" for more information about a command.
18.5.2.2. 使用 Cloud Credential Operator 实用程序创建 AWS 资源
您可以使用 CCO 实用程序(ccoctl
) 单独创建所需的 AWS 资源,或使用单个命令来创建。
18.5.2.2.1. 单独创建 AWS 资源
如果您需要在修改 AWS 资源前查看 ccoctl
工具创建的 JSON 文件,或者 ccoctl
工具用于创建 AWS 资源的过程无法自动满足组织的要求,您可以单独创建 AWS 资源。例如,此选项对于在不同用户或部门之间共享创建这些资源的组织可能有用。
否则,您可以使用 ccoctl aws create-all
命令自动创建 AWS 资源。
默认情况下,ccoctl
在运行命令的目录中创建对象。要在其他目录中创建对象,请使用 --output-dir
标志。此流程使用 <path_to_ccoctl_output_dir>
来引用这个目录。
有些 ccoctl
命令会发出 AWS API 调用来创建或修改 AWS 资源。您可以使用 --dry-run
标志来避免 API 调用。使用此标志可在本地文件系统中创建 JSON 文件。您可以使用 --cli-input-json
参数查看和修改 JSON 文件,然后使用 AWS CLI 工具应用它们。
先决条件
-
提取并准备
ccoctl
二进制文件。
流程
生成用于为集群设置 OpenID Connect 供应商的公共和私有 RSA 密钥文件:
$ ccoctl aws create-key-pair
输出示例:
2021/04/13 11:01:02 Generating RSA keypair 2021/04/13 11:01:03 Writing private key to /<path_to_ccoctl_output_dir>/serviceaccount-signer.private 2021/04/13 11:01:03 Writing public key to /<path_to_ccoctl_output_dir>/serviceaccount-signer.public 2021/04/13 11:01:03 Copying signing key for use by installer
其中
serviceaccount-signer.private
和serviceaccount-signer.public
是生成的密钥文件。此命令还会在
/<path_to_ccoctl_output_dir>/tls/bound-service-account-signing-key.key
中创建集群在安装过程中所需的私钥。在 AWS 上创建 OpenID Connect 身份提供程序和 S3 存储桶:
$ ccoctl aws create-identity-provider \ --name=<name> \ --region=<aws_region> \ --public-key-file=<path_to_ccoctl_output_dir>/serviceaccount-signer.public
其中:
-
<name>
是用于标记为跟踪而创建的云资源的名称。 -
<aws-region>
是将要在其中创建云资源的 AWS 区域。 -
<path_to_ccoctl_output_dir>
是ccoctl aws create-key-pair
命令生成的公钥文件的路径。
输出示例:
2021/04/13 11:16:09 Bucket <name>-oidc created 2021/04/13 11:16:10 OpenID Connect discovery document in the S3 bucket <name>-oidc at .well-known/openid-configuration updated 2021/04/13 11:16:10 Reading public key 2021/04/13 11:16:10 JSON web key set (JWKS) in the S3 bucket <name>-oidc at keys.json updated 2021/04/13 11:16:18 Identity Provider created with ARN: arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com
其中
02-openid-configuration
是发现文档,,03-keys.json
是 JSON Web 密钥集文件。此命令还会在
/<path_to_ccoctl_output_dir>/manifests/cluster-authentication-02-config.yaml
中创建 YAML 配置文件。此文件为集群生成的服务帐户令牌设置签发者 URL 字段,以便 AWS IAM 身份提供程序信任令牌。-
为集群中的每个组件创建 IAM 角色。
从 OpenShift Container Platform 发行镜像中提取
CredentialsRequest
对象列表:$ oc adm release extract \ --credentials-requests \ --cloud=aws \ --to=<path_to_directory_with_list_of_credentials_requests>/credrequests 1 --from=quay.io/<path_to>/ocp-release:<version>
- 1
credrequests
是存储CredentialsRequest
对象列表的目录。如果该目录不存在,此命令就会创建该目录。
使用
ccoctl
工具处理credrequests
目录中的所有CredentialsRequest
对象:$ ccoctl aws create-iam-roles \ --name=<name> \ --region=<aws_region> \ --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests \ --identity-provider-arn=arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com
注意对于使用其他 IAM API 端点的 AWS 环境(如 GovCloud),还必须使用
--region
参数指定您的区域。对于每个
CredentialsRequest
对象,ccoctl
创建一个带有信任策略的 IAM 角色,该角色与指定的 OIDC 身份提供程序相关联,以及来自 OpenShift Container Platform 发行镜像的每个CredentialsRequest
对象中定义的权限策略。
验证
要验证 OpenShift Container Platform secret 是否已创建,列出
<path_to_ccoctl_output_dir>/manifests
目录中的文件:$ ll <path_to_ccoctl_output_dir>/manifests
输出示例:
total 24 -rw-------. 1 <user> <user> 161 Apr 13 11:42 cluster-authentication-02-config.yaml -rw-------. 1 <user> <user> 379 Apr 13 11:59 openshift-cloud-credential-operator-cloud-credential-operator-iam-ro-creds-credentials.yaml -rw-------. 1 <user> <user> 353 Apr 13 11:59 openshift-cluster-csi-drivers-ebs-cloud-credentials-credentials.yaml -rw-------. 1 <user> <user> 355 Apr 13 11:59 openshift-image-registry-installer-cloud-credentials-credentials.yaml -rw-------. 1 <user> <user> 339 Apr 13 11:59 openshift-ingress-operator-cloud-credentials-credentials.yaml -rw-------. 1 <user> <user> 337 Apr 13 11:59 openshift-machine-api-aws-cloud-credentials-credentials.yaml
您可以通过查询 AWS 来验证是否已创建 IAM 角色。如需更多信息,请参阅有关列出 IAM 角色的 AWS 文档。
18.5.2.2.2. 使用单个命令创建 AWS 资源
如果您不需要在修改 AWS 资源前查看 ccoctl
工具创建的 JSON 文件,并且如果 ccoctl
工具用于创建 AWS 资源的过程会自动满足您的要求,则可以使用 ccoctl aws create-all
命令自动创建 AWS 资源。
否则,您可以单独创建 AWS 资源。
默认情况下,ccoctl
在运行命令的目录中创建对象。要在其他目录中创建对象,请使用 --output-dir
标志。此流程使用 <path_to_ccoctl_output_dir>
来引用这个目录。
先决条件
-
提取并准备
ccoctl
二进制文件。
流程
从 OpenShift Container Platform 发行镜像中提取
CredentialsRequest
对象列表:$ oc adm release extract \ --credentials-requests \ --cloud=aws \ --to=<path_to_directory_with_list_of_credentials_requests>/credrequests \ 1 --from=quay.io/<path_to>/ocp-release:<version>
- 1
credrequests
是存储CredentialsRequest
对象列表的目录。如果该目录不存在,此命令就会创建该目录。
使用
ccoctl
工具处理credrequests
目录中的所有CredentialsRequest
对象:$ ccoctl aws create-all \ --name=<name> \ --region=<aws_region> \ --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests
验证
要验证 OpenShift Container Platform secret 是否已创建,列出
<path_to_ccoctl_output_dir>/manifests
目录中的文件:$ ll <path_to_ccoctl_output_dir>/manifests
输出示例:
total 24 -rw-------. 1 <user> <user> 161 Apr 13 11:42 cluster-authentication-02-config.yaml -rw-------. 1 <user> <user> 379 Apr 13 11:59 openshift-cloud-credential-operator-cloud-credential-operator-iam-ro-creds-credentials.yaml -rw-------. 1 <user> <user> 353 Apr 13 11:59 openshift-cluster-csi-drivers-ebs-cloud-credentials-credentials.yaml -rw-------. 1 <user> <user> 355 Apr 13 11:59 openshift-image-registry-installer-cloud-credentials-credentials.yaml -rw-------. 1 <user> <user> 339 Apr 13 11:59 openshift-ingress-operator-cloud-credentials-credentials.yaml -rw-------. 1 <user> <user> 337 Apr 13 11:59 openshift-machine-api-aws-cloud-credentials-credentials.yaml
您可以通过查询 AWS 来验证是否已创建 IAM 角色。如需更多信息,请参阅有关列出 IAM 角色的 AWS 文档。
18.5.2.3. 运行安装程序
先决条件
- 获取 OpenShift Container Platform 发行镜像。
流程
进入包含安装程序的目录并创建
install-config.yaml
文件:$ openshift-install create install-config --dir <installation_directory>
其中
<installation_directory>
是安装程序在其中创建文件的目录。编辑
install-config.yaml
配置文件,使其包含将credentialsMode
参数设置为Manual
。install-config.yaml
配置文件示例apiVersion: v1 baseDomain: cluster1.example.com credentialsMode: Manual 1 compute: - architecture: amd64 hyperthreading: Enabled ...
- 1
- 添加这一行将
credentialsMode
参数设置为Manual
。
创建所需的 OpenShift Container Platform 安装清单:
$ openshift-install create manifests
将
ccoctl
生成的清单复制到安装程序创建的 manifests 目录中:$ cp /<path_to_ccoctl_output_dir>/manifests/* ./manifests/
将
ccoctl
在tls
目录中生成的私钥复制到安装目录中:$ cp -a /<path_to_ccoctl_output_dir>/tls .
运行 OpenShift Container Platform 安装程序:
$ ./openshift-install create cluster
18.5.2.4. 验证安装
- 连接到 OpenShift Container Platform 集群。
验证集群没有
root
凭证:$ oc get secrets -n kube-system aws-creds
输出应类似于:
Error from server (NotFound): secrets "aws-creds" not found
验证组件是否假定 secret 清单中指定的 IAM 角色,而不是使用由 CCO 创建的凭证:
带有 Image Registry Operator 的命令示例
$ oc get secrets -n openshift-image-registry installer-cloud-credentials -o json | jq -r .data.credentials | base64 --decode
输出应显示组件使用的角色和 Web 身份令牌,如下所示:
带有 Image Registry Operator 的输出示例
[default] role_arn = arn:aws:iam::123456789:role/openshift-image-registry-installer-cloud-credentials web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token