从 EKS 中的 Pod 将 IAM 角色附加到 Serviceaccount

Attach IAM Role to Serviceaccount from a Pod in EKS

我正在尝试从 EKS 中的 POD 中将 IAM 角色附加到 Pod 的服务帐户。

kubectl annotate serviceaccount -n $namespace $serviceaccount eks.amazonaws.com/role-arn=$ARN

$serviceaccount 的当前角色概述如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: common-role
rules:
  - apiGroups: [""]
    resources:
      - event
      - secrets
      - configmaps
      - serviceaccounts
     verbs:
      - get
      - create

但是,当我执行 kubectl 命令时,我得到以下信息:

error from server (forbidden): serviceaccounts $serviceaccount is forbidden: user "system:servi...." cannot get resource "serviceaccounts" in API group "" ...

我的角色正确吗?为什么我不能修改服务帐号?

虽然您的角色看起来是正确的,但请记住,在执行 kubectl 时,您在 kubeconfig 中的帐户的 RBAC 权限与您是否被允许执行操作有关。

根据您的问题,我了解到您的角色已附加到您尝试注释的服务帐户,这与 kubectl 权限检查无关。

Kubernetes 默认情况下将 运行 pods 和 service account: default 没有正确的权限。由于我无法确定您使用的是哪个 Pod,因此我只能假设您使用的是默认设置或您创建的其他设置。在这两种情况下,错误都表明您用于 运行 您的 pod 的服务帐户没有适当的权限。

如果您 运行 使用 default 服务帐户类型的此 pod,您将向其添加适当的权限。另一种方法是 运行 您的 pod 使用为此目的创建的另一个服务帐户。这是一个例子:

apiVersion: v1  
kind: ServiceAccount  
metadata:  
   name: run-kubectl-from-pod 

然后你必须创建适当的角色(你可以找到动词的完整列表here):

apiVersion: rbac.authorization.k8s.io/v1  
kind: Role  
metadata:  
  name: modify-service-accounts
rules:  
  - apiGroups: [""]  
    resources:  
      - serviceaccounts 
    verbs:  
      - get  
      - create 
      - patch 
      - list

我在这里使用更多的动词作为测试。 GetPatch 对于这个用例就足够了。我提到这一点是因为最好的做法是提供尽可能少的权利。

然后相应地创建您的角色:

apiVersion: rbac.authorization.k8s.io/v1  
kind: RoleBinding  
metadata:  
name: modify-service-account-bind 
subjects:  
- kind: ServiceAccount  
  name: run-kubectl-from-pod 
roleRef:  
  kind: Role  
  name: modify-service-accounts 
  apiGroup: rbac.authorization.k8s.io

现在,当您的 运行 您的广告连播:

时,您只需引用该服务帐户
apiVersion: v1  
kind: Pod  
metadata:  
  name: run-kubectl-in-pod 
spec:  
  serviceAccountName: run-kubectl-from-pod  
  containers:  
    - name: kubectl-in-pod  
      image: bitnami/kubectl 
      command: 
      - sleep 
      - "3600" 

完成后,您只需执行 pod 即可:

➜  kubectl-pod kubectl exec -ti run-kubectl-in-pod sh  

然后注释服务账号:

$ kubectl get sa 
NAME                   SECRETS   AGE
default                1         19m
eks-sa                 1         36s
run-kubectl-from-pod   1         17m

$ kubectl annotate serviceaccount eks-sa eks.amazonaws.com/role-arn=$ARN
serviceaccount/eks-sa annotated

$ kubectl describe sa eks-sa 
Name:                eks-sa
Namespace:           default
Labels:              <none>
Annotations:         eks.amazonaws.com/role-arn: 
Image pull secrets:  <none>
Mountable secrets:   eks-sa-token-sldnn
Tokens:              <none>
Events:              <none>

如果您遇到请求被拒绝的任何问题,请先查看 your request attributes and determine the appropriate request verb

您还可以使用 kubectl auth can-i 命令检查您的访问权限:

kubectl-pod kubectl auth can-i patch serviceaccount 

API 服务器将以简单的 yesno.

响应

请注意,如果您想修补服务帐户以使用 IAM 角色,您将删除并重新创建任何现有的 pods应用凭据环境变量的服务帐户。您可以阅读更多相关信息 here.