从 AWS EKS 中的服务账户承担 AWS 角色

Sta*_*nko 6 python amazon-web-services boto3 amazon-eks

当前设置:python 应用程序作为 AWS EKS 集群中的 Docker 容器运行。AWS 密钥作为 kubernetes 集群中的机密提供,以便 python 代码可以读取、初始化 boto3 会话并使用 S3 存储桶。

我想如何更改它:承担 Docker 容器在 AWS EKS 集群中运行的服务帐户的角色,然后使用此凭证初始化 boto3 会话并使用 S3 存储桶。我不想为每项服务提供 AWS 密钥,因为我有很多密钥。

有什么方法可以实现所需的配置吗?

谢谢。

mur*_*mit 6

这是通过 AWS 所谓的 IRSA(serviceaccount 的 IAM 角色)来完成的

简化的 Kubernetes 版本 1.12 OIDC JSON Web 令牌,Amazon EKS 现在为每个集群托管一个公共 OIDC 发现终端节点,其中包含 JSON Web 令牌的签名密钥,因此外部系统(例如 IAM)可以验证和接受 Kubernetes 颁发的 OIDC 令牌。


AWS 指南位于: https: //kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

github 上的 AWS 指南:https ://github.com/aws/amazon-eks-pod-identity-webhook/


步骤如下所述

  1. 获取 OIDC 提供商 URL:aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text

  2. 创建具有联合身份的角色并获取角色的 ARN

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::AWS_ACCOUNT_ID:oidc-provider/OIDC_PROVIDER"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "OIDC_PROVIDER:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

请记住,您需要在此处提及 NAMESPACE,确保您拥有名为 SERVICE_ACCOUNT_NAMESPACE 的命名空间。

  1. 在 kubernetes 中创建服务帐户
apiVersion: v1
kind: ServiceAccount
metadata:
  name: SERVICE_ACCOUNT_NAME
  annotations:
    eks.amazonaws.com/role-arn: ARN_OF_ABOVE_IAM_ROLE



Run Code Online (Sandbox Code Playgroud)
  1. 使用 serviceaccount 运行 pod
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: SERVICE_ACCOUNT_NAME
  ...
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,您将能够在 k8s pod 中承担该角色。尝试在 docker 容器中运行任何 python 脚本,例如,

import boto3
client = boto3.client('iam') 
response = client.list_users()
for x in response['Users']:
print (x['UserName']) 
Run Code Online (Sandbox Code Playgroud)

授予 IAM 权限后,这将列出 AWS 账户中的用户。

参考:

  • 我认为这缺少了等式的另一半:我们如何将 boto3 连接到 pod 内的服务帐户? (3认同)