K8S Dashboard 是一个带有图形界面的集群管理服务, 带有基本的监控和运维管理功能, 虽然对于熟悉 K8S 的人来说这个服务显得比较鸡肋,因为更习惯使用命令行来操作集群并且命令行更灵活更强大。 但是对于初学者来说,使用 K8S Dashboard 倒也是个不错的选择。 要安装 Dashboard 首先需要 下载 它的配置文件。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/
deploy/recommended.yaml
这个配置文件里包含了启动 Dashboard 所需要的所有资源对象的配置。只需要使用 kubectl creaet -f 命令就可以进行创建。 但是在这里不能直接创建,因为官方的配置文件中并没 有将容器网络暴露出来。也就是无法与 Dashboard 容器进行网络通信。 所以需要修改这段配置文件中 关于 Service 的配置
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
上面这段是 dashboard 中对于 Service 的配置, 需要修改成下面的样子:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30022
selector:
k8s-app: kubernetes-dashboard
通过上面的配置细节可以看出来针对原始配置修改了 2 处地方:
- 在 spec 字段下面添加了 type 字段,值为 NodePort。意思是要暴露 NodePort 类型的网络。 这种 网络可以理解为跟 Docker 一样是通过端口映射来完成的。所以下面还会指定 nodePort:30022 来 指定宿主机的对应端口。只不过这里不一样的是,当用户在 Service 中指定了对应的端口后,它不 仅仅针对当前 POD 所在节点生效,而是针对所有节点都会生成对应的端口映射规则。 也就是说用 户可以使用任意节点的 ip 地址+端口号都可以对其进行网络访问。 因为 K8S 在集群的每一个节点 中 都会启动一个名为 kube-proxy 的服务,当创建了一个 Service 后, 集群中每个节点的 kubeproxy 都会通过 iptables 创建对应的端口映射规则。
- 在 ports 字段下添加了一个新的字段叫 nodePort,用来指定具体映射到哪个端口上, 如果用户没 有指定这个字段,那么 K8S 会随机为这个 Service 选取一个端口号通过这样的修改后再通过 kubectl create -f 命令来创建后就可以在浏览器上访问 Dashboard 了。 但是这里需要解释一 下 Service 的工作原理。 在上一个章节中讲到在 K8S 中任何资源都是可以被打上 Label 的,这些 Label 是 K8S 用来管理调度的重要机制。 也是资源寻址的重要方式,可以通过 kubectl get pods -l {label} 的方式找到对应的一批 POD。 所以对于 Service 来说也是一样的, Service 本身的功能是接管容器网络,不论在集群外部还是内部与容器的网络通信都是先发送给 Service 再 由 Service 转发给对应的 POD。 而 Service 的寻址 POD 的方式就是通过 Label 寻址的,而 label 是一个 K,V 格式的字段。如下:
selector:
k8s-app: kubernetes-dashboard
这段配置声明 Service 会接管所有带有 k8s-app=kubernetes-dashboard 这个 Label 的 POD, 所以看 dashboard 的 POD 定义中,在 meatadata 字段内会有对应的定义:
metadata:
labels:
k8s-app: kubernetes-dashboard
所以在修改 dashboard 文件的时候,注意不要碰 service 的 selector 字段,一但与 POD 的 label 不匹 配,就会出现错误。 当创建好 dashboard 后,就可以通过浏览器访问了。 但是第一次访问会提示选择 身份验证的方式, 分为 token 和 kubeconfig 文件两种。
之前已经介绍了 kubeconfig 文件的作用, 本次说明一下使用 token 的方式进行认证。首先需要获取 dashboard 的 secrets。
kubectl get secrets -n kubernetes-dashboard
NAME TYPE DATA
AGE
default-token-96jkm kubernetes.io/service-account-token 3
117m
kubernetes-dashboard-certs Opaque 0
117m
kubernetes-dashboard-csrf Opaque 1
117m
kubernetes-dashboard-key-holder Opaque 2
117m
kubernetes-dashboard-token-hnjnh kubernetes.io/service-account-token 3
117m
然后获取secrets中的token信息。
kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard-tokenhnjnh | grep token | awk 'NR==3{print $2}'
eyJhbGciOiJSUzI1NiIsImtpZCI6ImJseFl2QkN0dzBxZ0pfVUtBYmM3U0k2cUFQeTUzaGFqZjkwWUZYUWU1TDQifQ.eyJpc3MiOi
yrvuZb7I4DeIcaNDly_JxUJHFvpDDEFBHvwTOnCQNhL8NCpjXMlWAafTEd3tHi2pjrClyOSYC0DLNttLiK9-
J_gEqsrWEO_GfSCk2BXoGGRZ0_1jok8P6mg4H4drszu_uwfJm4qR8eaiTCbSNaProzXQ97RwJYqq8a0rfmOWjueG_VHhKEfrQ8GMUvMvpH_2lt7BWh5pjFZDBD24Mj7TbYIacLKhRmut8tPku6W
gb4XPevvLvjXhmWRiAK2rivx_ptcRg8pJN4wD9SgJrk9xGD3LF6-htGuSfgGZb4nSiTN5sUGk8w
把上面打印出来的 token 复制到页面上就可以正常操作 dashboard 了。 在 dashboard 中可以通过图形 界面完成大部分以前通过命令行才能完成的事情