16.13. 教程:与 AWS 服务集成
虽然 OSToy 应用程序功能独立,但许多现实应用需要外部服务,如数据库、对象存储或消息传递服务。
目标
- 了解如何将 OSToy 应用程序与其他 Amazon Web Services (AWS)服务集成,特别是 AWS S3 存储。在本节结束时,应用程序将安全地从 AWS S3 Storage 创建和读取对象。
- 使用 Amazon Controller for Kubernetes (ACK)直接从 Kubernetes 为应用程序创建必要的服务。
- 为服务帐户使用 Identity and Access Management (IAM)角色来管理访问和身份验证。
- 使用 OSToy 创建基本文本文件并将其保存到 S3 存储桶中。
- 确认文件已成功添加,并且可以从存储桶读取。
16.13.1. Amazon Controller for Kubernetes (ACK) 复制链接链接已复制到粘贴板!
使用 ACK 来直接从 Kubernetes 创建和使用 AWS 服务。您可以使用熟悉的结构在 Kubernetes 框架中直接部署应用程序,以声明性地定义并创建 AWS 服务,如 S3 存储桶或相关数据库服务(RDS)数据库。
通过 ACK,您可以创建一个 S3 存储桶,将其与 OSToy 应用程序集成,将文件上传到其中,然后查看应用程序中的文件。
16.13.2. 服务帐户的 IAM 角色 复制链接链接已复制到粘贴板!
您可以将 IAM 角色用于服务帐户,将 IAM 角色直接分配给 Kubernetes 服务帐户。您可以使用它来授予 ACK 控制器凭证,以便在 AWS 帐户中部署服务。为服务帐户使用 IAM 角色 自动执行临时凭证的管理和轮转。
Pod 收到有效的 OpenID Connect (OIDC) JSON Web 令牌(JWT),并将其传递给 AWS STS AssumeRoleWithWebIdentity API 操作,以接收 IAM 临时角色凭证。此过程依赖于 EKS pod 身份变异 Webhook,用于修改需要 AWS IAM 访问的 pod。
服务帐户的 IAM 角色遵循以下最佳实践:
- 最低权限原则 :您可以为只允许有限访问的 AWS 角色创建 IAM 权限。这些权限仅限于与角色关联的服务帐户,只有使用该服务帐户的 pod 有权访问。
- 凭证隔离 :pod 只能检索与 Pod 使用的服务帐户关联的 IAM 角色的凭证。
- 审计 :所有 AWS 资源访问权限可在 CloudTrail 中查看。
16.13.3. 安装 ACK 控制器 复制链接链接已复制到粘贴板!
安装 ACK 控制器,以使用存储桶的 Kubernetes 自定义资源在 S3 服务中创建和删除存储桶。安装控制器也会创建所需的命名空间和服务帐户。
我们将使用 Operator 来简化。Operator 安装还会为您创建 ack-system 命名空间和服务帐户 ack-s3-controller。
- 登录到集群控制台。
- 在左侧菜单中,单击 Ecosystem,然后单击 Software Catalog。
在过滤器框中,输入 "S3" 并选择 AWS Controller for Kubernetes - Amazon S3。
- 如果出现有关社区操作器的弹出窗口,请单击 Continue。
- 点 Install。
- 在 "Installation mode" 下选择 All namespaces on the cluster。
- 在 "Installed Namespace" 下选择 ack-system。
在 "Update approval" 下选择 Manual。
重要确保已选中 Manual Mode,因此自动 operator 更新不会覆盖对服务帐户的更改。
点 Install。
设置应类似于下图。
- 单击 Approve。
- 安装开始,但在为 ACK 控制器创建 IAM 角色和策略之前,不会完成。
16.13.4. 为 ACK 控制器创建 IAM 角色和策略 复制链接链接已复制到粘贴板!
运行以下脚本之一,为 ACK 控制器创建 AWS IAM 角色并分配 S3 策略:
- 自动下载 setup-s3-ack-controller.sh 脚本,该脚本可自动完成您的流程。
在命令行界面(CLI)中运行以下脚本:
curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/setup-s3-ack-controller.sh | bash
$ curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/setup-s3-ack-controller.sh | bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- 脚本完成后,它会重启部署,以使用服务帐户环境变量的 IAM 角色更新服务控制器 Pod。
运行以下命令确认环境变量已设置:
oc describe pod ack-s3-controller -n ack-system | grep "^\s*AWS_"
$ oc describe pod ack-s3-controller -n ack-system | grep "^\s*AWS_"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
AWS_ROLE_ARN: arn:aws:iam::000000000000:role/ack-s3-controller AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_ROLE_ARN: arn:aws:iam::000000000000:role/ack-s3-controller AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/tokenCopy to Clipboard Copied! Toggle word wrap Toggle overflow 单击 Operators,然后单击 Installed operators 来确认 ACK 控制器在 web 控制台中成功设置。
如果没有成功安装 Operator 和环境变量,请运行以下命令来手动重启部署:
oc rollout restart deployment ack-s3-controller -n ack-system
$ oc rollout restart deployment ack-s3-controller -n ack-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.13.5. 为应用程序设置访问权限 复制链接链接已复制到粘贴板!
您可以创建一个 AWS IAM 角色和服务帐户,以便 OSToy 可以读取和写入对象到 S3 存储桶。
运行以下命令,为 OSToy 创建一个新的唯一项目:
oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
$ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将命名空间和项目的名称保存到环境变量中:
export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')$ export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.13.6. 创建 AWS IAM 角色 复制链接链接已复制到粘贴板!
运行以下命令来获取 AWS 帐户 ID:
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
$ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来获取 OIDC 供应商,将 <
cluster-name> 替换为集群名称:export OIDC_PROVIDER=$(rosa describe cluster -c <cluster-name> -o yaml | awk '/oidc_endpoint_url/ {print $2}' | cut -d '/' -f 3,4)$ export OIDC_PROVIDER=$(rosa describe cluster -c <cluster-name> -o yaml | awk '/oidc_endpoint_url/ {print $2}' | cut -d '/' -f 3,4)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建信任策略文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,创建用于服务帐户的 AWS IAM 角色:
aws iam create-role --role-name "ostoy-sa-role" --assume-role-policy-document file://ostoy-sa-trust.json
$ aws iam create-role --role-name "ostoy-sa-role" --assume-role-policy-document file://ostoy-sa-trust.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.13.7. 将 S3 策略附加到 IAM 角色 复制链接链接已复制到粘贴板!
运行以下命令来获取 S3 完整访问策略 ARN:
export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)
$ export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将策略附加到 AWS IAM 角色:
aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"$ aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.13.8. 为 pod 创建服务帐户 复制链接链接已复制到粘贴板!
获取我们创建的 AWS IAM 角色的 ARN,以便在创建服务帐户时将其作为注解包括:
export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)
$ export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建服务帐户:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要不要将服务帐户的名称从 "ostoy-sa" 更改,或者您必须更改 AWS IAM 角色的信任关系。
运行以下命令,为服务帐户授予
restricted角色:oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa$ oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-saCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令确认注解是否成功:
oc describe serviceaccount ostoy-sa -n ${OSTOY_NAMESPACE}$ oc describe serviceaccount ostoy-sa -n ${OSTOY_NAMESPACE}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.13.9. 创建 S3 存储桶 复制链接链接已复制到粘贴板!
运行以下命令,使用清单文件创建 S3 存储桶:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要OSToy 应用程序希望查找名为 <
namespace>-bucket 的存储桶。如果您使用 OSToy 项目的命名空间以外的任何内容,则此功能将无法正常工作。例如,如果项目是"ostoy",则name的值必须是ostoy-bucket。运行以下命令确认存储桶已创建:
aws s3 ls | grep ${OSTOY_NAMESPACE}-bucket$ aws s3 ls | grep ${OSTOY_NAMESPACE}-bucketCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.13.10. 使用新服务帐户重新部署 OSToy 应用程序 复制链接链接已复制到粘贴板!
- 使用您创建的服务帐户运行 pod。
运行以下命令来部署微服务:
- oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
$ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令部署
ostoy-frontend:- oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
$ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来修补
ostoy-frontend部署:oc patch deploy ostoy-frontend -n ${OSTOY_NAMESPACE} --type=merge --patch '{"spec": {"template": {"spec":{"serviceAccount":"ostoy-sa"}}}}'$ oc patch deploy ostoy-frontend -n ${OSTOY_NAMESPACE} --type=merge --patch '{"spec": {"template": {"spec":{"serviceAccount":"ostoy-sa"}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 等待 pod 更新。
16.13.11. 确认环境变量 复制链接链接已复制到粘贴板!
使用以下命令描述 pod,并验证应用程序是否存在
AWS_WEB_IDENTITY_TOKEN_FILE和AWS_ROLE_ARN环境变量:oc describe pod ostoy-frontend -n ${OSTOY_NAMESPACE} | grep "^\s*AWS_"$ oc describe pod ostoy-frontend -n ${OSTOY_NAMESPACE} | grep "^\s*AWS_"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
AWS_ROLE_ARN: arn:aws:iam::000000000000:role/ostoy-sa AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_ROLE_ARN: arn:aws:iam::000000000000:role/ostoy-sa AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/tokenCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.13.12. 通过 OSToy 查看存储桶内容 复制链接链接已复制到粘贴板!
使用您的应用程序查看 S3 存储桶的内容。
运行以下命令,获取新部署的应用程序的路由:
oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'$ oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 打开新的浏览器标签页,并输入上一步中获取的路由。
重要确保使用
http://而不是https://。- 在 OSToy 的左侧菜单中,单击 ACK S3。
由于它是新 bucket,因此存储桶应该为空。
16.13.13. 在 S3 存储桶中创建文件 复制链接链接已复制到粘贴板!
使用 OStoy 创建文件并将其上传到 S3 存储桶。虽然 S3 可以接受任何类型的文件,但本教程使用文本文件,以便在浏览器中轻松呈现其内容。
- 在 OSToy 的左侧菜单中,单击 ACK S3。
- 向下滚动到 上传文本文件到 S3。
- 为您的文件输入文件名。
- 输入您的文件内容。
点 Create file。
- 滚动到现有文件的顶部部分,并确认您刚才创建的文件存在。
单击文件名以查看文件。
运行以下命令列出存储桶的内容,使用 AWS CLI 进行确认:
aws s3 ls s3://${OSTOY_NAMESPACE}-bucket$ aws s3 ls s3://${OSTOY_NAMESPACE}-bucketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
aws s3 ls s3://ostoy-bucket 2023-05-04 22:20:51 51 OSToy.txt
$ aws s3 ls s3://ostoy-bucket 2023-05-04 22:20:51 51 OSToy.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow