一、概述

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

注意,这个地方的namespacekubernetes-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方式访问:

  1. 查看kubernetes-dashboardkubectl --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
  1. 编辑kubernetes-dashboardkubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard,将里面的type: ClusterIP改为type: NodePort即可。

  2. 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-dashboardkubectl --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。

经试验,这个说法是无效的。

五、结论

  1. 看博客要小心,最好拿博客和官网做对照
  2. 博客的文章中的版本一般比较老了。
  3. Github的官方说明也会误导人啊。
Logo

开源、云原生的融合云平台

更多推荐