一、概述
Kubernetes 简称为K8S,是用于自动部署,扩展和管理容器化应用程序的开源系统。Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
现在的云平台,基本上都是基于k8s实现的。
Kubernetes需要用到docker,应该说是Kubernetes本身就是对docker容器的管理。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
如果你厌烦了vmware和vbox,就可以使用docker来做容器,特别方便。
Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
二、准备工作
为避免浪费时间,先说明下我的安装版本;
Dashboard: V2.0.0 beta4
K8s:1.16.2
在三台机器上分别安装master,node1和node2:
10.247.62.213 k8s.master
10.247.62.221 k8s.node1
10.247.62.181 k8s.node2
三、成功安装Dashboard方法(科学上网)
参考官网:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ 的安装方法。
如果已经有失败的安装过程,先删除掉失败dashboard的安装:
kubectl delete -f kubernetes-dashboard.yaml
3.1 下载yaml文件并安装
官网的安装方法是这样的:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
安装后:
成功之后,kubectl get pods --namespace=kubernetes-dashboard -o wide
查看pod名称:
[root@k8s ~]# kubectl get pods --namespace=kubernetes-dashboard -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubernetes-dashboard dashboard-metrics-scraper-566cddb686-6p8tb 0/1 ContainerCreating 0 4s <none> k8s.node1 <none> <none>
kubernetes-dashboard kubernetes-dashboard-7b5bf5d559-gn4ls 0/1 ContainerCreating 0 4s <none> k8s.node1 <none> <none>
有问题,dashboard-metrics-scraper-566cddb686-6p8tb
这个pod长时间ContainerCreating
状态,估计镜像又下载不了了。
看下日志:kubectl describe pod dashboard-metrics-scraper-566cddb686-6p8tb --namespace=kubernetes-dashboard
注意,这个地方的namespace
是kubernetes-dashboard
。
日志告诉我们,需要kubernetesui/metrics-scraper:v1.0.1
这个镜像,能直接下载下来,就是有点慢,那就等会儿了。
等啊等,竟然下载失败了,换成docker pull kubernetesui/metrics-scraper:v1.0.1
。等10分钟,终于下载下来了。
最后成功;
[root@k8s ~]# kubectl get pods --namespace=kubernetes-dashboard -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dashboard-metrics-scraper-566cddb686-6p8tb 1/1 Running 1 13d 10.244.1.8 k8s.node1 <none> <none>
kubernetes-dashboard-7b5bf5d559-xt6hl 1/1 Running 1 13d 10.244.1.9 k8s.node1 <none> <none>
3.2 改为NodePort访问
将dashboard改为NodePort方式访问,不使用API Server 访问。因为API Server 访问特别麻烦,一大串,比如:http://10.247.62.213:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
如果是NodePort方式访问,就比较简单了,比如:https://10.247.62.213:30832/
NodePort方式访问:
- 查看
kubernetes-dashboard
:kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
[root@k8s ~]# kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard ClusterIP 10.97.154.42 <none> 443/TCP 28m
-
编辑
kubernetes-dashboard
:kubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard
,将里面的type: ClusterIP
改为type: NodePort
即可。 -
wq
保存即可。等一会儿,重新查看,就变为NodePort了。
[root@k8s ~]# kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.97.154.42 <none> 443:30832/TCP 29m
3.3 生成证书
Dashboard安装完成,改为NodePort形式之后,通过https://10.247.62.213:30832/
访问,会提示安全信息如下:
这就无法访问了,需要生成证书,这个比较简单,照着来就行:
#新建目录:
mkdir key && cd key
#生成证书
openssl genrsa -out dashboard.key 2048
#我这里写的自己的node1节点,因为我是通过nodeport访问的;如果通过apiserver访问,可以写成自己的master节点ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=10.247.62.213'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
#删除原有的证书secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
#创建新的证书secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
#查看pod
kubectl get pod -n kubernetes-dashboard
#重启pod
kubectl delete pod kubernetes-dashboard-7b5bf5d559-gn4ls -n kubernetes-dashboard
执行完成之后,再次访问是这样的:
上图点开高级之后,有个继续前往的链接,点击即可。
3.4 新建用户获取令牌
Dashboard链接打开之后,是这样的:
要获取令牌,还要新建用户,下面这个是从官方网站复制过来的:
3.4.1 新建用户
新建文件(文件名随意)admin-user.yaml
:
复制下面一段:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
复制到admin-user.yaml
文件后,执行: kubectl create -f admin-user.yaml
3.4.2 绑定用户关系
新建文件(文件名随意)admin-user-role-binding.yaml
:
复制下面一段:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
复制到admin-user-role-binding.yaml
文件后,执行:kubectl create -f admin-user-role-binding.yaml
如果过程中提示存在或者需要删除,只需要kubectl delete -f 相应的yaml文件
即可。
3.4.3 获取令牌
按照官网提示的获取token方法:kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
3.5 输入令牌打开页面
输入令牌后,点登入,就打开了首页,如图所示:
四、Dashboard安装踩坑历程(可忽略)
Dashboard的官方git地址:https://github.com/kubernetes/dashboard
这个git地址首页竟然是v1.10.1版本的Dashboard!!!
4.1 安装
首先,安装上面写的,在master上运行: kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
同样的,如果下载不下来,直接到github上一级一级找,这里不再赘述。
4.2 镜像下载
kubectl get pods --all-namespaces -o wide
查看pods,发现失败。
使用命令:kubectl describe pod kubernetes-dashboard-7c54d59f66-rnzq2 --namespace=kube-system
提示:
" network for pod "kubernetes-dashboard-7c54d59f66-rnzq2": networkPlugin cni failed to set up pod "kubernetes-dashboard-7c54d59f66-rnzq2_kube-system" network: open /run/flannel/subnet.env: no such file or directory
Warning Failed 4m9s (x4 over 6m16s) kubelet, k8s.node1 Error: ErrImagePull
发现它被分配到k8s.node1上了,怀疑是否是镜像拉不下来。
docker pull gcrxio/kubernetes-dashboard-amd64:v1.10.1
docker tag gcrxio/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
docker rmi gcrxio/kubernetes-dashboard-amd64:v1.10.1
成功!Running:
kube-system kubernetes-dashboard-7c54d59f66-rnzq2 1/1 Running 0 28m 10.244.1.2 k8s.node1 <none> <none>
查看这个service:
[root@k8s ~]# kubectl --namespace=kube-system get service kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard ClusterIP 10.107.97.201 <none> 443/TCP 46m
4.3 API Server 访问
按照官网提示:
master上设置允许外网访问: kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'
使用API Server 访问(API Server访问不需要证书): http://10.247.62.213:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
需要用户,新建用户:
4.4 新建用户
新建文件admin-user.yaml
,复制下面一段:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
执行: kubectl create -f admin-user.yaml
绑定用户关系: 新建文件admin-user-role-binding.yaml
,复制下面一段:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
执行kubectl create -f admin-user-role-binding.yaml
如果过程中需要删除,只需要kubectl delete -f 相应的yaml文件即可。
注意,这里的namespace是kube-system,没办法,v1.10.1版本的namespace就是kube-system,大多数博客都是这么写的。我跟着玩了。
4.5 获取token
官网获取token方法: kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
这个命令整出了一堆token,试试下面的
kubectl -n kube-system describe secret admin-user-token-d2nqt
这里的admin-user-token-d2nqt是生成的admin-user对应的token,把token复制到令牌那个框里,竟然没反应,按f12打开控制台,没报错啊。
看下日志:kubectl logs kubernetes-dashboard-7c54d59f66-wvxnc -n kube-system
没什么有用的,无解,换个思路来。
4.6 换成NodePort试试
将dashboard改为NodePort方式访问,不使用API Server 访问。
NodePort方式访问: 查看kubernetes-dashboard:kubectl --namespace=kube-system get service kubernetes-dashboard
[root@k8s ~]# kubectl --namespace=kube-system get service kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard ClusterIP 10.107.97.201 <none> 443/TCP 125m
编辑kubernetes-dashboard
:kubectl --namespace=kube-system edit service kubernetes-dashboard
将type: ClusterIP
改为type: NodePort
。
wq保存即可。等一会儿,重新查看,就变为NodePort了。
使用master的ip加端口32123访问,https://10.247.62.213:32123/ 会提示不安全,没法继续。
4.7 生成证书
使用master的ip加端口32123访问,https://10.247.62.213:32123/ 会提示不安全,没法继续。
#新建目录
mkdir key && cd key
#生成证书
openssl genrsa -out dashboard.key 2048
#我这里写的自己的node1节点,因为我是通过nodeport访问的;如果通过apiserver访问,可以写成自己的master节点ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.135.129'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
#删除原有的证书secret
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#创建新的证书secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
#查看pod
kubectl get pod -n kube-system
#重启pod
kubectl delete pod kubernetes-dashboard-78dc5f9d6b-zgvr6 -n kube-system
重新查看token:kubectl -n kube-system describe secret admin-user-token-d2nqt
访问https://10.247.62.213:32123/ 输入token后,有反应了。
这些错误变了,the server could not find the requested resource.
这又是什么鬼?
查啊查,找到一个说法:
当前系统中没有用于获取监控信息指标的客户端(metric client),所以kubernetes-dashboard的处理方式是跳过这一步。同时,对metric client的健康检查失败了。这些问题不会导致dashboard无法工作,只是kubernetes-dashboard获取不到系统以及各个pod的监控数据。这里的解决方案就是安装另外一个k8s插件--heapster.
所以要安装Heapster。
经试验,这个说法是无效的。
五、结论
- 看博客要小心,最好拿博客和官网做对照。
- 博客的文章中的版本一般比较老了。
- Github的官方说明也会误导人啊。