44

终于不用敲命令了——Kubernetes之Dashboard部署与使用详解-未来已来,问君何在?

 3 years ago
source link: https://blog.51cto.com/14557673/2493323
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

终于不用敲命令了——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页面的简单使用,非常感谢您的阅读!期待您的持续关注!您的关注一定是笔者前行最大的动力!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK