关于 Kubernetes 系列其他文章的传送门
-
《 k8s 中的图形接口 – Dashboard 》 您当前所在位置

什么是 Dashboard¶
Dashboard 是一个运行在 k8s 之上的 Pod,通过 ServiceAccount 账号将用户的操作代理至 k8s。
准备工作¶
1. 注意事项¶
dashboard 从 v2.0.0-beta6 版本开始,与 dashboard 相关的资源从名称空间 kube-system 改为 kubernetes-dashboard,所以部署前必须先创建好名称空间。
1 | kubectl create ns kubernetes-dashboard |
注意:本文使用 v2.0.0 版本进行演示,如果你安装的 dashboard 是较低版本的 v1.10,请把本文所有步骤中的命令,与名称空间相关的参数从 -n kubernetes-dashboard 改为 -n kube-system。
2. 创建证书¶
为了安全,建议将 dashboard 部署为 HTTPS,并使用互联网认证 CA 所签发的证书。
注意:这个证书是用于客户端通过 SSL 访问 dashboard 时使用,而不是作为 k8s 集群认证使用。
这里因为是为了测试,所以只创建一个名为 dashboard 的自签证书。
创建私钥:
1 | cd /etc/kubernetes/pki/ |
创建一个证书签署请求格式(scr)的文件,CN 要与访问 dashboard 的域名一致,O 为组,组在 k8s 中可以不存在:
1 | openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=kubeusers/CN=ui.monster.com" |
用 k8s 自带的这个 CA /etc/kubernetes/pki/ca.crt 为证书签名;签名完成后,得到 dashboard.crt 文件:
1 | cd /etc/kubernetes/pki |
把证书添加为一个 Secret 资源
- 注意:如果是生产环境这里应该使用互联网认证 CA 所签发的证书,这里是测试环境所以使用刚才创建的自签证书即可。
Secret 资源名称必须与部署 dashboard 时使用的 yaml 部署文件中的 Secret 资源中定义的名字保持一致。
- 默认为
kubernetes-dashboard-certs:
1 | cd /etc/kubernetes/pki |
使用以下命令查看创建的 Secret 资源,有证书信息即可:
1 | kubectl get secret -n kubernetes-dashboard kubernetes-dashboard-certs -o yaml |
部署 dashboard¶
注意:在部署 dashboard 前,请前往 dashboard 的 发布页,查看和 k8s 的兼容矩阵表。比如我使用的 k8s 版本为
1.16,与此兼容的 dashboard 的版本为v2.0.0-beta6,否则可能出现各种奇怪问题。
使用以下命令部署 dashboard v2.0.0-beta6:
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta6/aio/deploy/recommended.yaml |
访问 dashboard¶
有以下几种方式访问 dashboard:
- NodPort:把 service 的类型改为
NodePort; - 以 Ingress 方式访问dashboard;
- 以 API server 方式访问 dashboard;
- 以 kubectl proxy 方式访问 dashboard。
NodePort 方式¶
这里介绍使用 NodePort 的方式访问。
改为使用 NodePort 后,通过任意物理节点的 IP,都可访问 Dashboard:
使用以下命令,将 service 字段更改为 NodePort 类型:
1 | kubectl edit service/kubernetes-dashboard -n kubernetes-dashboard |
再查看 service 的 TYPE 类型已经变为 NodePort。
1 | # kubectl get service -n kubernetes-dashboard | grep kubernetes-dashboard |
接下来使用任意 Node 节点的 IP 加分配的端口 30881,就可以访问 dashboard 了,如 https://192.168.50.14:30881/。
登录 dashboard¶
登录 dashboard 时需要一个服务账号(ServiceAccount),支持 Kubeconfig 和 Token 两种认证方式,下面一一介绍使用方法。
使用 Token 登录¶
注意:dashboard v2.0.0-beta6 以后的版本可以省略创建服务账号(ServiceAccount)的步骤(除非你想自定义)。因为在安装 dashboard v2.0.0-beta6 时会自动创建对应的 SA 账号 kubernetes-dashboard,直接拿来用即可。
dashboard v2.0.0-beta6 版本获取 token 的方法:
1 | 查看账号创建时生成的 Secret 资源的名字,为 ui-admin-token-hzkdp |
使用此 token 就可以去登录 dashboard 了,不过这个账号不是管理员权限,只被授予了最小化的权限,只能访问自己名称空间 kubernetes-dashboard 内的资源,有以下两种方法可以提权至管理员:
- 使用以下步骤将
kubernetes-dashboard账户提权: - 创建服务账号(ServiceAccount)。
1. 提权 kubernetes-dashboard 账户¶
下载部署时的 yaml 配置文件到服务器:
1 | wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta6/aio/deploy/recommended.yaml |
编辑 yaml 的部署文件,将资源类型为 kind: ClusterRole 的配置改成如下这样,即可把集群角色 kubernetes-dashboard 可操作的权限全部打开:
1 | ~]# vim ./recommended.yaml |
将新配置生效即可:
1 | kubectl apply -f ./recommended.yaml |
2. 创建服务账号(ServiceAccount)¶
注意:使用 v1.10 版的 dashboard 需要使用此方法手动创建一个集群管理员服务账号(ServiceAccount)。
注意:使用 v2.0.0-beta6 以上的版本时,由于默认的账户没有管理员权限,也可以参考此步骤创建一个管理员的 SA 账号,不过注意与命名空间相关的参数需要改为 -n kubernetes-dashboard。
创建服务账号名为 ui-admin:
1 | kubectl create serviceaccount ui-admin -n kube-system |
因为要作为管理员使用,所以把 cluster-admin 这个集群级别的角色授权给 ui-admin 账号:
1 | kubectl create clusterrolebinding cluster-ui-admin --clusterrole=cluster-admin --serviceaccount=kube-system:ui-admin |
ui-admin 账号中会自动创建的 Secret 资源,看到名字为 ui-admin-token-hzkdp:
1 | kubectl get sa ui-admin -n kube-system -o yaml |
再去查看 Secret 资源 ui-admin-token-nnp7d 中的 token 是:
1 | kubectl describe secret ui-admin-token-nnp7d -n kube-system | grep 'token:' |
使用此 token 就可以去登录 dashboard 了。
使用 Kubeconfig 登录¶
以刚才手动创建的 ui-admin 账户为例,创建 Kubeconfig
创建 cluster
1 | kubectl config set-cluster my_kube --server="https://192.168.50.14:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --kubeconfig=/tmp/ui-admin.conf |
创建 User,并指定需要绑定的 token
1 | kubectl config set-credentials ui-admin --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IkdXLUZfa1oyQzBIU2xNMW85MUw3eTRHNE1LeDhOVUVkQzRxSl9mUXhGcGcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ1aS1hZG1pbi10b2tlbi1ubnA3ZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ1aS1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjViMGQ2MWMzLTg5MGYtNDFkYy1iNTBhLTgzNzc2NTY5MjVjZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTp1aS1hZG1pbiJ9.oRMMN7co7TEqU0aTyJ_d24YMhlZBh0S9FE4QSgH-FOw2atrIMXIVJ5_ddbPMHalGMnSn_e00pyBoq_QEKZgjVF_NQKoZhPeQvZwQuSzVMS4vs3QUZ4oH0mnULY8ezjCH53rmxefvbHFO0TbLT52EukFNiMy-nr_nxKedc9-jOZExjWSyKSkfeLhQ_1VNFbJ4iaQ_FISmmnHFX8_LUYmX-wazPqdYDRCkHuDXTqhuPTGWlfJjceqejXfImsl-qeH7rS8WgNHLWAJXJ5yBBsvKNxpylDbxfInohp_XI86yIVF8qYN1Hv1ozz5oPwc8giLfrmxmoL0SI523f0YLaUccsw --kubeconfig=/tmp/ui-admin.conf |
定义 user 和 cluster 的上下文关系(context)
1 | kubectl config set-context ui-admin@my_kube --cluster=my_kube --user=ui-admin --kubeconfig=/tmp/ui-admin.conf |
切换到名为 ui-admin@my_kube 的关系上下文
1 | kubectl config use-context ui-admin@my_kube --kubeconfig=/tmp/ui-admin.conf |
接下来就可以使用此 Kubeconfig 登录了。