如何登录kubernetes仪表板?
How to sign in kubernetes dashboard?
我刚刚将 kubeadm 和 kubelet 升级到 v1.8.0。并按照官方document.
安装dashboard
$ 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
获得的令牌登录但再次失败。
问题是如何登录仪表板。看起来他们比以前增加了很多安全机制。谢谢。
As of release 1.7 Dashboard supports user authentication based on:
Authorization: Bearer <token>
header passed in every request to Dashboard. Supported from release 1.6. Has the highest priority. If present, login view will not be shown.
- Bearer Token that can be used on Dashboard login view.
- Username/password that can be used on Dashboard login view.
- Kubeconfig file that can be used on Dashboard login view.
令牌
这里的 Token
可以是 Static Token
, Service Account Token
, OpenID Connect Token
from Kubernetes Authenticating, 但不是 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
仪表板需要 kubeconfig 文件中的用户具有 username & password
或 token
,但 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 proxy
在 http://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
之后您可以使用登录页面上的跳过选项来访问仪表板。
如果您使用的是仪表板版本 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
TL;DR
单程获取代币:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print }') | awk '=="token:"{print }'
这假定您的 ~/.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 }'
) | \
awk '=="token:"{print }'
有 4 个不同的命令,它们按以下顺序调用:
- 第 2 行 - 这是来自@silverfox 的 Token 部分的第一个命令。
- 第 3 行 - 仅打印以
deployment-controller-token-
(即 pod 名称) 开头的行的第一个 字段
- 第 1 行 - 这是来自@silverfox 的 Token 部分的第二个命令。
- 第 5 行 - 仅打印第一个 field 为 "token:"
的行的第二个 field
添加
type: NodePort for the Service
然后 运行 这个命令:
kubectl apply -f kubernetes-dashboard.yaml
使用命令找到暴露的端口:
kubectl get services -n kube-system
您应该可以在 http://hostname:exposedport/ 获取仪表板
没有身份验证
如果您不想授予仪表板服务帐户管理员权限,您可以创建集群管理员服务帐户。
$ 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/
合并两个答案: and :
# 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 }') | awk '=="token:"{print }')
前面的回答都对我很好。但是 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 }')
。某些键(Name
、Namespace
、Labels
、...、token
)会有很多值。最重要的是对应你名字的token
。复制该令牌并将其粘贴到令牌框中。希望这会有所帮助。
由于安全问题,默认情况下禁用跳过登录。 https://github.com/kubernetes/dashboard/issues/2672
在您的仪表板 yaml 中添加此参数
- --enable-skip-login
取回它
一种不言自明的简单单行代码,用于提取用于 kubernetes 仪表板登录的令牌。
kubectl describe secret -n kube-system | grep deployment -A 12
复制令牌并将其粘贴到令牌登录选项下的 kubernetes 仪表板上,您就可以使用 kubernetes 仪表板了
令牌认证前需要完成以下步骤
创建集群管理服务帐户
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 dashboard登录页面选择token认证
现在可以登录了
您可以获得代币:
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的虚拟机中打开。
另一种获取 kubernetes-dashboard 令牌的方法:
kubectl -n kubernetes-dashboard get secret -o=jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="kubernetes-dashboard")].data.token}' | base64 --decode
解释:
- 获取
kubernetes-dashboard
名space中的所有secret
。
- 查看
items
数组,并匹配:metadata
-> annotations
-> kubernetes.io/service-account.name
== kubernetes-dashboard
- 打印
data
-> token
- 解码内容。 (如果您执行
kubectl describe secret
,则 token
已被解码。)
我刚刚将 kubeadm 和 kubelet 升级到 v1.8.0。并按照官方document.
安装dashboard$ 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
获得的令牌登录但再次失败。
问题是如何登录仪表板。看起来他们比以前增加了很多安全机制。谢谢。
As of release 1.7 Dashboard supports user authentication based on:
Authorization: Bearer <token>
header passed in every request to Dashboard. Supported from release 1.6. Has the highest priority. If present, login view will not be shown.- Bearer Token that can be used on Dashboard login view.
- Username/password that can be used on Dashboard login view.
- Kubeconfig file that can be used on Dashboard login view.
令牌
这里的 Token
可以是 Static Token
, Service Account Token
, OpenID Connect Token
from Kubernetes Authenticating, 但不是 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
仪表板需要 kubeconfig 文件中的用户具有 username & password
或 token
,但 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 proxy
在 http://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
之后您可以使用登录页面上的跳过选项来访问仪表板。
如果您使用的是仪表板版本 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
TL;DR
单程获取代币:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print }') | awk '=="token:"{print }'
这假定您的 ~/.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 }'
) | \
awk '=="token:"{print }'
有 4 个不同的命令,它们按以下顺序调用:
- 第 2 行 - 这是来自@silverfox 的 Token 部分的第一个命令。
- 第 3 行 - 仅打印以
deployment-controller-token-
(即 pod 名称) 开头的行的第一个 字段
- 第 1 行 - 这是来自@silverfox 的 Token 部分的第二个命令。
- 第 5 行 - 仅打印第一个 field 为 "token:" 的行的第二个 field
添加
type: NodePort for the Service
然后 运行 这个命令:
kubectl apply -f kubernetes-dashboard.yaml
使用命令找到暴露的端口:
kubectl get services -n kube-system
您应该可以在 http://hostname:exposedport/ 获取仪表板 没有身份验证
如果您不想授予仪表板服务帐户管理员权限,您可以创建集群管理员服务帐户。
$ 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/
合并两个答案:
# 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 }') | awk '=="token:"{print }')
前面的回答都对我很好。但是 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 }')
。某些键(Name
、Namespace
、Labels
、...、token
)会有很多值。最重要的是对应你名字的token
。复制该令牌并将其粘贴到令牌框中。希望这会有所帮助。
由于安全问题,默认情况下禁用跳过登录。 https://github.com/kubernetes/dashboard/issues/2672
在您的仪表板 yaml 中添加此参数
- --enable-skip-login
取回它
一种不言自明的简单单行代码,用于提取用于 kubernetes 仪表板登录的令牌。
kubectl describe secret -n kube-system | grep deployment -A 12
复制令牌并将其粘贴到令牌登录选项下的 kubernetes 仪表板上,您就可以使用 kubernetes 仪表板了
令牌认证前需要完成以下步骤
创建集群管理服务帐户
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 dashboard登录页面选择token认证
现在可以登录了
您可以获得代币:
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的虚拟机中打开。
另一种获取 kubernetes-dashboard 令牌的方法:
kubectl -n kubernetes-dashboard get secret -o=jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="kubernetes-dashboard")].data.token}' | base64 --decode
解释:
- 获取
kubernetes-dashboard
名space中的所有secret
。 - 查看
items
数组,并匹配:metadata
->annotations
->kubernetes.io/service-account.name
==kubernetes-dashboard
- 打印
data
->token
- 解码内容。 (如果您执行
kubectl describe secret
,则token
已被解码。)