×

虽然 OSToy 应用程序可以独立运行,但许多实际应用程序需要外部服务,例如数据库、对象存储或消息服务。

目标
  • 学习如何将 OSToy 应用程序与其他 Amazon Web Services (AWS) 服务(特别是 AWS S3 存储)集成。在本节结束时,应用程序将安全地创建和读取 AWS S3 存储中的对象。

  • 使用适用于 Kubernetes 的 Amazon 控制器 (ACK) 直接从 Kubernetes 创建应用程序所需的资源。

  • 使用服务帐户的 Identity and Access Management (IAM) 角色来管理访问和身份验证。

  • 使用 OSToy 创建一个基本的文本文件并将其保存在 S3 存储桶中。

  • 确认文件已成功添加并且可以从存储桶中读取。

适用于 Kubernetes 的 Amazon 控制器 (ACK)

使用 ACK 直接从 Kubernetes 创建和使用 AWS 服务。您可以使用熟悉的结构直接在 Kubernetes 框架中部署应用程序,以声明方式定义和创建 AWS 服务,例如 S3 存储桶或关系数据库服务 (RDS) 数据库。

使用 ACK,您可以创建 S3 存储桶,将其与 OSToy 应用程序集成,将文件上传到其中,并在您的应用程序中查看该文件。

服务帐户的 IAM 角色

您可以使用服务帐户的 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 控制器

安装 ACK 控制器,以便使用存储桶的 Kubernetes 自定义资源在 S3 服务中创建和删除存储桶。安装控制器还将创建所需的命名空间和服务帐户。

我们将使用 Operator 来简化操作。Operator 安装还将为您创建一个 `ack-system` 命名空间和一个 `ack-s3-controller` 服务帐户。

  1. 登录集群控制台。

  2. 在左侧菜单中,单击**Operators**,然后单击**OperatorHub**。

  3. 在过滤器框中,输入“S3”并选择**适用于 Kubernetes 的 AWS 控制器 - Amazon S3**。

    cloud experts deploying integrating ack operator

  4. 如果出现关于社区 Operator 的弹出窗口,请单击**Continue**。

  5. 单击**Install**。

  6. 在“安装模式”下选择**集群上的所有命名空间**。

  7. 在“已安装命名空间”下选择**ack-system**。

  8. 在“更新批准”下选择**手动**。

    确保选择了**手动模式**,以便服务帐户的更改不会被自动 Operator 更新覆盖。

  9. 单击**Install**。

    设置应如下图所示。

    cloud experts deployment integrating ack install

  10. 单击**Approve**。

  11. 安装将开始,但在您为 ACK 控制器创建 IAM 角色和策略之前不会完成。

为 ACK 控制器创建 IAM 角色和策略

  1. 运行以下脚本之一来创建 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
  2. 脚本完成后,它将重新启动部署,从而使用服务帐户环境变量更新服务控制器 Pod。

  3. 通过运行以下命令确认环境变量已设置

    $ 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
  4. 通过单击**Operators**,然后单击**已安装的 Operators**,在 Web 控制台中确认 ACK 控制器的成功设置。

    cloud experts deployment installing ack oper installed

  5. 如果您没有看到成功的 Operator 安装和环境变量,请通过运行以下命令手动重新启动部署

    $ oc rollout restart deployment ack-s3-controller -n ack-system

设置应用程序的访问权限

您可以创建一个 AWS IAM 角色和服务帐户,以便 OSToy 可以读取和写入 S3 存储桶中的对象。

  1. 通过运行以下命令为 OSToy 创建一个新的唯一项目

    $ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
  2. 通过运行以下命令将命名空间和项目的名称保存到环境变量

    $ export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')

创建 AWS IAM 角色

  1. 通过运行以下命令获取您的 AWS 账户 ID

    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
  2. 通过运行以下命令获取 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)
  3. 通过运行以下命令创建信任策略文件

    $ 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
  4. 通过运行以下命令创建要与您的服务帐户一起使用的 AWS IAM 角色

    $ aws iam create-role --role-name "ostoy-sa-role" --assume-role-policy-document file://ostoy-sa-trust.json

将 S3 策略附加到 IAM 角色

  1. 通过运行以下命令获取 S3 完全访问权限策略 ARN

    $ export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)
  2. 通过运行以下命令将策略附加到 AWS IAM 角色

    $ aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"

为您的 Pod 创建服务帐户

  1. 获取我们创建的 AWS IAM 角色的 ARN,以便在创建服务帐户时将其作为注释包含在内,请运行以下命令

    $ export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)
  2. 通过运行以下命令创建服务帐户

    $ 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 角色的信任关系。

  3. 通过运行以下命令授予服务帐户`restricted`角色

    $ oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa
  4. 通过运行以下命令确认注释是否成功

    $ 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 存储桶

  1. 通过运行以下命令使用清单文件创建 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 应用预期找到一个名为 <namespace>-bucket 的存储桶。如果您使用非 OSToy 项目命名空间的名称,此功能将无法正常工作。例如,如果您的项目名称为 "ostoy",则 name 的值必须为 ostoy-bucket

  2. 运行以下命令确认存储桶已创建

    $ aws s3 ls | grep ${OSTOY_NAMESPACE}-bucket

使用新的服务账号重新部署 OSToy 应用

  1. 使用您创建的服务账号运行您的 pod。

  2. 运行以下命令部署微服务

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
  3. 运行以下命令部署 ostoy-frontend

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
  4. 运行以下命令修补 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
    [...]
  5. 等待 pod 更新。

确认环境变量

  • 使用以下命令描述 pod 并验证我们的应用程序是否存在 AWS_WEB_IDENTITY_TOKEN_FILEAWS_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

通过 OSToy 查看存储桶内容

使用您的应用程序查看您的 S3 存储桶的内容。

  1. 运行以下命令获取新部署应用程序的路由

    $ oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'
  2. 打开一个新的浏览器标签页并输入上一步获得的路由。

    请务必使用 http:// 而非 https://

  3. 在 OSToy 的左侧菜单中点击 **ACK S3**。

  4. 由于这是一个新的存储桶,因此存储桶应该是空的。

    cloud expert deploying integrating ack views3contents

在您的 S3 存储桶中创建文件

使用 OStoy 创建一个文件并将其上传到 S3 存储桶。虽然 S3 可以接受任何类型的文件,但本教程中使用文本文件,以便可以轻松地在浏览器中呈现其内容。

  1. 在 OSToy 的左侧菜单中点击 **ACK S3**。

  2. 向下滚动到 **将文本文件上传到 S3**。

  3. 输入文件的名称。

  4. 输入文件的内容。

  5. 点击 **创建文件**。

    cloud expert deploying integrating ack creates3obj

  6. 滚动到顶部查看现有文件部分,并确认您刚刚创建的文件存在。

  7. 点击文件名查看文件。

    cloud experts deploying integrating ack viewobj

  8. 运行以下命令使用 AWS CLI 列出存储桶的内容,以进行确认

    $ aws s3 ls s3://${OSTOY_NAMESPACE}-bucket
    示例输出
    $ aws s3 ls s3://ostoy-bucket
    2023-05-04 22:20:51         51 OSToy.txt