guan000 2020-05-09
? 前面的几篇文章带着大家体验和部署了一下基于二进制方式部署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服务器就暂时不写了,因为本文可以不考虑这个层面。
我们在master01节点上部署该web ui界面。
首先在k8s工作目录中创建一个Dashboard的工作目录
[ k8s]# mkdir dashboard [ k8s]# cd dashboard/ #下载构建该界面的核心文件,资源地址:(https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard) #一共是下载了5个yaml文件,待会会一边使用一边介绍各个文件的作用和核心参数配置 #下面会有6个,其中一个(k8s-admin.yaml是自己写的,是用来做待会在浏览器中登录时的令牌的) [ 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该角色的权限:例如其中具备获取更新删除等不同的权限 [ 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、证书和密钥创建 [ dashboard]# kubectl create -f dashboard-secret.yaml secret/kubernetes-dashboard-certs created secret/kubernetes-dashboard-key-holder created 3、配置文件,对于集群dashboard设置的创建 [ dashboard]# kubectl create -f dashboard-configmap.yaml configmap/kubernetes-dashboard-settings created 4、创建容器需要的控制器以及服务账户 [ dashboard]# kubectl create -f dashboard-controller.yaml serviceaccount/kubernetes-dashboard created deployment.apps/kubernetes-dashboard created 5、将服务提供出去 [ dashboard]# kubectl create -f dashboard-service.yaml service/kubernetes-dashboard created
[ 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】
[ 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的简写,可以通过下面的命令查看有哪些命令参数可以简写
[ dashboard]# kubectl api-resources #内容较多可以自己尝试验证一下
首先通过下面的命令查看分配的节点服务器(之前的文章中也使用过就不多解释了)
[ 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端口,那么就打开浏览器来进行访问测试,结果和原因分析如下图所示(需要点击“隐藏详情”位置的“高级”控件才能看到详情信息)
因此,我们需要为此次构建来写对应的认证证书。这里笔者使用的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
执行脚本,别忘了加上位置变量
#先看一下证书目录下的文件 [ 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 #执行刚刚写的脚本 [ 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 dashboard]# find . -name "*.pem" ./dashboard.pem ./dashboard-key.pem
此时需要使用以下命令重新进行部署(可能会更换所分配的节点哦!)
[ 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当资源不存在时会创建),这里可以忽略。
未免出错,这里再次查看一下分配的节点服务器地址和端口号(果然换了)
[ 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
再次进行访问测试,结果如下
点击后出现下面的对话框
? 此时我们先来看一下我们编写的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
生成令牌操作流程
#基于该文件进行创建 [ dashboard]# kubectl create -f k8s-admin.yaml serviceaccount/dashboard-admin created clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created #获取toke简要信息,名称为dashboard-admin-token-rf7x2 [ 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 #查看令牌序列号(详细信息) [ 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
我们将该令牌序列号复制填入到浏览器页面中,点击登录,可以获取到如下界面
我们可以看一下集群中这个资源是否是在运行中
[ dashboard]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-dbddb74b8-cnhsl 1/1 Running 0 2d4h
看名称就知道确实没有问题。
那么我们就来简单通过这个nginx服务来体验一下这个dashboard是多么方便吧
首先我们点击侧边栏中的“容器组”,点击该容器名称,进入一个页面,点击右上方的“运行命令”或”日志“控件会弹出另一个额外页面
下面是进入这个容器的网页界面和查看日志记录的页面
执行命令——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> [ ~]#
通过dashboar页面查看日志更新结果
那么此次dashboard部署和体验使用就到此结束了哈!
? 此次主要是对Kubernetes集群中可视化界面dashboard的部署和简单使用体验。相信大家会发现使用可视化界面就非常友好,而且简化了命令的操作。还附带监控等各种服务。
? 而此次的部署我们主要是需要学会了解整个部署dashboard的流程,以及分析问题、然后如何解决所出现的问题。
? 最后,体会一下dashboard页面的简单使用,非常感谢您的阅读!期待您的持续关注!您的关注一定是笔者前行最大的动力!