如何解决K8S 上的雪犁收集器不使用服务帐户
似乎我们无法让 SNowplow 容器(sNowplow/scala-stream-collector-kinesis)使用我们提供的服务帐户。它始终使用 shared-eks-node-role
而不是提供的服务帐户。对于 default
和 accessKey
,配置都设置为 secretKey
。
这是我们使用的服务帐户部分:
apiVersion: v1
kind: ServiceAccount
Metadata:
name: thijs-service-account
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123:role/thijs-eks-service-account-role-sNowplow
当我检查 pod 时,我可以看到帐户:
AWS_ROLE_ARN: arn:aws:iam::123:role/thijs-eks-service-account-role-sNowplow
Exception in thread "main" com.amazonaws.services.kinesis.model.AmazonKinesisException: User: arn:aws:sts::123:assumed-role/shared-eks-node-role/i-123 is not authorized to perform: kinesis:DescribeStream on resource: arn:aws:kinesis:eu-west-1:123:stream/sNowplow-good (Service: AmazonKinesis; Status Code: 400; Error Code: AccessDeniedException; Request ID: 123-123-123; Proxy: null)
解决方法
收集器本身不进行任何角色交换。它只关心通过以下三种方法之一接收凭据:
- 默认信用提供者链
- 特定的 IAM 角色
- 环境变量。
最流行的部署是在 EC2 实例上,在这种情况下,默认 EC2 角色可用于访问帐户中的其他资源。
看起来当您在 EKS 上部署它时,事情并不那么简单。收集器似乎与这个假定角色一起工作:arn:aws:sts::123:assumed-role/shared-eks-node-role/i-123
但它没有获得 Kinesis 权限的授权。您知道是什么流程创建了该角色吗?也许您可以在那里添加缺少的 Kinesis 政策?
我也有同样的问题。
它不能使用 env
作为值,因为这些值未设置。但是,收集器作为容器运行 - 它应该使用默认凭据链。
从注释来看,似乎没有设置 env
变量,我应该使用 iam
- 当我这样做时,它使用 IAM 实例配置文件,它加载底层节点角色- 不是 SA 指定的角色。
SDK 支持 IRSA(我已将雪犁收集器容器映像更新为 1,根据 supported versions 支持大于 1.11.704 的 SDK),并且从我从收集器文档中可以看到,流配置需要一个带有 aws
或 env
作为值的 iam
块...但我想使用默认凭据链而不指定方法....
如果我连接到容器,我可以看到凭据是按照 SA 设置的:
$ env | grep -i aws
AWS_REGION=my-region
AWS_DEFAULT_REGION=my-region
AWS_ROLE_ARN=arn:aws:iam::<redacted>:role/sp-collector-role
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
但是当我运行收集器时,它仍然使用节点 IAM 实例配置文件,我在 sp-collector-role
下看不到任何活动。有没有办法使用默认的凭证链?例如在同一服务帐户中的容器上使用 aws CLI,我没有指定任何凭据,但是当我运行 aws sts get-caller-identity
时,SDK 正确解析 IRSA 角色。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。