默认情况下,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
我在这里使用更多的动词作为测试。 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>
如果您遇到任何请求被拒绝的问题,请先查看your request attributes 和determine the appropriate request verb。
您也可以使用kubectl auth can-i 命令检查您的访问权限:
kubectl-pod kubectl auth can-i patch serviceaccount
API 服务器会以简单的yes 或no 进行响应。
请注意,如果您想修补服务帐户以使用 IAM 角色,您将需要删除并重新创建与服务帐户关联的任何现有 pod 以应用凭证环境变量。你可以阅读更多关于它的信息here。