Kubernetes Dashboard 是 k8s集群的⼀个 WEB UI管理⼯具,代码托管在 github 上。
Dashboard(仪表盘)是基于Web的Kubernetes用户界面。
例如:可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。仪表盘还提供有关集群中Kubernetes资源状态以及可能发生的任何错误的信息。
直接使⽤官⽅的配置⽂件安装即可:
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommende d/kubernetes-dashboard.yaml
为了测试⽅便,我们将 Service 改成 NodePort 类型,然后直接部署新版本的 dashboard 即可。
$ kubectl create -f kubernetes-dashboard.yaml
然后我们可以查看 dashboard 的外⽹访问端⼝:
$ kubectl get svc kubernetes-dashboard -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
haproxy ClusterIP 10.254.125.90 <none> 8440/TCP,8442/TCP 2d
kubernetes-dashboard NodePort 10.254.122.185 <none> 443:31694/TCP 10s
然后直接访问集群中的任何⼀个节点 IP 加上上⾯的31694端⼝即可打开 dashboard ⻚⾯了
由于 dashboard 默认是⾃建的 https 证书,该证书是不受浏览器信任的,所以我们需要强制跳转 就可以了。
默认 dashboard 会跳转到登录⻚⾯,我们可以看到 dashboard 提供了 Kubeconfig 和 token 两种登录 ⽅式,我们可以直接跳过或者使⽤本地的 Kubeconfig ⽂件进⾏登录,可以看到会跳转到如下⻚⾯:
这是由于该⽤户没有对 default 命名空间的访问权限。
# cat dashboard-service.yaml
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard
namespace: kube-system
labels:
k8s-app: kubernetes-dashboard
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
type: NodePort
selector:
k8s-app: kubernetes-dashboard
ports:
- port: 80
targetPort: 9090
指定端口类型为 NodePort,这样外界可以通过地址 nodeIP:nodePort 访问 dashboard;
# cat dashboard-controller.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubernetes-dashboard
namespace: kube-system
labels:
k8s-app: kubernetes-dashboard
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
serviceAccountName: dashboard
containers:
- name: kubernetes-dashboard
image: index.tenxcloud.com/jimmy/kubernetes-dashboard-amd64:v1.6.0
resources:
limits:
cpu: 100m
memory: 50Mi
requests:
cpu: 100m
memory: 50Mi
ports:
- containerPort: 9090
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
登录 dashboard 的时候⽀持 Kubeconfig 和token 两种认证⽅式,Kubeconfig 中也依赖token 字段,所 以⽣成token 这⼀步是必不可少的。
我们创建⼀个admin⽤户并授予admin ⻆⾊绑定,使⽤下⾯的yaml⽂件创建admin⽤户并赋予他管理员 权限,然后就可以通过token 登陆dashbaord,这种认证⽅式本质实际上是通过Service Account 的身 份认证加上Bearer token请求 API server 的⽅式实现。
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
上⾯的 admin ⽤户创建完成后我们就可以获取到该⽤户对应的 token 了,如下命令:
$ kubectl get secret -n kube-system|grep admin-token
admin-token-d5jsg kubernetes.io/service-account-token 3 1d
$ kubectl get secret admin-token-d5jsg -o jsonpath={.data.token} -n kube-system |base64 -d
# 会⽣成⼀串很⻓的base64后的字符串
然后在 dashboard 登录⻚⾯上直接使⽤上⾯得到的 token 字符串即可登录,这样就可以拥有管理员权 限操作整个 kubernetes 集群的对象,当然你也可以为你的登录⽤户新建⼀个指定操作权限的⽤户。
有以下三种方式:
$ kubectl proxy --address='192.168.1.121' --port=8086 --accept-hosts='^*$'
Starting to serve on 192.168.1.121:8086
需要指定 --accept-hosts 选项,否则浏览器访问 dashboard 页面时提示 “Unauthorized”;
获取集群服务地址列表
$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.121:6443
KubeDNS is running at https://192.168.1.121:6443/api/v1/proxy/namespaces/kube-system/services/kube-dns
kubernetes-dashboard is running at https://192.168.1.121:6443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard