从 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
我在这里使用更多的动词作为测试。 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
现在,当您的 运行 您的广告连播:
时,您只需引用该服务帐户
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 服务器将以简单的 yes
或 no
.
响应
请注意,如果您想修补服务帐户以使用 IAM 角色,您将删除并重新创建任何现有的 pods应用凭据环境变量的服务帐户。您可以阅读更多相关信息 here.
我正在尝试从 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
我在这里使用更多的动词作为测试。 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
现在,当您的 运行 您的广告连播:
时,您只需引用该服务帐户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 服务器将以简单的 yes
或 no
.
请注意,如果您想修补服务帐户以使用 IAM 角色,您将删除并重新创建任何现有的 pods应用凭据环境变量的服务帐户。您可以阅读更多相关信息 here.