终于不用敲命令了 --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 页面的简单使用, 非常感谢您的阅读! 期待您的持续关注! 您的关注一定是笔者前行最大的动力!
来源: http://blog.51cto.com/14557673/2493323