[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 文件:
代码语言:javascript复制curl -o kuboard-v3.yaml https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
2.编辑 kuboard-v3.yaml 文件中的配置,该部署文件中,有两处配置必须修改:
代码语言:javascript复制# 关于如下参数的解释,请参考文档 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 集群
代码语言:javascript复制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 ,输入初始用户名和密码登录
代码语言:javascript复制用户名: admin
密码: Kuboard123
WeiyiGeek.Kuboard多集群管理
2) 为单点登录的用户/用户组授权(由于在刚开发阶段所以还有些不成熟
)
描述: 当您配置 Kuboard 与 gitlab / github / ldap
实现单点登录以后,Kuboard 并不管理用户基本信息、用户组信息、用户与用户组之间的映射信息
为了让单点登录的用户获得合适的权限,您需要在 Kuboard 中为对应的用户/用户组授权:
- 为用户添加角色绑定
- 切换到 角色绑定(全局)
- 创建角色绑定
WeiyiGeek.授权
Tips : 全局角色绑定,用户可以在所有 Kubernetes 集群范围内执行该角色授予的权限;
Tips : 集群角色绑定,用户只能在指定的 Kubernetes 集群范围内执行该角色授予的权限;
Tips : 通常以用户组授权
比为单个用户授权更为灵活和方便
。
- 3) 通过反向代理访问 Kuboard 值得注意得是 Kuboard 需要使用根路径进行访问,即 https://kuboard.this-is-a-sample.com/,而不能是 https://this-is-a-sample.com/kuboard/ 这样的二级路径;
; 使用 nginx 作为反向代理,配置文件样例
http {
# 您需要的其他配置
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name kuboard.this-is-a-sample.com; # 替换成你的域名
location / {
proxy_pass http://192.168.32.205:10080/; # 替换成你的 Kuboard IP 地址和端口,应该是 IP 地址,而不是 KUBOARD_ENDPOINT 参数的值
gzip on;
}
location /k8s-ws/ {
proxy_pass http://192.168.32.205:10080/k8s-ws/; # 替换成你的 Kuboard IP 地址和端口
proxy_http_version 1.1;
proxy_pass_header Authorization;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto https; # 如果您在反向代理上启用了 HTTPS
}
location /k8s-proxy/ {
proxy_pass http://192.168.32.205:10080/k8s-proxy/; # 替换成你的 Kuboard IP 地址和端口
proxy_http_version 1.1;
proxy_pass_header Authorization;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto https; # 如果您在反向代理上启用了 HTTPS
gzip on;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
4) SSL 证书配置 描述: Web 服务端口在如下两种情况下需要配置 SSL 证书, 一是通过公网访问 Kuboard 界面,提高安全性;二是为被纳管的 Kubernetes 配置 OIDC与 Kuboard 实现单点登录(如不配置,通过 Kuboard 管理 Kubernetes 时,Kubernetes 只能将用户识别成 kuboard-admin 或者 kuboard-user 这两个 ServiceAccount 当中的一个)
代码语言:javascript复制# 已有证书 - 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 容器
代码语言:javascript复制# 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 集群
代码语言:javascript复制# 更新到最新版本
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 集群执行如下指令
代码语言:javascript复制curl -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 33s
Step 3.最后点击我已执行导入命令(执行上面的命令后也会自动探测), 添加完集群后会在Kubernetes 集群列表中看它。
WeiyiGeek.集群添加
Step 4.如果您已经执行了导入命令,但仍然处于等待导入状态,有可能是因为 kuboard-agent 没有启动,或者 kuboard-agent 不能连接 kuboard-server。请按照下面的提示检查网络连通性以及 kuboard-agent 的日志。
代码语言:javascript复制# 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
资源清单编写
# 名称空间创建
---
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: Always
Step 6.我将所有的kubernetes
集群都加入到kuboard进行多集群管理
Kubernetes 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 创建的资源清单将此输入: (注意为了便于管理建议控制器名称与服务发现名称设置一样
)
# 字典设置
---
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