Kubernetes仪表板,CrashLoopBackOff,用户不在命名空间“ kube-system”中

时间:2019-02-26 23:20:31

标签: kubernetes rbac

我正在尝试运行Kubernetes仪表板。我已经按照official wiki中的步骤进行操作。

列出kube系统吊舱,我明白了:

kubectl get pods -n kube-system
kubernetes-dashboard-head-7478c547df-8bmxf  0/1  CrashLoopBackOff  1  12s

重新启动此Pod会导致相同的崩溃。在日志中,它似乎已崩溃是因为:

kubectl logs -n kube-system kubernetes-dashboard-head-7478c547df-8bmxf  
2019/02/26 23:15:57 Starting overwatch
2019/02/26 23:15:57 Using namespace: kube-system
2019/02/26 23:15:57 Using in-cluster config to connect to apiserver
2019/02/26 23:15:57 Using secret token for csrf signing
2019/02/26 23:15:57 Initializing csrf token from kubernetes-dashboard-csrf secret
panic: secrets "kubernetes-dashboard-csrf" is forbidden: User "system:serviceaccount:kube-system:kubernetes-dashboard-head" cannot get secrets in the namespace "kube-system": RBAC: role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal-head" not found

我不完全了解。来自命名空间容器serviceaccounts的{​​{1}}:

kubernetes-dashbaord-head

由于kubectl get serviceaccounts -n kube-system kubernetes-dashboard-head 1 8h 中的serviceaccount(与“用户”相同吗?)在命名空间serviceaccounts下的kube-system中列出,为什么它不能从该命名空间获取秘密? / p>

在向RBAC: role.rbac.authorization.k8s.io ... not found发帖的情况下,这与此issue相关吗?

这是minikube上的不是

2 个答案:

答案 0 :(得分:2)

首先,您的案例无关。这就是您遇到的类似错误。

您需要具有可能没有的适当的Role和RoleBinding,这就是为什么会出现此错误的原因。 您可以使用以下命令进行验证:

kubectl get role,rolebinding -n kube-system |grep kubernetes-dashboard-minimal-head

如果您从安装指南中查看Kubernetes仪表板的最新部署issue文件,则将在下方找到Role和RoleBinding资源。

# ------------------- Dashboard Role & Role Binding ------------------- #

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-minimal-head
  namespace: kube-system
rules:
  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create"]
...

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-dashboard-minimal-head
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard-minimal-head
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard-head
  namespace: kube-system

但是我不确定您是如何部署部署的,因此建议您通过以下方式删除部署yaml文件

kubectl delete -f <your-deployment-file.yaml>

然后最新申请,其中包括仪表板的角色和RoleBindings

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard-head.yaml

然后您可以通过以下方式再次进行验证:

kubectl get role,rolebinding -n kube-system |grep kubernetes-dashboard-minimal-head

当然要检查一下您的吊舱。 我希望它会有用

答案 1 :(得分:1)

错误提示secrets "kubernetes-dashboard-csrf" is forbidden: User "system:serviceaccount:kube-system:kubernetes-dashboard-head" cannot get secrets in the namespace "kube-system": RBAC: role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal-head" not found时,您正在kubernetes-dashboard-head命名空间的kube-system serviceaccount下运行k8s-dashboard pod。并且服务帐户无权访问get/list秘密kubernetes-dashboard-csrf。 现在要解决此问题,您需要授予访问权限以获取该机密。您可以通过两种方式完成此操作:1.允许仪表板以cluster-admin角色运行。2.仅允许它在该命名空间中获取该秘密。 从安全角度来看,第二个选择是很多。为此,您需要按以下方式添加/编辑绑定到此服务帐户(kubernetes-dashboard-head)的clusterrole(可能是clusterrole,因为您要查看/编辑整个集群的对象):

- apiGroups:
  - ""
  resourceNames:
  - kubernetes-dashboard-csrf
  resources:
  - secrets
  verbs:
  - get
  - list
  - create
  - update