【问题标题】:Attach IAM Role to Serviceaccount from a Pod in EKS将 IAM 角色从 EKS 中的 Pod 附加到 Serviceaccount
【发布时间】:2021-03-16 05:52:10
【问题描述】:

我正在尝试从 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 "" ...

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

【问题讨论】:

  • 这看起来像您启动 pod 的服务帐户没有适当的权限,或者您没有将角色绑定到服务帐户。您可以使用角色绑定、服务帐户和 pod yaml 更新您的问题吗?

标签: kubernetes amazon-eks


【解决方案1】:

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

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

【讨论】:

  • 是的,权限似乎是个问题。澄清一下,serviceaccount 之前就存在过。我只是想修改它。作为测试,我将verbs 更改为*,它现在可以工作了。但我对允许所有操作打开感觉不太好。在这种情况下我应该允许什么特定的动词?
  • 我在哪里可以找到这方面的文档?我想知道有哪些动词可用。
  • @SSF,你可以在Kubernetes API Reference找到动词
【解决方案2】:

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

如果您使用服务帐户类型默认运行​​此 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

现在您只需在运行 pod 时引用该服务帐户:

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 attributesdetermine the appropriate request verb

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

kubectl-pod kubectl auth can-i patch serviceaccount 

API 服务器会以简单的yesno 进行响应。


请注意,如果您想修补服务帐户以使用 IAM 角色,您将需要删除并重新创建与服务帐户关联的任何现有 pod 以应用凭证环境变量。你可以阅读更多关于它的信息here


【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2021-02-11
    • 2017-05-17
    • 2019-12-03
    • 1970-01-01
    • 2020-09-02
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多