18.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 存储桶中。
  • 确认文件已成功添加,并且可以从存储桶读取。

18.13.1. Amazon Controller for Kubernetes (ACK)

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

通过 ACK,您可以创建一个 S3 存储桶,将其与 OSToy 应用程序集成,将文件上传到其中,然后查看应用程序中的文件。

18.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 中查看。

其他资源

18.13.3. 安装 ACK 控制器

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

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

  1. 登录到集群控制台。
  2. 在左侧菜单中,单击 Operators,然后点 OperatorHub
  3. 在过滤器框中,输入 "S3" 并选择 AWS Controller for Kubernetes - Amazon S3

    cloud experts deploying integrating ack operator

  4. 如果出现有关社区操作器的弹出窗口,请单击 Continue
  5. Install
  6. 在 "Installation mode" 下选择 All namespaces on the cluster
  7. 在 "Installed Namespace" 下选择 ack-system
  8. 在 "Update approval" 下选择 Manual

    重要

    确保已选中 Manual Mode,因此自动 operator 更新不会覆盖对服务帐户的更改。

  9. Install

    设置应类似于下图。

    cloud experts deployment integrating ack install

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

18.13.4. 为 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. 脚本完成后,它会重启部署,以使用服务帐户环境变量的 IAM 角色更新服务控制器 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,然后单击 Installed operators 来确认 ACK 控制器在 web 控制台中成功设置。

    cloud experts deployment installing ack oper installed

  5. 如果没有成功安装 Operator 和环境变量,请运行以下命令来手动重启部署:

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

18.13.5. 为应用程序设置访问权限

您可以创建一个 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}')

18.13.6. 创建 AWS IAM 角色

  1. 运行以下命令来获取 AWS 帐户 ID:

    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
  2. 运行以下命令来获取 OIDC 供应商,将 < cluster-name& gt; 替换为集群名称:

    $ 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

18.13.7. 将 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}"

18.13.8. 为 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>

18.13.9. 创建 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

18.13.10. 使用新服务帐户重新部署 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 更新。

18.13.11. 确认环境变量

  • 使用以下命令描述 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

18.13.12. 通过 OSToy 查看存储桶内容

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

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

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

    重要

    确保使用 http:// 而不是 https://

  3. 在 OSToy 的左侧菜单中,单击 ACK S3
  4. 由于它是新 bucket,因此存储桶应该为空。

    cloud expert deploying integrating ack views3contents

18.13.13. 在 S3 存储桶中创建文件

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

  1. 在 OSToy 的左侧菜单中,单击 ACK S3
  2. 向下滚动到 上传文本文件到 S3
  3. 为您的文件输入文件名。
  4. 输入您的文件内容。
  5. Create file

    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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.