终于不用敲命令了——Kubernetes之Dashboard部署

前言

​ 前面的几篇文章带着大家体验和部署了一下基于二进制方式部署Kubernetes高可用集群的流程,本文将通过部署Kubernetes的web界面来给大家体验一下使用ui界面管理、监控、使用k8s集群的魅力。

先把节点ip地址介绍一下,以免待会测试验证的时候无法叙说清楚

master01:192.168.0.128

master02:192.168.0.131

node01:192.168.0.129

node02:192.168.0.130

两台作为负载均衡的LB服务器就暂时不写了,因为本文可以不考虑这个层面。

Kubernetes的Dashboard部署流程

我们在master01节点上部署该web ui界面。

首先在k8s工作目录中创建一个Dashboard的工作目录

[root@master01 k8s]# mkdir dashboard
[root@master01 k8s]# cd dashboard/
#下载构建该界面的核心文件,资源地址:(https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard)
#一共是下载了5个yaml文件,待会会一边使用一边介绍各个文件的作用和核心参数配置
#下面会有6个,其中一个(k8s-admin.yaml是自己写的,是用来做待会在浏览器中登录时的令牌的)
[root@master01 dashboard]# ls
dashboard-configmap.yaml   dashboard-rbac.yaml    dashboard-service.yaml
dashboard-controller.yaml  dashboard-secret.yaml  k8s-admin.yaml

先大体上按照待会执行的顺序来讲一下每个文件的作用吧

1、dashboard-rbac.yaml :用于访问控制设置,配置各种角色的访问控制权限及角色绑定(绑定角色和服务账户),内容中包含对应各种角色所配置的规则(rules)

2、dashboard-secret.yaml:提供令牌,访问API服务器所用(个人理解为一种安全认证机制)

3、dashboard-configmap.yaml :配置文件,负责设置Dashboard的文件

4、dashboard-controller.yaml:负责控制器及服务账户的创建

5、dashboard-service.yaml:负责将容器中的服务提供出去

通过kubectl create 命令创建resources,对照中文件来理解笔者下面的解释

1、规定kubernetes-dashboard-minimal该角色的权限:例如其中具备获取更新删除等不同的权限
[root@master01 dashboard]# kubectl create -f dashboard-rbac.yaml 
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
有几个kind就会有几个结果被创建,格式为kind+apiServer/name
2、证书和密钥创建
[root@master01 dashboard]# kubectl create -f dashboard-secret.yaml 
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-key-holder created
3、配置文件,对于集群dashboard设置的创建
[root@master01 dashboard]# kubectl create -f dashboard-configmap.yaml 
configmap/kubernetes-dashboard-settings created
4、创建容器需要的控制器以及服务账户
[root@master01 dashboard]# kubectl create -f dashboard-controller.yaml 
serviceaccount/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
5、将服务提供出去
[root@master01 dashboard]# kubectl create -f dashboard-service.yaml 
service/kubernetes-dashboard created

2、查看创建dashboard状态

[root@master01 dashboard]# kubectl get pods -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-65f974f565-5vgq9   1/1     Running   0          61s

状态是running,表示创建成功了【-n kube-system表示指定查看命名空间中的pod】

3、查看服务分配的端口等信息

[root@master01 dashboard]# kubectl get svc -n kube-system
NAME                   TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.0.0.212   <none>        443:30001/TCP   2m31s

这个10.0.0.212是内部访问的地址,本文所讲内容对此可以暂时不需要过多理解。

PS:此处的svc是service的简写,可以通过下面的命令查看有哪些命令参数可以简写

[root@master01 dashboard]# kubectl api-resources
#内容较多可以自己尝试验证一下

4、测试访问web ui 界面地址(结合映射的端口号)

首先通过下面的命令查看分配的节点服务器(之前的文章中也使用过就不多解释了)

[root@master01 dashboard]# kubectl get pods,svc -n kube-system -o wide
NAME                                        READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE
pod/kubernetes-dashboard-65f974f565-5vgq9   1/1     Running   0          12m   172.17.70.3   192.168.0.130   <none>

NAME                           TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE   SELECTOR
service/kubernetes-dashboard   NodePort   10.0.0.212   <none>        443:30001/TCP   12m   k8s-app=kubernetes-dashboard

从执行的结果来看,是分配给了node02服务器,访问的入口是30001端口,那么就打开浏览器来进行访问测试,结果和原因分析如下图所示(需要点击“隐藏详情”位置的“高级”控件才能看到详情信息)

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

5、解决加密通信问题

因此,我们需要为此次构建来写对应的认证证书。这里笔者使用的shell脚本来快速生成证书文件

脚本(脚本名称为dashboard-cert.sh)内容如下,关于证书的构建我们在前面单节点部署etcd集群以及安装apiserver组件时讲述过了,这里就不赘述了。

cat > dashboard-csr.json <<EOF
{
   "CN": "Dashboard",
   "hosts": [],
   "key": {
       "algo": "rsa",
       "size": 2048
   },
   "names": [
       {
           "C": "CN",
           "L": "BeiJing",
           "ST": "BeiJing"
       }
   ]
}
EOF

#定义一个变量,使用位置变量赋值,作用是指定你证书(依赖证书)的位置
K8S_CA=$1 
#根据指定位置的证书进行创建和自签操作
cfssl gencert -ca=$K8S_CA/ca.pem -ca-key=$K8S_CA/ca-key.pem -config=$K8S_CA/ca-config.json -profile=kubernetes dashboard-csr.json | cfssljson -bare dashboard
#清空命名空间中的认证
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#重新创建生成到指定的目录中(当前目录)
kubectl create secret generic kubernetes-dashboard-certs --from-file=./ -n kube-system

另外,此时需要先对dashboard-controller.yaml文件进行修改

#dashboard-controller.yaml 增加证书两行,然后apply
#     args:
#        # PLATFORM-SPECIFIC ARGS HERE
#        - --auto-generate-certificates
#   下面是增加的两行,指定加密(tls)的秘钥和证书文件(在文件的第47行位置)就是下面执行脚本后生成的两个证书文件
#        - --tls-key-file=dashboard-key.pem
#        - --tls-cert-file=dashboard.pem

执行脚本,别忘了加上位置变量

#先看一下证书目录下的文件
[root@master01 dashboard]# ls /root/k8s/k8s-cert/
admin.csr       admin.pem       ca-csr.json  k8s-cert.sh          kube-proxy-key.pem  server-csr.json
admin-csr.json  ca-config.json  ca-key.pem   kube-proxy.csr       kube-proxy.pem      server-key.pem
admin-key.pem   ca.csr          ca.pem       kube-proxy-csr.json  server.csr          server.pem
#执行刚刚写的脚本
[root@master01 dashboard]# bash dashboard-cert.sh /root/k8s/k8s-cert/
2020/05/07 23:51:08 [INFO] generate received request
2020/05/07 23:51:08 [INFO] received CSR
2020/05/07 23:51:08 [INFO] generating key: rsa-2048
2020/05/07 23:51:08 [INFO] encoded CSR
2020/05/07 23:51:08 [INFO] signed certificate with serial number 404952983625314812290291880178217049372359470061
2020/05/07 23:51:08 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
secret "kubernetes-dashboard-certs" deleted
secret/kubernetes-dashboard-certs created
#在该目录下将生成两个证书
[root@master01 dashboard]# find . -name "*.pem"
./dashboard.pem
./dashboard-key.pem

此时需要使用以下命令重新进行部署(可能会更换所分配的节点哦!)

[root@master01 dashboard]# kubectl apply -f dashboard-controller.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
serviceaccount/kubernetes-dashboard configured
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.apps/kubernetes-dashboard configured

这里有个警告: 也就是apply方式更新的资源应该是由kubectl create 加--save-config参数创建的 或 由apply创建的 (apply当资源不存在时会创建),这里可以忽略。

未免出错,这里再次查看一下分配的节点服务器地址和端口号(果然换了)

[root@master01 dashboard]# kubectl get pods,svc -n kube-system -o wide
NAME                                        READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE
pod/kubernetes-dashboard-7dffbccd68-z6xcj   1/1     Running   0          4m57s   172.17.54.2   192.168.0.129   <none>

NAME                           TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE   SELECTOR
service/kubernetes-dashboard   NodePort   10.0.0.212   <none>        443:30001/TCP   62m   k8s-app=kubernetes-dashboard

再次进行访问测试,结果如下

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

点击后出现下面的对话框

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

6、解决token令牌问题,最终实现成功访问dashboard界面

​ 此时我们先来看一下我们编写的yaml文件吧

vim k8s-admin.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dashboard-admin
subjects:
  - kind: ServiceAccount
    name: dashboard-admin
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

生成令牌操作流程

#基于该文件进行创建
[root@master01 dashboard]# kubectl create -f k8s-admin.yaml 
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
#获取toke简要信息,名称为dashboard-admin-token-rf7x2 
[root@master01 dashboard]# kubectl get secret -n kube-system
NAME                               TYPE                                  DATA   AGE
dashboard-admin-token-rf7x2        kubernetes.io/service-account-token   3      25s
default-token-4mkb6                kubernetes.io/service-account-token   3      3d4h
kubernetes-dashboard-certs         Opaque                                11     29m
kubernetes-dashboard-key-holder    Opaque                                2      84m
kubernetes-dashboard-token-m8tlw   kubernetes.io/service-account-token   3      84m

#查看令牌序列号(详细信息)
[root@master01 dashboard]# kubectl describe secret dashboard-admin-token-rf7x2 -n kube-system
Name:         dashboard-admin-token-rf7x2
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: a31c4464-907e-11ea-9ec8-000c29069704

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1359 bytes
namespace:  11 bytes
#下面token冒号后面的内容就是我们需要的令牌代码,额有点长
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcmY3eDIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTMxYzQ0NjQtOTA3ZS0xMWVhLTllYzgtMDAwYzI5MDY5NzA0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.IuGFrBYgeiY2yhOwmKRe3Khqs43Z197vlokr6dt-ZW1z8g8lwD7nYahb4qZQJrnkN7ibqvSoX4goCBaXI94Jk4RqmPbpnfHq-gt40tnzYBuXRKWup4GAt-b1JpnDv9cQaC20Hb30R3QGqxtbejSEYXZD3IHxVGBWepa59Lals9Xo9J4dRasHSpOHpE279JITayev4AsafBuURtOmAd0jf8DD9tmWzQzQ4i48d7YwR_KeOENi7KNi3zNS0fWFYdtUlHVS_6SAq35ioS3Rrwu1hf4ToOueJXRWRsq-JVGqj8AC4moDsz7vQFNh4tevbZqocRPq1ImFSy4bmRbGO_AMtw

我们将该令牌序列号复制填入到浏览器页面中,点击登录,可以获取到如下界面

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

我们可以看一下集群中这个资源是否是在运行中

[root@master01 dashboard]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-dbddb74b8-cnhsl   1/1     Running   0          2d4h

看名称就知道确实没有问题。

那么我们就来简单通过这个nginx服务来体验一下这个dashboard是多么方便吧

首先我们点击侧边栏中的“容器组”,点击该容器名称,进入一个页面,点击右上方的“运行命令”或”日志“控件会弹出另一个额外页面

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

下面是进入这个容器的网页界面和查看日志记录的页面

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

执行命令——node02节点上访问容器

[root@node02 ~]# curl 172.17.70.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@node02 ~]# 

通过dashboar页面查看日志更新结果

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解

那么此次dashboard部署和体验使用就到此结束了哈!

总结

​ 此次主要是对Kubernetes集群中可视化界面dashboard的部署和简单使用体验。相信大家会发现使用可视化界面就非常友好,而且简化了命令的操作。还附带监控等各种服务。

​ 而此次的部署我们主要是需要学会了解整个部署dashboard的流程,以及分析问题、然后如何解决所出现的问题。

​ 最后,体会一下dashboard页面的简单使用,非常感谢您的阅读!期待您的持续关注!您的关注一定是笔者前行最大的动力!