如何登录kubernetes(k8s) dashboard仪表盘?

啊啊 发表于: 2021-06-09   最后更新时间: 2021-09-10 14:19:00   2,549 游览

我刚刚把kubeadm和kubelet升级到v1.8.0。并按照官方文件的要求安装了dashboard仪表板。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

之后,我通过运行以下程序启动了dashboard:

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

然后,我能够通过以下途径进入dashboard:

http://192.168.0.101:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

我被重定向到这样一个我以前从未见过的登录页面,然后有两种认证方式。

我尝试上传/etc/kubernetes/admin.conf作为kubeconfig,但失败了。然后我试图使用我从kubeadm token列表中得到的令牌来登录,但再次失败。

我如何能在dashboard上签名?,看起来比以前增加了很多安全机制,谢谢。

发表于 2021-06-09
Token

这里的Token可以是静态TokenService Account Token、Kubernetes认证的OpenID Connect Token,但不是kubeadm Bootstrap Token

通过kubectl,我们可以看到一个默认在kubernetes中创建的服务账户(例如,deployment controller)。

$ 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

dashboard需要kubeconfig文件中的用户有用户名密码token,但admin.conf中只有client-certificate客户端证书。你可以编辑配置文件,通过使用上述方法提取的token。

替代方案(不建议用于生产)

这里有两种绕过认证的方法,但要谨慎使用。

方法一:用HTTP部署dashboard

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

然后在kubectl proxyhttp://localhost:8001/ui

方法二:为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

之后,你可以使用登录页面上的跳过选项来访问Dashboard了。

如果你使用的是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
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 表明你正在使用正确的上下文(集群和命名空间)来登录Dashboard。

你的答案

查看kubernetes相关的其他问题或提一个您自己的问题