如何登录 Kubernetes 仪表板?

Posted

技术标签:

【中文标题】如何登录 Kubernetes 仪表板?【英文标题】:How to sign in kubernetes dashboard? 【发布时间】:2018-03-21 16:55:38 【问题描述】:

我刚刚将 kubeadm 和 kubelet 升级到 v1.8.0。并按照官方document安装仪表盘。

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

之后,我通过运行启动仪表板

$ kubectl proxy --address="192.168.0.101" -p 8001 --accept-hosts='^*$'

幸运的是,我能够通过http://192.168.0.101:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/访问仪表板

我被重定向到以前从未遇到过的这样的登录页面。 好像有两种认证方式。

我尝试将 /etc/kubernetes/admin.conf 作为 kubeconfig 上传,但失败了。然后我尝试使用从kubeadm token list 获得的令牌登录,但再次失败。

问题是如何登录仪表板。看起来他们比以前增加了很多安全机制。谢谢。

【问题讨论】:

我在这里没有看到编程问题。请改用 serverfault.com。 如果您不在本地主机上,您可能需要仅使用 https,否则登录表单将静默失败(没有 err msg)。详情:***.com/questions/53957413/… 你需要生成token,按照这个指南-jhooq.com/setting-up-kubernetes-dashboard @Jolta Devops 现在是一项编程活动,这要归功于 kubernetes,您将面对它 ;) 【参考方案1】:

从 1.7 版开始,仪表板支持基于以下条件的用户身份验证:

Authorization: Bearer <token> 标头在每个请求中传递给仪表板。从 1.6 版开始支持。具有最高优先级。如果存在,则不会显示登录视图。 Bearer Token 可以在仪表板上使用 login view。 Username/password 可以在仪表板上使用 login view。 Kubeconfig 可以在 Dashboard login view 上使用的文件。

——Dashboard on Github

令牌

这里的Token 可以是Static TokenService Account TokenOpenID Connect Token 来自Kubernetes Authenticating,但不是kubeadm Bootstrap Token

使用 kubectl,我们可以获取默认在 kubernetes 中创建的服务帐户(例如部署控制器)。

$ kubectl -n kube-system get secret
# All secrets with type 'kubernetes.io/service-account-token' will allow to log in.
# Note that they have different privileges.
NAME                                     TYPE                                  DATA      AGE
deployment-controller-token-frsqj        kubernetes.io/service-account-token   3         22h

$ kubectl -n kube-system describe secret deployment-controller-token-frsqj
Name:         deployment-controller-token-frsqj
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=deployment-controller
              kubernetes.io/service-account.uid=64735958-ae9f-11e7-90d5-02420ac00002

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWNvbnRyb2xsZXItdG9rZW4tZnJzcWoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVwbG95bWVudC1jb250cm9sbGVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjQ3MzU5NTgtYWU5Zi0xMWU3LTkwZDUtMDI0MjBhYzAwMDAyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRlcGxveW1lbnQtY29udHJvbGxlciJ9.OqFc4CE1Kh6T3BTCR4XxDZR8gaF1MvH4M3ZHZeCGfO-sw-D0gp826vGPHr_0M66SkGaOmlsVHmP7zmTi-SJ3NCdVO5viHaVUwPJ62hx88_JPmSfD0KJJh6G5QokKfiO0WlGN7L1GgiZj18zgXVYaJShlBSz5qGRuGf0s1jy9KOBt9slAN5xQ9_b88amym2GIXoFyBsqymt5H-iMQaGP35tbRpewKKtly9LzIdrO23bDiZ1voc5QZeAZIWrizzjPY5HPM1qOqacaY9DcGc7akh98eBJG_4vZqH2gKy76fMf0yInFTeNKr45_6fWt8gRM77DQmPwb3hbrjWXe1VvXX_g

Kubeconfig

仪表板需要 kubeconfig 文件中的用户拥有username &amp; passwordtoken,但admin.conf 只有client-certificate。您可以编辑配置文件以添加使用上述方法提取的令牌。

$ kubectl config set-credentials cluster-admin --token=bearer_token

替代品(不推荐用于生产)

这里有两种绕过身份验证的方法,但请谨慎使用。

使用 HTTP 部署仪表板

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml

仪表板可以在http://localhost:8001/ui 和kubectl proxy 加载。

向 Dashboard 的服务帐户授予管理员权限

$ cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
EOF

之后,您可以使用登录页面上的 Skip 选项来访问 Dashboard。

如果您使用的是仪表板版本 v1.10.1 或更高版本,您还必须将 --enable-skip-login 添加到部署的命令行参数中。您可以通过将其添加到kubectl edit deployment/kubernetes-dashboard --namespace=kube-system 中的args 来实现。

例子:

      containers:
      - args:
        - --auto-generate-certificates
        - --enable-skip-login            # <-- add this line
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1

【讨论】:

你能给我们举个例子如何创建一个用户然后用令牌登录吗?我仍然不知道如何像用户一样使用令牌。 参见 Kubernetes 身份验证中的 Static Token File 我将它用于我的家庭服务器 这允许我跳过,但没有授权我查看任何内容。 is forbidden: User "system:serviceaccount:kubernetes-dashboard:kubernetes-dashboard" URL raw.githubusercontent.com/kubernetes/dashboard/master/src/… 返回 404 代码。有新的吗?【参考方案2】:

TL;DR

要在单个 oneliner 中获取令牌:

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/print $1') | awk '$1=="token:"print $2'

这假设您的 ~/.kube/config 存在且有效。此外,kubectl config get-contexts 表明您正在为正在登录的仪表板使用正确的上下文(集群和命名空间)。

说明

我从@silverfox 的回答中学到了这个答案。这是一篇内容丰富的文章。不幸的是,它没有告诉您如何将信息实际付诸实践。也许我做 DevOps 的时间太长了,但我认为是在 shell 中。用英语学习或教学对我来说要困难得多。

为了便于阅读,这里是带有换行和缩进的单行:

kubectl -n kube-system describe secret $(
  kubectl -n kube-system get secret | \
  awk '/^deployment-controller-token-/print $1'
) | \
awk '$1=="token:"print $2'

有 4 个不同的命令,它们按以下顺序调用:

第 2 行 - 这是来自 @silverfox 的 Token 部分的第一个命令。 第 3 行 - 仅打印以 deployment-controller-token-(即 pod 名称)开头的行的第一个 字段 第 1 行 - 这是来自 @silverfox 的 Token 部分的第二个命令。 第 5 行 - 仅打印第一个 field 为“token:”的行的第二个 field

【讨论】:

有没有等价于awk的powershell? @duct_tape_coder 只需 kubectl -n kube-system 获取秘密并找到名称为 deployment-controller-token-SOMEHASH 的 tokenm,然后只需 kubectl -n kube-system describe secret deployment-controller-token-SOMEHASH .这就是 awk 的作用。 很好的答案。更进一步:kubectl describe secret $(kubectl get secret | awk '/^dashboard-token-/print $1') | awk '$1=="token:"print $2' 或直接推到剪贴板 kubectl describe secret $(kubectl get secret | awk '/^dashboard-token-/print $1') | awk '$1=="token:"print $2' | xclip -selection clipboard -i @duct_tape_coder kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | sls admin-user | ForEach-Object $_ -Split '\s+' | Select -First 1) 来自github.com/kubernetes/dashboard/blob/master/docs/user/… TLDR: The connection to the server localhost:8080 was refused - did you specify the right host or port?【参考方案3】:

下载 https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml

添加

type: NodePort for the Service

然后运行这个命令:

kubectl apply -f kubernetes-dashboard.yaml

用命令找到暴露的端口:

kubectl get services -n kube-system

您应该可以通过http://hostname:exposedport/ 获取仪表板 没有身份验证

【讨论】:

这绝对是个糟糕的建议。即使它在技术上是正确的【参考方案4】:

如果您不想为仪表板服务帐户授予管理员权限,您可以创建集群管理员服务帐户。

$ kubectl create serviceaccount cluster-admin-dashboard-sa
$ kubectl create clusterrolebinding cluster-admin-dashboard-sa \
  --clusterrole=cluster-admin \
  --serviceaccount=default:cluster-admin-dashboard-sa

然后,您可以使用刚刚创建的集群管理员服务帐户的令牌。

$ kubectl get secret | grep cluster-admin-dashboard-sa
cluster-admin-dashboard-sa-token-6xm8l   kubernetes.io/service-account-token   3         18m
$ kubectl describe secret cluster-admin-dashboard-sa-token-6xm8l

我引用了 Giantswarm 指南 - https://docs.giantswarm.io/guides/install-kubernetes-dashboard/

【讨论】:

这个对我来说工作得很好,而接受的答案是登录我但有一些授权错误。 请注意,此命令赋予服务帐户很多权限,在生产环境中可能不建议使用。 可能还想在 kube-system 下添加 serviceaccount,因为这是仪表板所在的位置 为我工作!我正在使用端口 8001 公开服务,并使用 SSH 隧道从我的本地计算机访问。【参考方案5】:

结合两个答案:49992698 和 47761914:

# Create service account
kubectl create serviceaccount -n kube-system cluster-admin-dashboard-sa

# Bind ClusterAdmin role to the service account
kubectl create clusterrolebinding -n kube-system cluster-admin-dashboard-sa \
  --clusterrole=cluster-admin \
  --serviceaccount=kube-system:cluster-admin-dashboard-sa

# Parse the token
TOKEN=$(kubectl describe secret -n kube-system $(kubectl get secret -n kube-system | awk '/^cluster-admin-dashboard-sa-token-/print $1') | awk '$1=="token:"print $2')

【讨论】:

secret 可能位于 kube-system 以外的命名空间中,因此可能需要从上面省略“-n kube-system”。 我在仪表板中收到一堆错误消息,例如namespaces is forbidden: User "system:serviceaccount:test:cluster-admin-dashboard-sa" cannot list resource "namespaces" in API group "" at the cluster scope 用于所有不同的资源 @isapir 命名空间需要全面相同。编辑后的答案现在在所有命令上添加了 kube-system 命名空间,这有效。 @T0xicCode 仍然不起作用。我看不到任何数据并收到如下消息:namespaces is forbidden: User "system:serviceaccount:kube-system:cluster-admin-dashboard-sa" cannot list resource "namespaces" in API group "" at the cluster scope: RBAC: clusterrole.rbac.authorization.k8s.io "cluster-admin" not found @isapir 您删除了服务帐户并重新创建了吗?【参考方案6】:

前面所有的答案对我都很好。但我这边的直截了当的答案来自https://github.com/kubernetes/dashboard/wiki/Creating-sample-user#bearer-token。只需使用kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk 'print $1')。某些键(NameNamespaceLabels、...、token)会有很多值。最重要的是与您的姓名对应的token。复制该令牌并将其粘贴到令牌框中。希望这会有所帮助。

【讨论】:

在尝试了上面的几个答案之后,这个答案奏效了。我复制了一个令牌,粘贴了它,然后我就进去了。 链接已失效。这是一个新的:github.com/kubernetes/dashboard/blob/master/docs/user/…【参考方案7】:

由于安全问题,默认情况下已禁用跳过登录。 https://github.com/kubernetes/dashboard/issues/2672

在您的仪表板 yaml 中添加此参数

- --enable-skip-login

找回来

【讨论】:

【参考方案8】:

一种用于提取 kubernetes 仪表板登录令牌的不言自明的简单单行代码。

kubectl describe secret -n kube-system | grep deployment -A 12

复制token并将其粘贴到kubernetes仪表板的token登录选项下,您就可以使用kubernetes仪表板了

【讨论】:

【参考方案9】:

令牌认证前需要按照这些步骤进行

    创建集群管理员服务帐号

    kubectl create serviceaccount dashboard -n default
    

    将集群绑定规则添加到您的仪表板帐户

    kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard
    

    使用此命令获取秘密令牌

    kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath=".secrets[0].name") -o jsonpath=".data.token" | base64 --decode
    

    在 Kubernetes 仪表板登录页面中选择令牌身份验证

    现在您可以登录了

【讨论】:

【参考方案10】:

你可以获得令牌:

kubectl describe secret -n kube-system | grep deployment -A 12

获取类似于 Token 的值

token:    eyJhbGciOiJSUzI1NiIsI...

使用端口转发到/kubernetes-dashboard:

kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8080:443 --address='0.0.0.0'

使用以下方式访问网站:

https://<IP-of-Master-node>:8080/

在询问时提供令牌。 请注意 URL 上的 https。在 Firefox 上测试网站,因为随着新的更新,Google Chrome 已经变得严格,不允许来自未知 SSL 证书的流量。

另外注意,8080端口应该在Master Node的VM中打开。

【讨论】:

以上是关于如何登录 Kubernetes 仪表板?的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部网络访问Kubernetes仪表板

Kubernetes 仪表板 - 如何锁定 8080 访问

如何远程访问本地 kubernetes minikube 仪表板

kubernetes安装dashboard(控制面板)仪表盘

如何从我在 Google Cloud Platform 上的部署中删除 Kubernetes 仪表板资源?

如何使用我的 IP 地址或本地 DN 在本地网络中访问我的 kubernetes 仪表板