使用配置文件访问Kubernetes Dashboard没有足够的数据来创建身份验证信息结构。

时间:2018-01-12 14:44:17

标签: kubernetes

我正在尝试使用配置文件访问kubernetes仪表板。从我选择配置文件时的身份验证中给出“Not enough data to create auth info structure。”相同的配置文件适用于kubectl命令。

enter image description here

这是我的配置文件。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://kubemaster:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

有任何帮助来解决此问题吗?

由于 SR

10 个答案:

答案 0 :(得分:10)

kubeconfig文件中仅支持--authentication-mode标志指定的身份验证选项。

您可以使用令牌(kube-system命名空间中的任何令牌)进行身份验证:

$ kubectl get secrets -n kube-system
$ kubectl get secret $SECRET_NAME -n=kube-system -o json | jq -r '.data["token"]' | base64 -d > user_token.txt

并使用令牌进行身份验证(请参阅 user_token.txt 文件)。

答案 1 :(得分:6)

查看此答案How to sign in kubernetes dashboard?后,源代码会计算出kubeconfig身份验证。

在主服务器上安装kubeadm后,获取默认服务帐户令牌并将其添加到配置文件中。然后使用配置文件进行身份验证。

您可以使用它来添加令牌。

#!/bin/bash
TOKEN=$(kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}')

kubectl config set-credentials kubernetes-admin --token="${TOKEN}"

你的配置文件应该是这样的。

kubectl config view |cut -c1-50|tail -10
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.ey

答案 2 :(得分:4)

如果您想通过仪表板的验证提示然后能够在仪表板上执行管理员工作,我建议您:https://github.com/kubernetes/dashboard/wiki/Creating-sample-user

答案 3 :(得分:2)

1-假设已按照说明在此处设置仪表板。 https://docs.microsoft.com/en-us/vsts/git/concepts/git-config?view=vsts&tabs=visual-studio#rebase-local-branch-when-pulling

2-您可以从命令行正常进行kubectl访问(即kubectl获取服务)。

3-通过复制/粘贴,您可以使用令牌(使用kubectl -n kube-system describe secret ...)手动登录到仪表板。

4-但是,为了简单起见,现在您想使用“ Kubeconfig”(而不是“ Token”)选项登录到仪表板。

https://docs.aws.amazon.com/eks/latest/userguide/dashboard-tutorial.html

解决方案:

  • 在用于访问群集的配置文件中找到您的用户。
  • 此原始发布的问题中的用户是“ kubernetes-admin”。
  • 添加带有“令牌:”的行。
  • 不要忘记这是YAML,所以请使用空格,而不是制表符。

这是它的外观...

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://kubemaster:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: PUT_YOUR_TOKEN_HERE_THAT_YOU_USED_TO_MANUALLY_LOGIN

答案 4 :(得分:2)

两件事正在发生

  • Kubernetes仪表板应用程序需要身份验证令牌
  • 此身份验证令牌必须链接到具有足够特权的帐户。

部署仪表板应用程序的通常方法是

但是,此默认配置是通用且最少的。它只是映射具有最小特权的角色绑定。而且,尤其是在DigitalOcean上,在配置群集时提供的kubeconfig文件缺少实际令牌,这是登录仪表板所必需的。

因此,要解决这些缺陷,我们需要确保有一个帐户,该帐户具有对命名空间 kube-system 中的 cluster-admin ClusterRole的RoleBinding。上述默认设置仅提供对kubernetes-dashboard-minimal的绑定。 我们可以通过显式删除

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

然后我们还需要获取此ServiceAccount的令牌...

  • kubectl get serviceaccount -n kube-system将列出您所有的服务帐户。检查您要创建的人是否存在
  • kubectl get secrets -n kube-system应为此帐户列出一个秘密
  • 并使用kubectl describe secret -n kube-system admin-user-token- XXXXXX ,您将获得有关令牌的信息。

该问题的其他答案提供了足够的提示,说明如何以方便的方式编写此访问的脚本(例如,使用awk,使用grep,使用kubectl get-o=json并传递到jq,或使用-o=jsonpath

然后您可以:

  • 将此令牌存储到文本文件中并上传
  • 编辑您的kubeconfig文件,并将令牌粘贴到此处提供的 admin用户

答案 5 :(得分:0)

如果要在进行重大投资设置安全性之前先查看仪表板的运行情况,这是使事情快速进行的方法。我是通过v2.0.0-rc7完成的:

  • 使用the alternative method进行安装,开始时会设置一些不太安全的内容。
  • 使用此方法安装的ClusterRoleRef需要替换为this one。 (您需要先使用kubectl delete ...删除现有的,然后再添加。)
  • second paragraph here说明了“跳过方法”。更新您的deployment进行设置。

现在,您可以转到网页并单击“跳过”。瞧!您所有的密钥都暴露无密码。祈祷没有人知道该链接!

但是等等,您说进入还是很困难的?如果安装了负载均衡器,请执行以下两个附加步骤:

  • kubectl -n kubernetes-dashboard edit service kubernetes-dashboard将允许您将服务规格更改为type: LoadBalancer
  • 如果您的负载均衡器设置正确,kubectl -n kubernetes-dashboard describe service kubernetes-dashboard现在将向您显示IP地址,该地址已将您不安全的仪表板置于其上。

现在,您的端口不安全,没有密码,可以轻松浏览皇冠上的珠宝。享受吧!

答案 6 :(得分:0)

有两种方法可以提供kubernetes资源访问权限。

  1. 用户

  2. 服务帐户

  3. 用户。使用crt和key创建用户。分配角色和绑定。但是,您无法使用基于证书/密钥的用户访问仪表板

  4. 服务帐户。

  5. 创建名称空间,服务帐户,角色和角色绑定。为角色分配角色绑定,然后使用kubectl rolebinding命令分配给服务帐户。

然后从kubectl中获取秘密。机密名称将以服务帐户名称开头。每当您创建服务帐户时,也会为其创建密钥。

将唯一令牌复制到仪表板Webgui以获得访问权限。

如果提供了admin和admin角色绑定,则您将获得完全访问权限,否则,在角色中启用的访问权限将在仪表板中可用。

答案 7 :(得分:0)

对我来说,我意识到我正在遵循安装仪表板的过时教程(我正在安装仪表板的v1,但存在v2)。

现在您可以使用令牌登录到仪表板。

答案 8 :(得分:0)

答案可能取决于版本。仅供参考,我使用的是 K8s v1.20 和 Dashboard v2.1.0 首先我通过以下dashboardsvcacct.yaml 文件创建了一个仪表板管理员服务帐户

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kubernetes-dashboard

并通过

将其应用到集群
#kubectl apply -f dashboardsvcacct.yaml
#serviceaccount/dashboard-admin created

然后我创建了一个角色绑定,允许上面的服务账户 cluster-admin 角色访问,而不是共享 kubernetes-admin 账户。通过以下dashboardrolebinding.yaml 完成

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard

并通过

将其应用到集群
#kubectl apply -f dashboardrolebinding.yaml
#clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created

然后通过

从与 kubernetes-dashboard 命名空间关联的新创建的dashboard-admin 帐户中提取令牌
#kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')

输出包括下面的令牌。为了发布目的,我缩短了令牌。请注意,从终端复制/粘贴时不要包含换行符。

Name:         dashboard-admin-token-9pzgf
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: 7efde521-60fd-40f3-9fe0-2097c123421c

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Im1OVl<Shortened for posting>
ca.crt:     1066 bytes
namespace:  20 bytes

从上面的输出中复制并粘贴完整的令牌允许我通过令牌选项访问仪表板,但每次都这样做很痛苦。

主要问题是能够使用配置文件选项。配置文件不需要包含任何 X509 证书,因为仪表板不/不能使用这些证书。此外,完全共享包含证书和私钥的 kubernetes-admin 配置文件也不安全。因此访问仪表板所需的配置文件可以基于 kubernetes-admin 配置而无需 kubernetes-admin 数据,因为只需要集群服务器 API 目标和公共 ca 证书数据。文件的其余部分是来自仪表板管理员服务帐户的信息,包括令牌。配置文件需要如下所示。请注意,“集群”部分下的所有内容都将特定于您的安装。 “上下文”和“用户”部分将相同,但安装的令牌除外。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tL<Shortened for posting>
    server: https://10.175.0.3:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: dashboard-admin
  name: dashboard-admin@kubernetes
current-context: dashboard-admin@kubernetes
kind: Config
preferences: {}
users:
- name: dashboard-admin
  user:
    token: eyJhbGciOiJSUzI1NiIsImtpZCI6Im1OVl<Same Token as above, Shortened for posting>

将仪表板 UI 指向该配置文件允许我登录。

答案 9 :(得分:0)

这发生在我使用 kubectl proxy 访问仪表板时。我通过访问运行 minikube 的物理机上的 minikube dashboard 修复了它。