0%

k8s 中的图形接口 -- Dashboard

关于 Kubernetes 系列其他文章的传送门

  1. 《 部署 Kubernetes 也能如此简单吗? 》

  2. 《 初识 k8s,新时代的宠儿 》

  3. 《 深度学习 Pod 》

  4. 《 学会这 5 种 Pod 控制器,搞定发布、更新、回滚,从此告别人肉运维!! 》

  5. 《 k8s 中的网络入口 – Service 资源管理 》

  6. 《 k8s 中的 7 层调度 – Ingress 》

  7. 《 k8s 中的存储系统 – Volumes 》

  8. 《 k8s 中强大的配置中心 – ConfigMap 》

  9. 《 k8s 中的部署神器 – Statefulset 控制器 》

  10. 《 k8s 中的安全守护神 – 你不知道不代表它不在 》

  11. 《 k8s 中的图形接口 – Dashboard 》     您当前所在位置

  12. 《 k8s 中的网络插件 – flannel 和 Calico 》

  13. 《 k8s 中的调度器 – 亲和性、污点和容忍性 》

  14. 《 k8s 中对资源的监控 – 资源指标、Prometheus、弹性伸缩器 HPA 》

  15. 《 k8s 中的云原生应用管理利器 – Helm 》

  16. 《 理解 k8s 高可用,让你的集群稳如泰山 》



logo

什么是 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
2
~]# cd /etc/kubernetes/pki/
~]# openssl genrsa -out dashboard.key 2048

创建一个证书签署请求格式(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
2
~]# cd /etc/kubernetes/pki
~]# openssl x509 -req -in dashboard.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out dashboard.crt -days 3560

把证书添加为一个 Secret 资源

  • 注意:如果是生产环境这里应该使用互联网认证 CA 所签发的证书,这里是测试环境所以使用刚才创建的自签证书即可。

Secret 资源名称必须与部署 dashboard 时使用的 yaml 部署文件中的 Secret 资源中定义的名字保持一致。

  • 默认为 kubernetes-dashboard-certs
1
2
3
4
~]# cd /etc/kubernetes/pki
~]# kubectl create secret generic kubernetes-dashboard-certs -n kubernetes-dashboard \
--from-file=dashboard.crt \
--from-file=dashboard.key

使用以下命令查看创建的 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
2
-> # kubectl get service -n kubernetes-dashboard | grep kubernetes-dashboard
kubernetes-dashboard NodePort 10.103.103.30 <none> 443:30881/TCP 4m7s

接下来使用任意 Node 节点的 IP 加分配的端口 30881,就可以访问 dashboard 了,如 https://192.168.50.14:30881/

登录 dashboard

登录 dashboard 时需要一个服务账号(ServiceAccount),支持 KubeconfigToken 两种认证方式,下面一一介绍使用方法。

使用 Token 登录

注意:dashboard v2.0.0-beta6 以后的版本可以省略创建服务账号(ServiceAccount)的步骤(除非你想自定义)。因为在安装 dashboard v2.0.0-beta6 时会自动创建对应的 SA 账号 kubernetes-dashboard,直接拿来用即可。

dashboard v2.0.0-beta6 版本获取 token 的方法:

1
2
3
4
5
6
7
 # 查看账号创建时生成的 Secret 资源的名字,为 ui-admin-token-hzkdp
-~]# kubectl get sa kubernetes-dashboard -n kubernetes-dashboard -o yaml | grep '\- name:'
- name: kubernetes-dashboard-token-bs5rn

# 再去查看 Secret 资源 kubernetes-dashboard-token-bs5rn 中的 token 是:
~]# kubectl describe secret kubernetes-dashboard-token-bs5rn -n kubernetes-dashboard | grep 'token:'
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkdXLUZfa1oyQzBIU2xNMW85MUw3eTRHNE1LeDhOVUVkQzRxSl9mUXhGcGcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1iczVybiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIyOGEzZTg3LTE5YzEtNDQ2NS04YzMwLThkM2ZjM2I4YjNhYyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.fmy7KqbOIlUSOt7OMASRitJo9UtpNPUNFByniXJAlKNlvBjI8LeG_0jo2U1T1Q2NAv91Dr-4bbzUzkeh3pu9ge6dKbib0PoZh06mQ8xTMVHNtbyp0zBCnG-XrtMitWX7mLS5AstqnNBifZESMx-rLzWIq3kUPwtXVs_gMIYUP_H466GzXVLzXmkVT2JuYuss-sEL2_L9mBQXS9lEz82Hicg6UL_goW_tbUf6D3FE9NLNM2vqwbVBEZBHQUZCIylLz2q2hlZHt_vKuVQGOHzeefNJoiv4bJhpBwrrcL-jr5rwo0bV63wf4X4M4XIZep05Cf3f7z5Ko8zcQyZEPpbWzw

使用此 token 就可以去登录 dashboard 了,不过这个账号不是管理员权限,只被授予了最小化的权限,只能访问自己名称空间 kubernetes-dashboard 内的资源,有以下两种方法可以提权至管理员:

  1. 使用以下步骤将 kubernetes-dashboard 账户提权:
  2. 创建服务账号(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
~]# vim ./recommended.yaml
...
...
---

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
rules:
# Allow Metrics Scraper to get metrics from the Metrics server
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]

---

...
...

将新配置生效即可:

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
2
3
4
5
6
7
8
9
10
11
12
-~]# kubectl get sa ui-admin -n kube-system -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2019-11-19T23:51:48Z"
name: ui-admin
namespace: kube-system
resourceVersion: "615147"
selfLink: /api/v1/namespaces/kube-system/serviceaccounts/ui-admin
uid: 5b0d61c3-890f-41dc-b50a-8377656925cf
secrets:
- name: ui-admin-token-nnp7d

再去查看 Secret 资源 ui-admin-token-nnp7d 中的 token 是:

1
2
~]# kubectl describe secret ui-admin-token-nnp7d -n kube-system | grep 'token:'
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkdXLUZfa1oyQzBIU2xNMW85MUw3eTRHNE1LeDhOVUVkQzRxSl9mUXhGcGcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ1aS1hZG1pbi10b2tlbi1ubnA3ZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ1aS1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjViMGQ2MWMzLTg5MGYtNDFkYy1iNTBhLTgzNzc2NTY5MjVjZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTp1aS1hZG1pbiJ9.oRMMN7co7TEqU0aTyJ_d24YMhlZBh0S9FE4QSgH-FOw2atrIMXIVJ5_ddbPMHalGMnSn_e00pyBoq_QEKZgjVF_NQKoZhPeQvZwQuSzVMS4vs3QUZ4oH0mnULY8ezjCH53rmxefvbHFO0TbLT52EukFNiMy-nr_nxKedc9-jOZExjWSyKSkfeLhQ_1VNFbJ4iaQ_FISmmnHFX8_LUYmX-wazPqdYDRCkHuDXTqhuPTGWlfJjceqejXfImsl-qeH7rS8WgNHLWAJXJ5yBBsvKNxpylDbxfInohp_XI86yIVF8qYN1Hv1ozz5oPwc8giLfrmxmoL0SI523f0YLaUccsw

使用此 token 就可以去登录 dashboard 了。

使用 Kubeconfig 登录

以刚才手动创建的 ui-admin 账户为例,创建 Kubeconfig

创建 cluster

1
2
~]# 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
Cluster "my_kube" set.

创建 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
2
~]# kubectl config set-context ui-admin@my_kube --cluster=my_kube --user=ui-admin --kubeconfig=/tmp/ui-admin.conf
Context "ui-admin@my_kube" created.

切换到名为 ui-admin@my_kube 的关系上下文

1
2
~]# kubectl config use-context ui-admin@my_kube --kubeconfig=/tmp/ui-admin.conf
Switched to context "ui-admin@my_kube".

接下来就可以使用此 Kubeconfig 登录了。