Kubernetes仪表板不接受仅查看服务帐户令牌

时间:2019-07-17 12:05:48

标签: docker kubernetes permissions dashboard service-accounts

所以我按照官方说明对kubernetes仪表板进行了基本设置。它与cluser-admin角色serviceaccount令牌完美配合。但是,当我使用其自己的ClusterRole和CluserRoleBinding创建另一个服务帐户时,无法通过“身份验证失败。请重试”登录到仪表板。消息。

这是我采取的步骤。

1 kubectl create serviceaccount dashboard-reader -n kube-system

2

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dashboard-reader
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "watch", "list"]
EOF

3

kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dashboard-reader
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dashboard-reader
subjects:
- kind: ServiceAccount
  name: dashboard-reader
  namespace: kube-system
EOF

然后,我从dashboard-reader-xyz secret中获取令牌,并将其应用于Dashboard登录页面。 我要实现的目标是拥有具有各种权限的单独令牌,例如管理员可以使用一个令牌登录到仪表板并具有完全权限,开发人员可以使用不同的令牌登录并且只能看到资源,等等。

仪表板版本为1.10.1。 Kubernetes版本是1.13.5

1 个答案:

答案 0 :(得分:4)

可以在k8s中创建service-account并将其限制为特定的命名空间。

请按照以下步骤操作:

  • 我假设您的k8s集群上安装了k8s-dashboard。
  • 我还假定您已通过执行these步骤来创建管理员用户来访问k8s-dashboard。
  • 现在要限制开发人员使用k8上的特定名称空间,请创建一个包含以下内容的服务帐户:
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mynamespace-user
  namespace: mynamespace

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: mynamespace-user-full-access
  namespace: mynamespace
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: mynamespace-user-view
  namespace: mynamespace
subjects:
 - kind: ServiceAccount
  name: mynamespace-user
  namespace: mynamespace
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: mynamespace-user-full-access

mynamespace替换为您要限制开发人员使用的名称空间的名称。

  • 您可以使用访问令牌登录k8s-dashboard,该令牌可以使用此命令来检索。
kubectl -n mynamespace describe secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print $1}')
  • 您还可以使用kube config登录k8s-dashboard。 kube配置内容将为:
apiVersion: v1
kind: Config
preferences: {}

# Define the cluster
clusters:
- cluster:
    certificate-authority-data: PLACE CERTIFICATE HERE
    # You'll need the API endpoint of your Cluster here:
    server: https://YOUR_KUBERNETES_API_ENDPOINT
  name: my-cluster

# Define the user
users:
- name: mynamespace-user
  user:
    as-user-extra: {}
    client-key-data: PLACE CERTIFICATE HERE
    token: PLACE USER TOKEN HERE

# Define the context: linking a user to a cluster
contexts:
- context:
    cluster: my-cluster
    namespace: mynamespace
    user: mynamespace-user
  name: mynamespace

# Define current context
current-context: mynamespace
  • 可以使用此命令检索证书
kubectl -n mynamespace get secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print $1}') -o "jsonpath={.data['ca\.crt']}"

我已经在我的环境中尝试了这些步骤,并且效果很好。

有关更多信息,请参考this

希望这会有所帮助。