当前位置: 首页 > 知识库问答 >
问题:

无法以具有kubectl代理的非管理员用户身份连接到Kubernetes仪表板

司马萧迟
2023-03-14

我想允许非管理员用户使用库伯内特斯仪表板查看其命名空间中的K8对象。作为集群管理员,我使用kubectl代理连接库伯内特斯仪表板没有问题。当我第一次尝试使用对其整个命名空间具有只读访问权限的应用程序服务号访问它时,我收到了以下错误:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:serviceaccount:ops-jenkins-lab:k8-dashboard-ops-jenkins-lab\" cannot get resource \"services/proxy\" in API group \"\" in the namespace \"kubernetes-dashboard\"",
  "reason": "Forbidden",
  "details": {
    "name": "https:kubernetes-dashboard:",
    "kind": "services"
  },
  "code": 403
}

添加了额外的RBAC角色,以允许应用程序服务号访问kubernetes-dashboard命名空间中的服务和服务/代理。现在我得到以下错误:

Forbidden (403): Http failure response for http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/api/v1/login: 403 Forbidden

如果我为仪表板创建入口,我可以使用相同的应用程序服务帐户连接到Kubernetes仪表板,而不会出问题,并且有权查看名称空间中的所有Kubernetes对象(一旦我从默认名称空间切换到正确的名称空间)。实际上我更喜欢使用入口,但出于某种原因,一旦我通过浏览器连接到Kubernetes仪表板,它就会劫持我所有其他应用程序的入口。无论我尝试连接到哪个入口,它都会自动将我重定向到Kubernetes仪表板。我必须清除所有浏览器数据才能连接到其他应用程序。

RBAC clusterrole和rolebinding:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
  name: k8-dashboard
rules:
- apiGroups:
  - extensions
  - apps
  resources:
  - '*'
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - jobs
  - cronjobs
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - '*'
  resources:
  - persistentvolumeclaims
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - '*'
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - '*'
  resources:
  - events
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - '*'
  resources:
  - configmaps
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - '*'
  verbs:
  - patch
- apiGroups:
  - apps
  resources:
  - deployments/scale
  verbs:
  - update
- apiGroups:
  - ""
  resources:
  - pods/attach
  - pods/exec
  - pods/log
  - pods/status
  - pods/delete
  verbs:
  - '*'
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - delete
- apiGroups:
  - ""
  resources:
  - secrets
  verbs:
  - create
  - get
  - delete
  - patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  annotations:
  labels:
    subjectName: k8-dashboard-sa
  name: k8-dashboard-ops-jenkins-lab
  namespace: ops-jenkins-lab
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: k8-dashboard
subjects:
- kind: ServiceAccount
  name: k8-dashboard-ops-jenkins-lab
  namespace: ops-jenkins-lab

因此,我需要使用kubectl代理连接到Kubernetes仪表板。我确信当使用kubectl代理作为非管理员用户时,需要额外的RBAC;然而,我还没有弄明白。有什么建议吗?

共有1个答案

姜楷
2023-03-14

您的ClusterRole是与Role绑定相关联的,在留档中,您可以阅读:

RoleBinding还可以引用ClusterRole,将该ClusterRole中定义的权限授予RoleBinding命名空间内的资源

这意味着,即使您使用的是ClusterRole,权限也仅限于一个名称空间,在您的案例中是ops jenkins lab

只要你试图访问的仪表盘位于kubernetes dashboard命名空间中,你就无法访问,因为你的RoleBind位于错误的命名空间中。

要允许k8 dashboard ops jenkins labserviceAccount访问不同名称空间中的资源,您应该在想要访问的名称空间中创建ClusterRoleBinding(ClusterRoleBinding没有名称空间)或(更好的选项)RoleBinding(在您的情况下,应该是kubernetes dashboard名称空间)。

如果需要进一步澄清,请告诉我。

 类似资料:
  • 问题内容: Java中是否有一种方法可以要求系统控制管理员功能。当然不做:右键单击exe->以admin身份运行。 我想要的是UAC提供的框架,例如Windows Vista或Windows 7。 还是在从jar中制作exe时进行一些设置? 问题答案: 你必须创建一个清单文件,该清单文件指定你的应用程序需要管理员权限。你可以将清单包含在exe中,也可以将其保留为单独的文件(yourapp.exe.

  • 问题内容: 运行时默认 要么 您以root用户身份连接到终端,但是我想以其他用户身份连接。这可能吗? 问题答案: 对于: 在启动Docker容器时,只需添加选项即可更改为其他用户。 对于或: 由于该命令用于附加/执行到现有进程中,因此它直接在此使用当前用户。 如果您确实想附加到想要拥有的用户,那么 从该用户开始或在您的使用中提及它 使用`su更改用户

  • 我在这方面看到了很多解决方案。我尝试了建议的命令eval 然后添加键 如何解决这个问题。在Mac上真的很新。

  • 在本章中,我们将研究Grav中的Administrative Panel Dashboard 。 仪表板充当Grav管理面板插件的信息神经中枢。 您可以检查traffic statistics , create new backups , Grav updates , maintenance information ,查看最新页面更新,还可以借助此单页清除Grav缓存。 Step 1 - 您可以指