如何登录kubernetes仪表板?

时间:2017-10-10 10:09:51

标签: kubernetes dashboard

我刚刚将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/

访问信息中心

我被重定向到这样的登录页面,这是我以前从未见过的。 enter image description here看起来有两种身份验证方式。

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

问题是我如何登录仪表板。看起来他们添加了许多安全机制。谢谢。

10 个答案:

答案 0 :(得分:98)

  

自版本1.7 Dashboard使用更安全的设置。这意味着,通过   默认情况下,它具有最小的权限集,只能访问   HTTPS。建议阅读Access Control   在执行任何进一步的步骤之前进行指导。

     

自1.7版开始,Dashboard支持基于以下内容的用户身份验证:

           

--- 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 & 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

可以使用kubectl proxyhttp://localhost:8001/ui加载信息中心。

向仪表板的服务帐户授予管理员权限

$ 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选项访问仪表板。

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

示例:

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

答案 1 :(得分:51)

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中。我用英语学习或教学要困难得多。

以下是带有换行符和缩进的oneliner以便于阅读:

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的令牌部分的第一个命令。
  • 第3行 - 仅打印以deployment-controller-token-开头的行的第一个字段(即广告连播名称)
  • 第1行 - 这是来自@ silverfox的令牌部分的第二个命令。
  • 第5行 - 仅打印第一个字段为“token:”的行的第二个字段

答案 2 :(得分:34)

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

$ 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/

答案 3 :(得分:16)

结合两个答案:4999269847761914

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

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

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

答案 4 :(得分:5)

以前的所有答案对我都很好。但是我这方面的直接答案来自https://github.com/kubernetes/dashboard/wiki/Creating-sample-user#bearer-token。只需使用Example 2 : p = list( 'a' = list( 'z' = c( 1, 2 ), 'g' = list( 'i' = 2, 'j' = 3 ) ), 'd' = list( 'k' = c( 4, 5 ) ) ) Example 3 : p = list( 'a' = list( 'z' = c( 1, 2 ), 'g' = list( 2, 3 ) ), 'd' = list( 'k' = c( 4, 5 ) ) ) 。某些键(kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')NameNamespace,...,Labels)将具有许多值。最重要的是与您的姓名相对应的token。复制该令牌并将其粘贴到令牌框中。希望这会有所帮助。

答案 5 :(得分:3)

一种易于解释的简单代码,可为kubernetes仪表板登录提取令牌。

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

复制令牌并将其粘贴到kubernetes仪表板的令牌登录选项下,您可以很好地使用kubernetes仪表板

答案 6 :(得分:1)

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

在仪表板yaml中添加此arg

- --enable-skip-login

找回

答案 7 :(得分:0)

下载 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/获取信息中心 没有身份验证

答案 8 :(得分:0)

在令牌认证之前,您需要执行以下步骤

  1. 创建集群管理服务帐户

    kubectl创建服务帐户信息中心-n默认

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

    kubectl创建clusterrolebinding仪表板-admin -n默认\ --clusterrole =集群-admin \ --serviceaccount = default:仪表板

  3. 使用此命令获取秘密令牌

    kubectl获取密码$(kubectl获取服务帐户信息中心-o jsonpath =“ {。secrets [0] .name}”)-o jsonpath =“ {。data.token}” | base64 --decode

  4. 在Kubernetes仪表板登录页面中选择令牌身份验证 enter image description here

  5. 现在您可以登录

答案 9 :(得分:0)

您可以获得令牌:

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中打开。