终于不用敲命令了——Kubernetes之Dashboard部署与使用详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了终于不用敲命令了——Kubernetes之Dashboard部署与使用详解相关的知识,希望对你有一定的参考价值。
终于不用敲命令了——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端口,那么就打开浏览器来进行访问测试,结果和原因分析如下图所示(需要点击“隐藏详情”位置的“高级”控件才能看到详情信息)
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
再次进行访问测试,结果如下
点击后出现下面的对话框
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
我们将该令牌序列号复制填入到浏览器页面中,点击登录,可以获取到如下界面
我们可以看一下集群中这个资源是否是在运行中
[root@master01 dashboard]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-dbddb74b8-cnhsl 1/1 Running 0 2d4h
看名称就知道确实没有问题。
那么我们就来简单通过这个nginx服务来体验一下这个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页面查看日志更新结果
那么此次dashboard部署和体验使用就到此结束了哈!
总结
? 此次主要是对Kubernetes集群中可视化界面dashboard的部署和简单使用体验。相信大家会发现使用可视化界面就非常友好,而且简化了命令的操作。还附带监控等各种服务。
? 而此次的部署我们主要是需要学会了解整个部署dashboard的流程,以及分析问题、然后如何解决所出现的问题。
? 最后,体会一下dashboard页面的简单使用,非常感谢您的阅读!期待您的持续关注!您的关注一定是笔者前行最大的动力!
以上是关于终于不用敲命令了——Kubernetes之Dashboard部署与使用详解的主要内容,如果未能解决你的问题,请参考以下文章