为服务账户创建 Amazon EBS CSI 驱动程序 IAM 角色 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

为服务账户创建 Amazon EBS CSI 驱动程序 IAM 角色

Amazon EBS CSI 插件需要 IAM 权限才能代表您调用 Amazon API。有关更多信息,请参阅 GitHub 上的设置驱动程序权限

部署插件后,创建并配置来使用名为 ebs-csi-controller-sa 的服务账户。服务账户绑定到被分配了所需的 Kubernetes 权限的 Kubernetes clusterrole

注意

无论您是否将 Amazon EBS CSI 插件配置为将 IAM 角色用于服务账户,pods 都可以访问分配到 IAM 角色的权限。这种情况下,除非您阻止对IMD的访问。有关更多信息,请参阅Amazon EKS 的安全最佳实践

先决条件

  • 现有集群。

    • 1.19 要求使用 eks.7 或更高版本。

    • 1.20 要求使用 eks.3 或更高版本。

    • 1.21 要求使用 eks.3 或更高版本。

  • 集群现有 Amazon Identity and Access Management (IAM) OpenID Connect (OIDC) 提供程序。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商

创建 IAM 角色并向其附加所需的 Amazon 托管策略。您可以使用 eksctl、Amazon Web Services Management Console或 Amazon CLI。

eksctl

使用 eksctl 创建 Amazon EBS CSI 插件 IAM 角色

  1. 使用以下命令创建 IAM 角色并附加所需的 Amazon 托管策略。将 my-cluster 替换为您的集群名称。命令会部署一个创建了 IAM 角色的 Amazon CloudFormation 堆栈,向其附加 IAM policy,并使用 IAM 角色的 Amazon 资源名称(ARN)对现有 ebs-csi-controller-sa 服务账户添加注释。

    eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster my-cluster \ --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --approve \ --role-only \ --role-name AmazonEKS_EBS_CSI_DriverRole
  2. 如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:

    1. 复制并在新的 kms-key-for-encryption-on-ebs.json 文件中粘贴以下代码。将 custom-key-id 替换为自定义 KMS 密钥 ID。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["custom-key-id"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["custom-key-id"] } ] }
    2. 创建策略。您可以将 KMS_Key_For_Encryption_On_EBS_Policy 更改为其他名称。但是,如果更改了名称,请确保在后面的步骤中也进行相应的更改。

      aws iam create-policy \ --policy-name KMS_Key_For_Encryption_On_EBS_Policy \ --policy-document file://kms-key-for-encryption-on-ebs.json
    3. 使用以下命令将 IAM policy 附加到该角色。请将 111122223333 替换为您的账户 ID。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
Amazon Web Services Management Console

使用 Amazon Web Services Management Console 创建 Amazon EBS CSI 插件 IAM 角色

  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在左侧导航窗格中,选择 Roles(角色)。

  3. Roles(角色)页面上,选择 Create role(创建角色)。

  4. Select trusted entity(选择受信任的实体)页面上,请执行以下操作:

    1. Trusted entity type(受信任的实体类型)部分中,选择 Web identity(Web 身份)。

    2. 对于 Identity provider(身份提供商),为您的集群选择 OpenID Connect provider URL(提供商 URL)(如 Amazon EKS 中的 Overview(概述)下所示)。

    3. 对于 Audience (受众),请选择 sts.amazonaws.com.cn

    4. 选择 Next (下一步)

  5. Add permissions(添加权限)页面上,请执行以下操作:

    1. Filter policies (筛选器策略) 框中,输入 AmazonEBSCSIDriverPolicy

    2. 选中搜索返回的 AmazonEBSCSIDriverPolicy 左侧的复选框。

    3. 选择 Next (下一步)

  6. Name, review, and create(命名、查看和创建)页面中,请执行以下操作:

    1. 对于 Role name(角色名称),请为角色输入唯一名称,例如 AmazonEKS_EBS_CSI_DriverRole

    2. Add tags (Optional)(添加标签(可选))下,通过以键值对的形式附加标签来向角色添加元数据。有关在 IAM 中使用标签的更多信息,请参阅 IAM 用户指南中的标记 IAM 实体

    3. 选择 Create role(创建角色)。

  7. 创建角色后,在控制台中选择角色以将其打开进行编辑。

  8. 选择 Trust relationships(信任关系)选项卡,然后选择 Edit trust policy(编辑信任策略)。

  9. 该行看起来类似于以下行:

    "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com.cn"

    在上一行末尾添加逗号,然后在前一行后面添加以下行。region-code 替换为集群所在的 Amazon Web Services 区域。EXAMPLED539D4633E53DE1B71EXAMPLE 替换为集群的 OIDC 提供商 ID。

    "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
  10. 选择 Update policy(更新策略)以完成操作。

  11. 如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:

    1. 在左侧导航窗格中,选择 Policies (策略)

    2. 策略页面上,选择 Create a policy (创建策略)

    3. 创建策略页面上,选择 JSON 选项卡。

    4. 将以下代码复制并粘贴到编辑器中,从而将 custom-key-id 替换为自定义 KMS 密钥 ID:

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["custom-key-id"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["custom-key-id"] } ] }
    5. 请选择下一步:标签

    6. Add tags (Optional)(添加标签(可选))页面上,选择 Next: Review(下一步:审核)。

    7. 对于 Name(名称),请为您的策略输入唯一的名称(例如 KMS_Key_For_Encryption_On_EBS_Policy)。

    8. 选择 Create policy(创建策略)

    9. 在左侧导航窗格中,选择 Roles(角色)。

    10. 在控制台中选择 AmazonEKS_EBS_CSI_DriverRole 以打开它进行编辑。

    11. Add permissions(添加权限)下拉列表中,选择 Attach policies(附加策略)。

    12. Filter policies (筛选器策略) 框中,输入 KMS_Key_For_Encryption_On_EBS_Policy

    13. 选中搜索中返回的 KMS_Key_For_Encryption_On_EBS_Policy 左侧的复选框。

    14. 选择 Attach policies(附上策略)。

Amazon CLI

使用 Amazon CLI 创建 Amazon EBS CSI 插件 IAM 角色

  1. 查看集群的 OIDC 提供商 URL。将 my-cluster 替换为您的集群名称。如果命令的输出为 None,请查看先决条件

    aws eks describe-cluster \ --name my-cluster \ --query "cluster.identity.oidc.issuer" \ --output text

    输出示例如下。

    https://oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE
  2. 创建 IAM 角色。

    1. 将以下内容复制到名为 aws-ebs-csi-driver-trust-policy.json 的文件中。请将 111122223333 替换为您的账户 ID,将 region-code 替换为您的 Amazon Web Services 区域,并将 EXAMPLED539D4633E53DE1B71EXAMPLE 替换为上一步骤中返回的值。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] }
    2. 创建角色。您可以将 AmazonEKS_EBS_CSI_DriverRole 更改为其他名称。如果更改了名称,请确保在后面的步骤中也进行相应的更改。

      aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
  3. 使用以下命令以将所需的 Amazon 托管策略附加到角色。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  4. 如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:

    1. 复制并在新的 kms-key-for-encryption-on-ebs.json 文件中粘贴以下代码。将 custom-key-id 替换为自定义 KMS 密钥 ID。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["custom-key-id"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["custom-key-id"] } ] }
    2. 创建策略。您可以将 KMS_Key_For_Encryption_On_EBS_Policy 更改为其他名称。但是,如果更改了名称,请确保在后面的步骤中也进行相应的更改。

      aws iam create-policy \ --policy-name KMS_Key_For_Encryption_On_EBS_Policy \ --policy-document file://kms-key-for-encryption-on-ebs.json
    3. 使用以下命令将 IAM policy 附加到该角色。请将 111122223333 替换为您的账户 ID。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  5. 使用 IAM 角色的 ARN 为 ebs-csi-controller-sa Kubernetes 服务账户添加注释。将 111122223333 替换为您的账户 ID,将 my-cluster 替换为您的集群名称,并将 AmazonEKS_EBS_CSI_DriverRole 替换为 IAM 角色的名称。

    kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole