【问题标题】:Kubernetes Dashboard, CrashLoopBackOff, user not in namespace "kube-system"Kubernetes 仪表板,CrashLoopBackOff,用户不在命名空间“kube-system”中
【发布时间】:2019-10-05 02:01:25
【问题描述】:

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

列出 kube-system pod,我明白了:

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

我不完全明白这是怎么回事。来自此命名空间容器 kubernetes-dashbaord-headserviceaccounts

kubectl get serviceaccounts -n kube-system
kubernetes-dashboard-head            1         8h

既然这个serviceaccount(和“用户”一样吗?)列在serviceaccounts命名空间kube-system下,为什么它不能从那个命名空间获取秘密?

记录到RBAC: role.rbac.authorization.k8s.io ... not found,这与issue有关吗?

这不是minikube上的不是

【问题讨论】:

    标签: kubernetes rbac


    【解决方案1】:

    首先,您的案例与此issue 无关。这只是您遇到的类似错误。

    您需要具有您可能没有的适当角色和角色绑定,这就是您收到此错误的原因。 您可以使用以下命令进行验证:

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

    如果您从安装指南中查看 Kubernetes 仪表板的最新部署 yaml 文件,您将在下面找到 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>
    

    然后应用最新的,包括仪表板的角色和角色绑定

    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
    

    当然还要检查你的 pod。 希望对你有用

    【讨论】:

      【解决方案2】:

      正如您的错误提示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,您在kube-system 命名空间中的kubernetes-dashboard-head serviceaccount 下运行k8s-dashboard pod。并且服务帐户无权访问get/list 秘密kubernetes-dashboard-csrf。 现在要解决此问题,您需要授予访问权限以获取该机密。您可以通过两种方式做到这一点:1. 允许仪表板以cluster-admin 角色运行 2. 只允许它在该命名空间中获取该秘密。 从安全的角度来看,第二种选择要好得多。为此,您需要添加/编辑绑定到此服务帐户(kubernetes-dashboard-head)的集群角色(可能是集群角色,因为您想查看/编辑集群范围内的对象),如下所示:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-06
        • 2019-04-25
        • 1970-01-01
        • 2021-02-10
        • 2020-01-12
        • 1970-01-01
        • 2021-03-16
        • 2018-11-21
        相关资源
        最近更新 更多