我正在尝试将IAM角色从EKS的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 "" ...
我的角色正确吗?为什么我不能修改服务帐户?
默认情况下,Kubernetes将运行service account: default
没有正确权限的Pod 。由于我无法确定您要使用哪个Pod,因此只能假定您使用的是默认容器或您创建的其他容器。在这两种情况下,该错误均表明您用于运行Pod的服务帐户没有适当的权限。
如果使用服务帐户类型default运行此Pod,则将为其添加适当的权限。另一种方法是使用为此目的创建的另一个服务帐户来运行您的pod。这是一个例子:
apiVersion: v1
kind: ServiceAccount
metadata:
name: run-kubectl-from-pod
然后,您将必须创建适当的角色(您可以在此处找到动词的完整列表):
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: modify-service-accounts
rules:
- apiGroups: [""]
resources:
- serviceaccounts
verbs:
- get
- create
- patch
- list
我在这里使用更多的动词作为测试。Get
并且Patch
对于此用例就足够了。我提到这是因为其最佳做法是提供尽可能少的权利。
然后相应地创建您的角色:
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>
如果遇到拒绝请求的任何问题,请先检查请求属性并确定适当的请求动词。
您也可以使用以下kubectl auth can-i
命令检查访问权限:
kubectl-pod kubectl auth can-i patch serviceaccount
API服务器将使用简单yes
或响应no
。
请注意,如果要修补服务帐户以使用IAM角色,则将删除并重新创建与服务帐户相关联以应用凭据环境变量的任何现有吊舱。您可以在此处了解更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句