$ curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/setup-s3-ack-controller.sh | bash
虽然 OSToy 应用程序可以独立运行,但许多实际应用程序需要外部服务,例如数据库、对象存储或消息服务。
学习如何将 OSToy 应用程序与其他 Amazon Web Services (AWS) 服务(特别是 AWS S3 存储)集成。在本节结束时,应用程序将安全地创建和读取 AWS S3 存储中的对象。
使用适用于 Kubernetes 的 Amazon 控制器 (ACK) 直接从 Kubernetes 创建应用程序所需的资源。
使用服务帐户的 Identity and Access Management (IAM) 角色来管理访问和身份验证。
使用 OSToy 创建一个基本的文本文件并将其保存在 S3 存储桶中。
确认文件已成功添加并且可以从存储桶中读取。
使用 ACK 直接从 Kubernetes 创建和使用 AWS 服务。您可以使用熟悉的结构直接在 Kubernetes 框架中部署应用程序,以声明方式定义和创建 AWS 服务,例如 S3 存储桶或关系数据库服务 (RDS) 数据库。
使用 ACK,您可以创建 S3 存储桶,将其与 OSToy 应用程序集成,将文件上传到其中,并在您的应用程序中查看该文件。
您可以使用服务帐户的 IAM 角色将 IAM 角色直接分配给 Kubernetes 服务帐户。您可以使用它来授予 ACK 控制器在您的 AWS 帐户中部署服务的凭证。使用 服务帐户的 IAM 角色 自动化临时凭证的管理和轮换。
Pod 会收到有效的 OpenID Connect (OIDC) JSON 网络令牌 (JWT),并将其传递给 AWS STS AssumeRoleWithWebIdentity
API 操作以接收 IAM 临时角色凭证。此过程依赖于 EKS Pod 身份变异 Webhook,该 Webhook 会修改需要 AWS IAM 访问权限的 Pod。
服务帐户的 IAM 角色遵循以下最佳实践
最小权限原则:您可以为 AWS 角色创建仅允许有限访问权限的 IAM 权限。这些权限仅限于与该角色关联的服务帐户,并且只有使用该服务帐户的 Pod 才能访问。
凭证隔离:Pod 只能检索与 Pod 使用的服务帐户关联的 IAM 角色的凭证。
审核:所有 AWS 资源访问都可以在 CloudTrail 中查看。
安装 ACK 控制器,以便使用存储桶的 Kubernetes 自定义资源在 S3 服务中创建和删除存储桶。安装控制器还将创建所需的命名空间和服务帐户。
我们将使用 Operator 来简化操作。Operator 安装还将为您创建一个 `ack-system` 命名空间和一个 `ack-s3-controller` 服务帐户。
登录集群控制台。
在左侧菜单中,单击**Operators**,然后单击**OperatorHub**。
在过滤器框中,输入“S3”并选择**适用于 Kubernetes 的 AWS 控制器 - Amazon S3**。
如果出现关于社区 Operator 的弹出窗口,请单击**Continue**。
单击**Install**。
在“安装模式”下选择**集群上的所有命名空间**。
在“已安装命名空间”下选择**ack-system**。
在“更新批准”下选择**手动**。
确保选择了**手动模式**,以便服务帐户的更改不会被自动 Operator 更新覆盖。 |
单击**Install**。
设置应如下图所示。
单击**Approve**。
安装将开始,但在您为 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
脚本完成后,它将重新启动部署,从而使用服务帐户环境变量更新服务控制器 Pod。
通过运行以下命令确认环境变量已设置
$ oc describe pod ack-s3-controller -n ack-system | grep "^\s*AWS_"
AWS_ROLE_ARN: arn:aws:iam::000000000000:role/ack-s3-controller
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
通过单击**Operators**,然后单击**已安装的 Operators**,在 Web 控制台中确认 ACK 控制器的成功设置。
如果您没有看到成功的 Operator 安装和环境变量,请通过运行以下命令手动重新启动部署
$ oc rollout restart deployment ack-s3-controller -n ack-system
您可以创建一个 AWS IAM 角色和服务帐户,以便 OSToy 可以读取和写入 S3 存储桶中的对象。
通过运行以下命令为 OSToy 创建一个新的唯一项目
$ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
通过运行以下命令将命名空间和项目的名称保存到环境变量
$ export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')
通过运行以下命令获取您的 AWS 账户 ID
$ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
通过运行以下命令获取 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)
通过运行以下命令创建信任策略文件
$ cat <<EOF > ./ostoy-sa-trust.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"${OIDC_PROVIDER}:sub": "system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa"
}
}
}
]
}
EOF
通过运行以下命令创建要与您的服务帐户一起使用的 AWS IAM 角色
$ aws iam create-role --role-name "ostoy-sa-role" --assume-role-policy-document file://ostoy-sa-trust.json
通过运行以下命令获取 S3 完全访问权限策略 ARN
$ export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)
通过运行以下命令将策略附加到 AWS IAM 角色
$ aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"
获取我们创建的 AWS IAM 角色的 ARN,以便在创建服务帐户时将其作为注释包含在内,请运行以下命令
$ export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)
通过运行以下命令创建服务帐户
$ cat <<EOF | oc apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: ostoy-sa
namespace: ${OSTOY_NAMESPACE}
annotations:
eks.amazonaws.com/role-arn: "$APP_IAM_ROLE_ARN"
EOF
请勿将服务帐户的名称从“ostoy-sa”更改,否则您必须更改 AWS IAM 角色的信任关系。 |
通过运行以下命令授予服务帐户`restricted`角色
$ oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa
通过运行以下命令确认注释是否成功
$ oc describe serviceaccount ostoy-sa -n ${OSTOY_NAMESPACE}
Name: ostoy-sa
Namespace: ostoy
Labels: <none>
Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::000000000000:role/ostoy-sa-role
Image pull secrets: ostoy-sa-dockercfg-b2l94
Mountable secrets: ostoy-sa-dockercfg-b2l94
Tokens: ostoy-sa-token-jlc6d
Events: <none>
通过运行以下命令使用清单文件创建 S3 存储桶
$ cat <<EOF | oc apply -f -
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
name: ${OSTOY_NAMESPACE}-bucket
namespace: ${OSTOY_NAMESPACE}
spec:
name: ${OSTOY_NAMESPACE}-bucket
EOF
OSToy 应用预期找到一个名为 |
运行以下命令确认存储桶已创建
$ aws s3 ls | grep ${OSTOY_NAMESPACE}-bucket
使用您创建的服务账号运行您的 pod。
运行以下命令部署微服务
$ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
运行以下命令部署 ostoy-frontend
$ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
运行以下命令修补 ostoy-frontend
部署
$ oc patch deploy ostoy-frontend -n ${OSTOY_NAMESPACE} --type=merge --patch '{"spec": {"template": {"spec":{"serviceAccount":"ostoy-sa"}}}}'
spec:
# Uncomment to use with ACK portion of the workshop
# If you chose a different service account name please replace it.
serviceAccount: ostoy-sa
containers:
- name: ostoy-frontend
image: quay.io/ostoylab/ostoy-frontend:1.6.0
imagePullPolicy: IfNotPresent
[...]
等待 pod 更新。
使用以下命令描述 pod 并验证我们的应用程序是否存在 AWS_WEB_IDENTITY_TOKEN_FILE
和 AWS_ROLE_ARN
环境变量
$ oc describe pod ostoy-frontend -n ${OSTOY_NAMESPACE} | grep "^\s*AWS_"
AWS_ROLE_ARN: arn:aws:iam::000000000000:role/ostoy-sa
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
使用您的应用程序查看您的 S3 存储桶的内容。
运行以下命令获取新部署应用程序的路由
$ oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'
打开一个新的浏览器标签页并输入上一步获得的路由。
请务必使用 |
在 OSToy 的左侧菜单中点击 **ACK S3**。
由于这是一个新的存储桶,因此存储桶应该是空的。
使用 OStoy 创建一个文件并将其上传到 S3 存储桶。虽然 S3 可以接受任何类型的文件,但本教程中使用文本文件,以便可以轻松地在浏览器中呈现其内容。
在 OSToy 的左侧菜单中点击 **ACK S3**。
向下滚动到 **将文本文件上传到 S3**。
输入文件的名称。
输入文件的内容。
点击 **创建文件**。
滚动到顶部查看现有文件部分,并确认您刚刚创建的文件存在。
点击文件名查看文件。
运行以下命令使用 AWS CLI 列出存储桶的内容,以进行确认
$ aws s3 ls s3://${OSTOY_NAMESPACE}-bucket
$ aws s3 ls s3://ostoy-bucket
2023-05-04 22:20:51 51 OSToy.txt