[TOC]
0x00 前言简述
1.Kuboard 介绍
描述: Kuboard 是一款免费的 Kubernetes 管理工具,提供了丰富的功能,结合已有或新建的代码仓库、镜像仓库、CI/CD工具
等,可以便捷的搭建一个生产可用的 Kubernetes 容器云平台,轻松管理和运行云原生应用。
您也可以直接将 Kuboard 安装到现有的 Kubernetes 集群,通过 Kuboard 提供的 Kubernetes RBAC 管理界面,将 Kubernetes 提供的能力开放给您的开发/测试团队。
Kuboard 提供的功能有:
- Kubernetes 基本管理功能
- Kubernetes 问题诊断
- Kubernetes 存储管理
- 通过 ceph-csi 对接 CephFS
- 通过 ceph-csi 对接 Rook 安装的 CephFS
- 通过 nfs-client-provisioner 对接 NFS 类型的存储
- 对接其他类型的存储
- 认证与授权
- 内建用户库认证
- GitLab / GitHub 单点登录
- LDAP 认证
- 完整的 RBAC 权限管理
- Kuboard 特色功能
- Kuboard 官方套件
- Grafana+Prometheus 资源监控
- Grafana+Loki+Promtail 日志聚合
- Kuboard 自定义名称空间布局
- Kuboard 中英文语言包
- Kuboard 官方套件
2.Kuboard v3.x 版本
描述: Kuboard v3.x 兼容性涉及 Kubernetes 版本 (v1.13 ~ v1.20)
Kuboard v3.x 功能特点:
- 支持 Kubernetes 多集群管理
- 支持 amd64 (x86) 架构和 arm68 (armv8) 架构的 CPU;
Kuboard v3.x 与 v2.0.x 对比:
- 1.v3.x 不再部署在 Kubernetes 中,而是作为一个独立的容器运行。
- 2.由于运行模式不同 v2.0.x 与 v3.x 可以同时存在互不干扰, 其次是 v3.x 将 Kuboard 部署的大部分内容从 kube-system 名称空间迁移到 kuboard 名称空间。
Tips : 如果您最终决定从 Kuboard v2.0.x 迁移到 Kuboard v3,请在 Kuboard v2.0.x 的界面中卸载掉 Kuboard 套件,并在 Kuboard v3 中重新安装 Kuboard 套件。
0x01 安装部署
1.安装步骤
- 1) k8s集群部署说明获取部署 Kuboard 所需的 YAML 文件:
1
curl -o kuboard-v3.yaml https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
2.编辑 kuboard-v3.yaml 文件中的配置,该部署文件中,有两处配置必须修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31# 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-built-in.html
KUBOARD_ENDPOINT: 'http://192.168.12.108:30567'
# 请填写一个有效的 StorageClass name
storageClassName: please-provide-a-valid-StorageClass-name-here
# 端口设置
# Kuboard v3 容器对外暴露三个端口:
# 80 Kuboard Web 服务端口,TCP;
# 443 Kuboard Web 服务端口,TCP;
# 10081 Kuboard Agent Server 端口,TCP 、 UDP。
spec:
ports:
- name: webui
nodePort: 30567
port: 80
protocol: TCP
targetPort: 80
- name: agentservertcp
nodePort: 30568
port: 10081
protocol: TCP
targetPort: 10081
- name: agentserverudp
nodePort: 30568
port: 10081
protocol: UDP
targetPort: 10081
# 端口网络监听
# tcp 0 0 0.0.0.0:30567 0.0.0.0:* LISTEN -
# tcp 0 0 0.0.0.0:30568 0.0.0.0:* LISTEN -3.部署到 Kubernetes 集群
1
kubectl create -f kuboard-v3.yaml
Tips : 此 YAML 文件向 Kubernetes 中部署了一个三副本的 StatefulSet kuboard-etcd
和一个单副本的 Deployment kuboard-v3;其中 Deployment kuboard-v3 暂时不支持多副本,请保持其 replicas 字段为 1,将在后续的版本升级中解决 kuboard-v3 多副本部署的问题。
2.配置步骤
- 1) 访问 Kuboard 在浏览器中打开链接 http://192.168.12.108:30567 ,输入初始用户名和密码登录
1
2用户名: admin
密码: Kuboard123

WeiyiGeek.Kuboard多集群管理
- 2) 为单点登录的用户/用户组授权(
由于在刚开发阶段所以还有些不成熟
)
描述: 当您配置 Kuboard 与gitlab / github / ldap
实现单点登录以后,Kuboard 并不管理用户基本信息、用户组信息、用户与用户组之间的映射信息
为了让单点登录的用户获得合适的权限,您需要在 Kuboard 中为对应的用户/用户组授权:1
2
3- 为用户添加角色绑定
- 切换到 角色绑定(全局)
- 创建角色绑定

WeiyiGeek.授权
Tips : 全局角色绑定,用户可以在所有 Kubernetes 集群范围内执行该角色授予的权限;
Tips : 集群角色绑定,用户只能在指定的 Kubernetes 集群范围内执行该角色授予的权限;
Tips : 通常以用户组授权
比为单个用户授权更为灵活和方便
。
- 3) 通过反向代理访问 Kuboard 值得注意得是 Kuboard 需要使用根路径进行访问,即 https://kuboard.this-is-a-sample.com/,而不能是 https://this-is-a-sample.com/kuboard/ 这样的二级路径;
1 | ; 使用 nginx 作为反向代理,配置文件样例 |
- 4) SSL 证书配置
描述: Web 服务端口在如下两种情况下需要配置 SSL 证书, 一是通过公网访问 Kuboard 界面,提高安全性;二是为被纳管的 Kubernetes 配置 OIDC与 Kuboard 实现单点登录(如不配置,通过 Kuboard 管理 Kubernetes 时,Kubernetes 只能将用户识别成 kuboard-admin 或者 kuboard-user 这两个 ServiceAccount 当中的一个)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33# 已有证书 - Certificates
sudo docker run -d \
--restart=unless-stopped \
-v /hostpath/to/your/server.crt:/etc/certs/my.company.com/server.crt \
-v /hostpath/to/your/server.key:/etc/certs/my.company.com/server.key \
-e KUBOARD_TLS_CERT=/etc/certs/my.company.com/server.crt \
-e KUBOARD_TLS_KEY=/etc/certs/my.company.com/server.key \
-p 10080:80/tcp \
-p 443:443/tcp \
-p 10081:10081/tcp \
-p 10081:10081/udp \
-e KUBOARD_ENDPOINT="http://kuboard.this-is-a-sample.com:10080" \
-e KUBOARD_AGENT_SERVER_UDP_PORT="10081" \
-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
-v /root/kuboard-data:/data \
eipwork/kuboard:v3-beta
# 在线申请 - Lets Encrypt
sudo docker run -d \
--restart=unless-stopped \
-p 10080:80/tcp \
-p 443:443/tcp \
-p 10081:10081/tcp \
-p 10081:10081/udp \
# 第 7 行激活 Kuboard 中的 Lets Encrypt 客户端;
-e KUBOARD_TLS_AUTOCERT=true \
# 第 8 行指定 Lets Encrypt 颁发证书时对应的域名;
-e KUBOARD_TLS_DOMAIN=kuboard.this-is-a-sample.com \
-e KUBOARD_ENDPOINT="http://kuboard.this-is-a-sample.com:10080" \
-e KUBOARD_AGENT_SERVER_UDP_PORT="10081" \
-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
-v /root/kuboard-data:/data \
eipwork/kuboard:v3-beta
Tips : Kuboard Agent Server 端口使用 TCP、UDP 通信,是私有协议,已经自动配置了 TLS 加密连接,无需用户额外配置证书。(该 Agent Server 端口无需暴露到公网)
Tips : 如果通过 nginx 反向代理访问 Kuboard,建议在 nginx 中配置 SSL 证书;
Tips : 如果您的 Kuboard 打算直接在公网上访问,建议使用 Lets Encrypt;
Tips : 使用 Lets Encrypt 时,请将 kuboard.this-is-a-sample.com 域名指向您的 Kuboard 所在宿主机的公网 IP,并且确保 80, 443 端口开放。Kuboard 启动后,在您第一次访问 https://kuboard.this-is-a-sample.com 时,Lets Encrypt 将自动申请证书(浏览器上显示第一次访问将失败)。等候 1-5 分钟时间,再次访问 https://kuboard.this-is-a-sample.com 时,您将能够成功访问,证书也已经颁发并且自动配置好;通常免费证书有效期是一年时间,证书到期前一个月,系统会自动为您更新证书,无需您额外做任何操作。
3.升级配置
描述: 将 kuboard v3 更新到最新版本。
方式1.Docker 容器1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 1.停止已有 kuboard 容器
docker stop $(docker ps -a | grep "eipwork/kuboard" | awk '{print $1 }')
docker rm $(docker ps -a | grep "eipwork/kuboard" | awk '{print $1 }')
# 2.使用新版本的镜像启动 kuboard
sudo docker run -d \
--restart=unless-stopped \
--name=kuboard \
-p 10080:80/tcp \
-p 10081:10081/udp \
-p 10081:10081/tcp \
-e KUBOARD_ENDPOINT="http://kuboard.this-is-a-sample.com:10080" \
-e KUBOARD_AGENT_SERVER_UDP_PORT="10081" \
-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
-v /root/kuboard-data:/data \
eipwork/kuboard:v3.1.0.3
方式2.Kubernetes 集群1
2# 更新到最新版本
kubectl set image -n kuboard deployment/kuboard-v3 kuboard=swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
0x02 使用实践
1.集群添加
Step 1.添加已有 Kubernetes 集群到 Kuboard(
注意Kubernetes 集群,版本不低于 v1.13
),点击首页的添加集群。输入如图下所示(注意选择Agent连接方式)WeiyiGeek.k8s cluster add
Step 2.请安装 kuboard-agent 然后在将要被导入的 Kubernetes 集群执行如下指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16curl -k 'http://192.168.12.108:30567/kuboard-api/cluster/k8s-test.weiyigeek/kind/KubernetesCluster/k8s-test.weiyigeek/resource/installAgentToKubernetes?token=OIrni4gJpu4hfeAMyJTxCL0gyMZ0Ps1o' > kuboard-agent.yaml
kubectl apply -f ./kuboard-agent.yaml
# namespace/kuboard created
# serviceaccount/kuboard-admin created
# clusterrolebinding.rbac.authorization.k8s.io/kuboard-admin-crb created
# serviceaccount/kuboard-viewer created
# clusterrolebinding.rbac.authorization.k8s.io/kuboard-viewer-crb created
# deployment.apps/kuboard-agent created
# deployment.apps/kuboard-agent-2 created
# weiyigeek@master-k8s:~$
# 在 被导入的Kubernetes 集群下执行查看你
$ kubectl get pod -n kuboard
NAME READY STATUS RESTARTS AGE
kuboard-agent-2-5f4bcf8b45-d4gr9 1/1 Running 0 33s
kuboard-agent-784ccf8f5c-lm7fc 1/1 Running 0 33sStep 3.最后点击我已执行导入命令(执行上面的命令后也会自动探测), 添加完集群后会在Kubernetes 集群列表中看它。
WeiyiGeek.集群添加
Step 4.如果您已经执行了导入命令,但仍然处于等待导入状态,有可能是因为 kuboard-agent 没有启动,或者 kuboard-agent 不能连接 kuboard-server。请按照下面的提示检查网络连通性以及 kuboard-agent 的日志。
1
2
3
4
5
6
7
8
9# 1.请测试连通性 UDP
nc -vuz 192.168.12.108 30568
# Connection to 192.168.12.108 30568 port [udp/*] succeeded
# 2.请检查 kuboard-agent 状态
kubectl get pods -n kuboard -o wide -l "k8s.kuboard.cn/name in (kuboard-agent, kuboard-agent-2)"
# 3.请检查 kuboard-agent 日志
kubectl logs -f -n kuboard -l "k8s.kuboard.cn/name in (kuboard-agent, kuboard-agent-2)"Step 5.连接完成后与v2.x一样可以对集群进行管理包括(资源配置和应用程序应用以及存储的创建)

WeiyiGeek.集群管理
Step 5.学习上面生成的
Kuboard-agent.yaml
资源清单编写1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186# 名称空间创建
apiVersion: v1
kind: Namespace
metadata:
name: kuboard
# 服务用户创建
apiVersion: v1
kind: ServiceAccount
metadata:
name: kuboard-admin
namespace: kuboard
# 集群角色绑定RBAC-将k8s集群管理员的角色绑定到ServiceAccount中的kuboard-admin.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kuboard-admin-crb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kuboard-admin
namespace: kuboard
# 下面的浏览用户的权限绑定的是集群浏览的角色
apiVersion: v1
kind: ServiceAccount
metadata:
name: kuboard-viewer
namespace: kuboard
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kuboard-viewer-crb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: view
subjects:
- kind: ServiceAccount
name: kuboard-viewer
namespace: kuboard
# 利用 Deployment 控制器来 部署 kuboard-agent 容器 (此处采用两个Deployment控制器来进行不同权限分离)
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
k8s.kuboard.cn/ingress: "false"
k8s.kuboard.cn/service: none
k8s.kuboard.cn/workload: kuboard-agent
labels:
k8s.kuboard.cn/layer: cloud
k8s.kuboard.cn/name: kuboard-agent
name: kuboard-agent
namespace: kuboard
spec:
replicas: 1
selector:
matchLabels:
k8s.kuboard.cn/layer: cloud
k8s.kuboard.cn/name: kuboard-agent
template:
metadata:
labels:
k8s.kuboard.cn/layer: cloud
k8s.kuboard.cn/name: kuboard-agent
spec:
serviceAccountName: kuboard-admin
# 容忍在master节点也运行
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
# 容器定义设置
containers:
- env:
- name: KUBOARD_ENDPOINT
value: "http://192.168.12.108:30567"
- name: KUBOARD_AGENT_HOST
value: "192.168.12.108"
- name: KUBOARD_AGENT_PORT
value: "30568"
- name: KUBOARD_AGENT_REMOTE_PORT
value: "35002"
- name: KUBOARD_AGENT_PROTOCOL
value: "tcp"
- name: KUBOARD_AGENT_PROXY
value: ""
- name: KUBOARD_K8S_CLUSTER_NAME
value: "dev-k8s.weiyieek"
- name: KUBOARD_AGENT_KEY
value: "32b7d6572c6255211b4eec9009e4a816"
- name: KUBERNETES_TOKEN_NAME
value: "kuboard-admin"
- name: KUBOARD_ANONYMOUS_TOKEN
value: "WoMzrTCxYCoCPxZ91aX0v8d63ycPwFJ3"
image: "swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-agent:v3"
imagePullPolicy: Always
# 生存周期验证
livenessProbe:
exec:
command:
- /health.sh
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 60
successThreshold: 1
timeoutSeconds: 1
name: kuboard-agent
restartPolicy: Always
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
k8s.kuboard.cn/ingress: "false"
k8s.kuboard.cn/service: none
k8s.kuboard.cn/workload: kuboard-agent-2
labels:
k8s.kuboard.cn/layer: cloud
k8s.kuboard.cn/name: kuboard-agent-2
name: kuboard-agent-2
namespace: kuboard
spec:
replicas: 1
selector:
matchLabels:
k8s.kuboard.cn/layer: cloud
k8s.kuboard.cn/name: kuboard-agent-2
template:
metadata:
labels:
k8s.kuboard.cn/layer: cloud
k8s.kuboard.cn/name: kuboard-agent-2
spec:
serviceAccountName: kuboard-viewer
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
containers:
- env:
- name: KUBOARD_ENDPOINT
value: "http://192.168.12.108:30567"
- name: KUBOARD_AGENT_HOST
value: "192.168.12.108"
- name: KUBOARD_AGENT_PORT
value: "30568"
- name: KUBOARD_AGENT_REMOTE_PORT
value: "35002"
- name: KUBOARD_AGENT_PROTOCOL
value: "tcp"
- name: KUBOARD_AGENT_PROXY
value: ""
- name: KUBOARD_K8S_CLUSTER_NAME
value: "dev-k8s.weiyieek"
- name: KUBOARD_AGENT_KEY
value: "32b7d6572c6255211b4eec9009e4a816"
- name: KUBERNETES_TOKEN_NAME
value: "kuboard-viewer"
- name: KUBOARD_ANONYMOUS_TOKEN
value: "WoMzrTCxYCoCPxZ91aX0v8d63ycPwFJ3"
image: "swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-agent:v3"
imagePullPolicy: Always
livenessProbe:
exec:
command:
- /health.sh
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 60
successThreshold: 1
timeoutSeconds: 1
name: kuboard-agent
restartPolicy: AlwaysStep 6.我将所有的
kubernetes
集群都加入到kuboard进行多集群管理1
2
3Kubernetes master is running at https://weiyigeek-lb-vip.k8s:16443 # 高可用
Kubernetes master is running at https://k8s-test.weiyigeek:6443
Kubernetes control plane is running at https://dev-k8s.weiyieek:6443

WeiyiGeek.Kubernetes 集群列表
2.集群管理使用
Step 1.选择
k8s-test.weiyigeek
集群->default名称空间->常用操作->从YAML中创建。Step 2.在Kuboiard中创建一个Nginx服务应用。
从 YAML 创建的资源清单将此输入: (注意为了便于管理建议控制器名称与服务发现名称设置一样
)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71# 字典设置
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: nginx
name: nginx-config
namespace: default
data:
name: WeiyiGeek
# Deployment 控制器 & 初始化容器值得学习
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
namespace: default
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: web
mountPath: "/usr/share/nginx/html"
initContainers:
- name: init
image: busybox:1.33.0
command: ['sh', '-c', "env;echo ConfigMap:${MSG}--HostName-${HOSTNAME} > /usr/share/nginx/html/index.html"]
volumeMounts:
- name: web
mountPath: "/usr/share/nginx/html"
env:
- name: MSG
valueFrom:
configMapKeyRef:
name: nginx-config
key: name
volumes:
- name: web
emptyDir: {}
apiVersion: v1
kind: Service
metadata:
name: nginx-demo
namespace: default
labels:
app: nginx
spec:
selector:
app: nginx
type: NodePort
ports:
- name: nginx-port
protocol: TCP
port: 80
nodePort: 30000
targetPort: 80

WeiyiGeek.yaml部署
- Step 3.部署结果访问
http://192.168.12.111:30000/
地址返回界面如下:

WeiyiGeek.部署结果
- Step 4.查看我们资源清单创建的ConfigMap,点击配置中心->配置字典->我们可以通过资源清单和UI来创建

WeiyiGeek.kuboard-ConfigMap