如何使用k8s ServiceAccount 承担正确的AWS 角色(IRSA)?在 EKS 上运行 Spring Boot 应用程序

问题描述 投票:0回答:1

我在 EKS 集群中运行 Spring Boot (2.6.6) 应用程序,该应用程序尝试通过承担 AWS 角色来对 AWS 进行身份验证。到目前为止我已经关注了这个doc

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-sts</artifactId>
        <version>1.12.9</version>
    </dependency>
</dependencies>

在我的应用程序 helm/k8s 设置中:

apiVersion: apps/v1
kind: Deployment
spec
  template:
    metadata:
      ...
    spec:
      serviceAccountName: myapp-service-account
      securityContext:
        fsGroup: 123456
      initContainers:
      ...

服务帐户设置:

~ % kubectl get serviceaccounts -n dev                                                   
NAME                         SECRETS   AGE
default                      1         2y1d
myapp-service-account        1         7d2h
..

~ % kubectl get serviceaccounts/myapp-service-account   -n dev -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<account_id>:role/<aws_role_to_assume>
..

但我的应用程序似乎没有承担正确的角色:

2022-06-21 17:50:25.284 警告 [my-app,,] 1 --- [ main] s.AwsSecretsManagerPropertySourceLocator :无法从 /secret/my-app_dev 加载 AWS 密钥。用户:arn:aws:sts:::假定角色/ 是 无权对资源执行:secretsmanager:GetSecretValue:/secret/my-app_dev,因为没有基于身份的策略允许执行 Secretsmanager:GetSecretValue 操作(服务:AWSSecretsManager;状态代码:400;错误代码:AccessDeniedException;请求 ID:1111111-2222 -33333-444444;代理:空)

在上面,我认为添加

serviceAccountName: myapp-service-account
将允许应用程序以某种方式获取新的 ServiceAccount,从而承担不同的角色。我在这里配置错误了什么?

编辑

环境变量:

~ % kubectl exec my-app-pod-1234-abcd -n dev -- env
...
JAVA_OPTS=
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_ROLE_ARN=arn:aws:iam::<aws_account_id>:role/<aws_role_to_assume>
...
amazon-web-services spring-boot kubernetes kubernetes-helm amazon-eks
1个回答
0
投票

您应该将角色分配给命名空间中的默认服务帐户:

地形示例: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/default_service_account

© www.soinside.com 2019 - 2024. All rights reserved.