为服务账户创建 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.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 角色-
使用以下命令创建 IAM 角色并附加所需的 Amazon 托管策略。将
替换为您的集群名称。命令会部署一个创建了 IAM 角色的 Amazon CloudFormation 堆栈,向其附加 IAM policy,并使用 IAM 角色的 Amazon 资源名称(ARN)对现有my-clusterebs-csi-controller-sa服务账户添加注释。eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --clustermy-cluster\ --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy\ --approve \ --role-only \ --role-nameAmazonEKS_EBS_CSI_DriverRole -
如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:
-
复制并在新的
文件中粘贴以下代码。将kms-key-for-encryption-on-ebs.json替换为自定义 KMS 密钥 ID。custom-key-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"] } ] } -
创建策略。您可以将
更改为其他名称。但是,如果更改了名称,请确保在后面的步骤中也进行相应的更改。KMS_Key_For_Encryption_On_EBS_Policyaws iam create-policy \ --policy-nameKMS_Key_For_Encryption_On_EBS_Policy\ --policy-document file://kms-key-for-encryption-on-ebs.json -
使用以下命令将 IAM policy 附加到该角色。请将
替换为您的账户 ID。111122223333aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy\ --role-nameAmazonEKS_EBS_CSI_DriverRole
-
-
- Amazon Web Services Management Console
-
使用 Amazon Web Services Management Console 创建 Amazon EBS CSI 插件 IAM 角色
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在左侧导航窗格中,选择 Roles(角色)。
-
在 Roles(角色)页面上,选择 Create role(创建角色)。
-
在 Select trusted entity(选择受信任的实体)页面上,请执行以下操作:
在 Trusted entity type(受信任的实体类型)部分中,选择 Web identity(Web 身份)。
-
对于 Identity provider(身份提供商),为您的集群选择 OpenID Connect provider URL(提供商 URL)(如 Amazon EKS 中的 Overview(概述)下所示)。
-
对于 Audience (受众),请选择
sts.amazonaws.com.cn。 选择 Next(下一步)。
-
在 Add permissions(添加权限)页面上,请执行以下操作:
-
在 Filter policies (筛选器策略) 框中,输入
。AmazonEBSCSIDriverPolicy -
选中搜索返回的
左侧的复选框。AmazonEBSCSIDriverPolicy 选择 Next(下一步)。
-
-
在 Name, review, and create(命名、查看和创建)页面中,请执行以下操作:
-
对于 Role name(角色名称),请为角色输入唯一名称,例如
。AmazonEKS_EBS_CSI_DriverRole 在 Add tags (Optional)(添加标签(可选))下,通过以键值对的形式附加标签来向角色添加元数据。有关在 IAM 中使用标签的更多信息,请参阅《IAM 用户指南》中的标记 IAM 实体。
-
选择 Create role(创建角色)。
-
创建角色后,在控制台中选择角色以将其打开进行编辑。
选择 Trust relationships(信任关系)选项卡,然后选择 Edit trust policy(编辑信任策略)。
-
该行看起来类似于以下行:
"oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com.cn"在上一行末尾添加逗号,然后在前一行后面添加以下行。将
替换为集群所在的 Amazon Web Services 区域。将region-code替换为集群的 OIDC 提供商 ID。EXAMPLED539D4633E53DE1B71EXAMPLE"oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" 选择 Update policy(更新策略)以完成操作。
-
如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:
-
在左侧导航窗格中,选择 Policies (策略)。
-
在策略页面上,选择 Create a policy (创建策略)。
-
在创建策略页面上,选择 JSON 选项卡。
-
将以下代码复制并粘贴到编辑器中,从而将
替换为自定义 KMS 密钥 ID:custom-key-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"] } ] } -
请选择下一步:标签。
-
在 Add tags (Optional)(添加标签(可选))页面上,选择 Next: Review(下一步:审核)。
-
对于 Name(名称),请为您的策略输入唯一的名称(例如
)。KMS_Key_For_Encryption_On_EBS_Policy -
选择 Create policy(创建策略)。
-
在左侧导航窗格中,选择 Roles(角色)。
-
在控制台中选择
AmazonEKS_EBS_CSI_DriverRole以打开它进行编辑。 -
从 Add permissions(添加权限)下拉列表中,选择 Attach policies(附加策略)。
-
在 Filter policies (筛选器策略) 框中,输入
。KMS_Key_For_Encryption_On_EBS_Policy -
选中搜索中返回的
左侧的复选框。KMS_Key_For_Encryption_On_EBS_Policy -
选择 Attach policies(附上策略)。
-
-
使用 IAM 角色的 ARN 为
ebs-csi-controller-saKubernetes 服务账户添加注释。-
为服务账户添加注释。将
替换为您的账户 ID,并将111122223333替换为 IAM 角色名称。AmazonEKS_EBS_CSI_DriverRolekubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole -
重新启动
ebs-csi-controller部署以使注释生效。kubectl rollout restart deployment ebs-csi-controller -n kube-system
-
- Amazon CLI
-
使用 Amazon CLI 创建 Amazon EBS CSI 插件 IAM 角色
-
查看集群的 OIDC 提供商 URL。将
替换为您的集群名称。如果命令的输出为my-clusterNone,请查看先决条件。aws eks describe-cluster \ --namemy-cluster\ --query "cluster.identity.oidc.issuer" \ --output text输出示例如下。
https://oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B71EXAMPLE -
创建 IAM 角色。
-
将以下内容复制到名为
的文件中。请将aws-ebs-csi-driver-trust-policy.json替换为您的账户 ID,将111122223333替换为您的 Amazon Web Services 区域,并将region-code替换为上一步骤中返回的值。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" } } } ] } -
创建角色。您可以将
更改为其他名称。如果更改了名称,请确保在后面的步骤中也进行相应的更改。AmazonEKS_EBS_CSI_DriverRoleaws iam create-role \ --role-nameAmazonEKS_EBS_CSI_DriverRole\ --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
-
-
使用以下命令以将所需的 Amazon 托管策略附加到角色。
aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy\ --role-nameAmazonEKS_EBS_CSI_DriverRole -
如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:
-
复制并在新的
文件中粘贴以下代码。将kms-key-for-encryption-on-ebs.json替换为自定义 KMS 密钥 ID。custom-key-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"] } ] } -
创建策略。您可以将
更改为其他名称。但是,如果更改了名称,请确保在后面的步骤中也进行相应的更改。KMS_Key_For_Encryption_On_EBS_Policyaws iam create-policy \ --policy-nameKMS_Key_For_Encryption_On_EBS_Policy\ --policy-document file://kms-key-for-encryption-on-ebs.json -
使用以下命令将 IAM policy 附加到该角色。请将
替换为您的账户 ID。111122223333aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy\ --role-nameAmazonEKS_EBS_CSI_DriverRole
-
-
使用 IAM 角色的 ARN 为
ebs-csi-controller-saKubernetes 服务账户添加注释。将替换为您的账户 ID,并将111122223333替换为 IAM 角色名称。AmazonEKS_EBS_CSI_DriverRolekubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole -
重新启动
ebs-csi-controller部署以使注释生效。kubectl rollout restart deployment ebs-csi-controller -n kube-system
-