EKS Pod S3访问被拒绝



我正在尝试创建一个EKS pod,用作mlflow的服务。不过,我遇到的问题是,我无法连接到s3来存储mlflow运行工件。我已经尝试使用kubectl exec -it <pod_name> -- /bin/bash连接到pod,并在那里设置aws凭据。当我这样做的时候,我可以使用s3 bucket。

但是,当我试图将mlflow工件保存到相同的s3位置时,我会得到以下错误:

An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity

是什么问题导致了这种情况?是否有IAM需要设置EKS吊舱或类似的东西?

是。在pod上运行的代码需要具有正确的IAM权限才能访问S3并执行所需的API调用。

有多种方法可以实现这一点。

选项1:将IAM策略附加到节点角色

EKS节点实际上是EC2实例,因此您可以将适当的IAM策略附加到您的节点所属的IAM角色。如果您使用的是AWS Fargate,则情况并非如此。在这种情况下,请参见选项3。这种方法的缺点是,它将这些权限授予在该节点上运行的所有pod。如果您想要更精细的控制,请参阅选项2。

如果您已经使用eksctl设置了集群,那么这相当简单。

本例获取集群中每个节点组的IAM角色名称,然后将AmazonS3FullAccess托管策略附加到每个节点组。

#!/bin/bash
for STACK_NAME in $(eksctl get nodegroup --cluster $CLUSTER_NAME -o json | jq -r '.[].StackName')
do
ROLE_NAME=$(aws cloudformation describe-stack-resources --stack-name $STACK_NAME | jq -r '.StackResources[] | select(.ResourceType=="AWS::IAM::Role") | .PhysicalResourceId')
aws iam attach-role-policy 
--role-name $ROLE_NAME 
--policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
done

然后,该策略将应用于在该节点组中创建的所有节点。请注意,如果存在多个节点组,则需要对每个节点组执行此操作。

选项2:将IAM角色分配给服务帐户

一个不那么严厉(但更为复杂(的替代方案是将IAM角色分配给服务帐户。这允许您隔离不同pod的权限。

这个选项稍微复杂一些,因为它涉及到在集群上创建OIDC身份提供程序。

选项3:(仅限AWS Fargate(Pod执行角色

如果你正在使用AWS Fargate运行你的pod,那么你应该能够为你的pod执行角色添加权限。

最新更新