CentOS Stream 8 高可用 Kuboard 部署方案
下面是在 CentOS Stream 8 上部署高可用 Kuboard 管理平台的详细方案,包含多副本、持久化存储和定期备份配置。
一、架构设计
高可用架构图
图表
节点规划
|
主机名 |
IP 地址 |
角色 |
资源配置 |
|
lb1 |
192.168.1.10 |
HAProxy + Keepalived |
2C/4G |
|
lb2 |
192.168.1.11 |
HAProxy + Keepalived |
2C/4G |
|
master1 |
192.168.1.101 |
Kubernetes 控制平面 |
4C/8G |
|
master2 |
192.168.1.102 |
Kubernetes 控制平面 |
4C/8G |
|
worker1 |
192.168.1.201 |
Kubernetes 工作节点 |
8C/32G |
|
worker2 |
192.168.1.202 |
Kubernetes 工作节点 |
8C/32G |
|
worker3 |
192.168.1.203 |
Kubernetes 工作节点 |
8C/32G |
|
storage |
192.168.1.50 |
MinIO 备份存储 |
4C/16G |
二、前置条件准备
1. 所有节点基础配置
bash
# 关闭 SELinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 禁用 Swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 设置 hosts 解析
sudo tee -a /etc/hosts <<EOF
192.168.1.10 lb1
192.168.1.11 lb2
192.168.1.101 master1
192.168.1.102 master2
192.168.1.201 worker1
192.168.1.202 worker2
192.168.1.203 worker3
192.168.1.50 storage
EOF
2. 负载均衡节点配置 (lb1, lb2)
bash
# 安装 HAProxy 和 Keepalived
sudo dnf install -y haproxy keepalived
# 配置 HAProxy (/etc/haproxy/haproxy.cfg)
sudo tee /etc/haproxy/haproxy.cfg <<EOF
global
log /dev/log local0
maxconn 10000
user haproxy
group haproxy
defaults
mode tcp
timeout connect 5s
timeout client 50s
timeout server 50s
frontend k8s-api
bind *:6443
default_backend k8s-masters
frontend kuboard-http
bind *:80
default_backend kuboard-http-backend
frontend kuboard-https
bind *:443
default_backend kuboard-https-backend
backend k8s-masters
balance roundrobin
option tcp-check
server master1 192.168.1.101:6443 check fall 3 rise 2
server master2 192.168.1.102:6443 check fall 3 rise 2
backend kuboard-http-backend
balance roundrobin
server worker1 192.168.1.201:30080 check
server worker2 192.168.1.202:30080 check
server worker3 192.168.1.203:30080 check
backend kuboard-https-backend
balance roundrobin
server worker1 192.168.1.201:30443 check
server worker2 192.168.1.202:30443 check
server worker3 192.168.1.203:30443 check
EOF
# 启动 HAProxy
sudo systemctl enable --now haproxy
3. Keepalived 配置 (lb1 为主节点)
bash
# lb1 配置 (/etc/keepalived/keepalived.conf)
sudo tee /etc/keepalived/keepalived.conf <<EOF
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface ens192 # 替换为实际网卡名
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secretpassword
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_haproxy
}
}
EOF
# lb2 配置 (备用节点)
sudo tee /etc/keepalived/keepalived.conf <<EOF
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens192 # 替换为实际网卡名
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass secretpassword
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_haproxy
}
}
EOF
# 启动 Keepalived
sudo systemctl enable --now keepalived
三、Kubernetes 集群部署
1. 所有节点安装容器运行时
bash
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y containerd.io
# 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd && sudo systemctl enable containerd
2. 所有节点安装 Kubernetes 组件
bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
sudo dnf install -y kubelet-1.28 kubeadm-1.28 kubectl-1.28 --disableexcludes=kubernetes
sudo systemctl enable kubelet
3. 初始化控制平面 (master1)
bash
sudo kubeadm init \
--control-plane-endpoint="192.168.1.100:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.101
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4. 添加其他控制平面节点 (master2)
bash
# 在 master1 上获取 join 命令
kubeadm token create --print-join-command
# 在 master2 上执行(添加 --control-plane 参数)
sudo kubeadm join 192.168.1.100:6443 --token <token> \
--discovery-token-ca-cert-hash <hash> \
--control-plane \
--certificate-key <cert-key>
5. 添加工作节点
bash
# 在 worker 节点上执行 join 命令
sudo kubeadm join 192.168.1.100:6443 --token <token> \
--discovery-token-ca-cert-hash <hash>
6. 安装网络插件 (Calico)
bash
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
四、存储解决方案部署
1. 安装 Longhorn 分布式存储
bash
# 添加 Helm 仓库
helm repo add longhorn https://charts.longhorn.io
helm repo update
# 安装 Longhorn
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--set persistence.defaultClass=true \
--set defaultSettings.defaultDataLocality="best-effort" \
--set defaultSettings.replicaSoftAntiAffinity=true \
--set defaultSettings.storageOverProvisioningPercentage=200 \
--set defaultSettings.storageMinimalAvailablePercentage=15 \
--set defaultSettings.guaranteedEngineCPU=0.25
2. 创建 Kuboard 专用存储类
yaml
# kuboard-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: kuboard-storage
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Retain
volumeBindingMode: Immediate
parameters:
numberOfReplicas: "3"
staleReplicaTimeout: "2880" # 48小时
dataLocality: "best-effort"
五、高可用 Kuboard 部署
1. 创建 Kuboard 命名空间和 PVC
bash
kubectl create namespace kuboard-system
yaml
# kuboard-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: kuboard-data
namespace: kuboard-system
spec:
accessModes:
- ReadWriteMany
storageClassName: kuboard-storage
resources:
requests:
storage: 20Gi
2. 部署高可用 Kuboard
bash
# 下载原始部署文件
curl -LO https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 修改为高可用版本
sed -i 's/replicas: 1/replicas: 3/' kuboard-v3.yaml
sed -i '/containers:/i \ volumes:\n - name: data\n persistentVolumeClaim:\n claimName: kuboard-data' kuboard-v3.yaml
sed -i '/containers:/,/ports:/ {/imagePullPolicy:/a \ volumeMounts:\n - name: data\n mountPath: /data' kuboard-v3.yaml
# 应用配置
kubectl apply -f kuboard-v3.yaml
3. 配置服务暴露
yaml
# kuboard-service.yaml
apiVersion: v1
kind: Service
metadata:
name: kuboard-v3
namespace: kuboard-system
spec:
selector:
app: kuboard
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30080
- name: https
port: 443
targetPort: 443
nodePort: 30443
type: NodePort
4. 创建长期有效的访问 Token
bash
kubectl -n kuboard-system create serviceaccount kuboard-admin
kubectl create clusterrolebinding kuboard-admin-binding \
--clusterrole=cluster-admin \
--serviceaccount=kuboard-system:kuboard-admin
# 创建有效期1年的Token
kubectl -n kuboard-system create token kuboard-admin --duration=8760h > kuboard-token.txt
六、备份解决方案
1. 安装 MinIO 备份存储
bash
# 在 storage 节点安装 MinIO
sudo dnf install -y minio
# 创建数据目录
sudo mkdir -p /data/backups
sudo chown minio-user:minio-user /data/backups
# 配置 MinIO 服务
sudo tee /etc/default/minio <<EOF
MINIO_VOLUMES="/data/backups"
MINIO_OPTS="--address :9000 --console-address :9001"
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=StrongPassword123!
EOF
# 启动 MinIO
sudo systemctl enable --now minio
2. 安装 Velero 备份工具
bash
# 下载 Velero 客户端
wget https://github.com/vmware-tanzu/velero/releases/download/v1.11.1/velero-v1.11.1-linux-amd64.tar.gz
tar -zxvf velero-v1.11.1-linux-amd64.tar.gz
sudo mv velero-v1.11.1-linux-amd64/velero /usr/local/bin/
# 创建备份凭证
cat <<EOF > credentials-velero
[default]
aws_access_key_id = admin
aws_secret_access_key = StrongPassword123!
EOF
# 安装 Velero
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.7.0 \
--bucket kuboard-backups \
--secret-file ./credentials-velero \
--use-volume-snapshots=true \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.1.50:9000 \
--snapshot-location-config region=minio
3. 配置定期备份
bash
# 每日全量备份
velero schedule create kuboard-daily \
--schedule="0 3 * * *" \
--include-namespaces kuboard-system \
--ttl 72h
# 每周快照备份
velero schedule create kuboard-weekly \
--schedule="0 4 * * 0" \
--include-namespaces kuboard-system \
--ttl 720h \
--snapshot-volumes
4. 备份验证脚本
bash
#!/bin/bash
# check-backup.sh
# 检查最新备份状态
LATEST_BACKUP=$(velero backup get | grep kuboard-daily | sort -r | head -n1 | awk '{print $1}')
BACKUP_STATUS=$(velero backup describe $LATEST_BACKUP --details | grep Phase | awk '{print $3}')
if [ "$BACKUP_STATUS" != "Completed" ]; then
echo "Backup $LATEST_BACKUP failed! Status: $BACKUP_STATUS"
exit 1
else
echo "Backup $LATEST_BACKUP completed successfully"
fi
# 添加至 cron 每日检查
# 0 4 * * * /path/to/check-backup.sh | mail -s "Kuboard Backup Report" admin@example.com
七、访问与监控
1. 访问 Kuboard
- URL: http://192.168.1.100
- 登录方式: 使用 kuboard-token.txt 中的 Token
2. 监控配置
yaml
# kuboard-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: kuboard-monitor
namespace: kuboard-system
spec:
selector:
matchLabels:
app: kuboard
endpoints:
- port: http
interval: 30s
path: /metrics
3. 告警规则
yaml
# kuboard-alerts.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: kuboard-alerts
namespace: kuboard-system
spec:
groups:
- name: kuboard-rules
rules:
- alert: KuboardDown
expr: up{job="kuboard"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: Kuboard pod down in {{ $labels.namespace }}
- alert: KuboardHighLatency
expr: histogram_quantile(0.95, sum(rate(kuboard_request_duration_seconds_bucket[5m])) by (le) > 3
for: 10m
labels:
severity: warning
annotations:
summary: Kuboard high request latency
八、运维与维护
1. 日常维护命令
|
操作 |
命令 |
|
查看 Kuboard 状态 |
kubectl -n kuboard-system get pods -l app=kuboard |
|
检查备份状态 |
velero backup get |
|
查看存储使用 |
kubectl -n longhorn-system get volumes |
|
重启 Kuboard |
kubectl -n kuboard-system rollout restart deployment kuboard-v3 |
2. 灾难恢复流程
- 恢复集群状态:
bash
velero restore create --from-backup kuboard-daily-latest
- 恢复存储卷:
bash
# 列出可用快照
velero snapshot location get
# 恢复特定卷
velero restore create --from-backup kuboard-daily-latest \
--restore-volumes \
--include-resources persistentvolumeclaims,persistentvolumes
3. 升级策略
图表
九、安全加固
1. RBAC 权限控制
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: kuboard-system
name: kuboard-viewer
rules:
- apiGroups: [""]
resources: ["pods", "services", "deployments"]
verbs: ["get", "list", "watch"]
2. 网络策略
yaml
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: kuboard-access
namespace: kuboard-system
spec:
selector: app == 'kuboard'
ingress:
- action: Allow
protocol: TCP
source:
namespaceSelector: name == 'ingress-nginx'
destination:
ports: [80, 443]
egress:
- action: Allow
protocol: TCP
destination:
ports: [80, 443]
- action: Allow
protocol: UDP
destination:
ports: [53]
3. 证书管理
bash
# 为 Kuboard 生成 TLS 证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout kuboard.key -out kuboard.crt \
-subj "/CN=kuboard.example.com" \
-addext "subjectAltName=DNS:kuboard.example.com,IP:192.168.1.100"
# 创建 Kubernetes Secret
kubectl -n kuboard-system create secret tls kuboard-tls \
--key kuboard.key \
--cert kuboard.crt
十、性能优化建议
1. Kuboard 资源配置
yaml
# kuboard-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kuboard-v3
namespace: kuboard-system
spec:
template:
spec:
containers:
- name: kuboard
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "1"
2. 数据库性能优化
sql
-- 在 Kuboard 的 PostgreSQL 中执行
ALTER SYSTEM SET shared_buffers = '1GB';
ALTER SYSTEM SET work_mem = '32MB';
ALTER SYSTEM SET maintenance_work_mem = '256MB';
ALTER SYSTEM SET effective_cache_size = '3GB';
3. 缓存配置
yaml
# kuboard-cache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kuboard-v3
namespace: kuboard-system
spec:
template:
spec:
containers:
- name: kuboard
env:
- name: CACHE_TYPE
value: "redis"
- name: REDIS_URL
value: "redis://redis.kuboard-system:6379/0"
总结
此方案提供了在 CentOS Stream 8 上部署高可用 Kuboard 的完整解决方案,关键特点包括:
- 高可用架构:
- 多副本 Kuboard (3个实例)
- 负载均衡 (HAProxy + Keepalived VIP)
- 分布式存储 (Longhorn)
- 持久化存储:
- Longhorn 提供分布式块存储
- 专用存储类配置
- 多副本数据保护
- 备份解决方案:
- Velero 定时备份
- MinIO 备份存储
- 备份状态监控
- 安全加固:
- RBAC 权限控制
- 网络策略隔离
- TLS 加密通信
- 监控告警:
- Prometheus 集成
- 关键指标告警
- 性能监控
此架构能够支持中等规模生产环境的使用,建议每季度进行一次全链路压力测试,每月验证一次备份恢复流程,确保系统的高可用性和数据安全性。
CentOS Stream 8 高可用 Kuboard 部署方案的更多相关文章
- MySQL 中常见的几种高可用架构部署方案
MySQL 中的集群部署方案 前言 MySQL Replication InnoDB Cluster InnoDB ClusterSet InnoDB ReplicaSet MMM MHA Galer ...
- 高可用(keepalived)部署方案
前言:为了减少三维数据中心可视化管理系统的停工时间,保持其服务的高度可用性.同时部署多套同样的三维可视化系统,让三维数据中心可视化系统同时部署并运行到多个服务器上.同时提供一个虚拟IP,然后外面通过这 ...
- openstack pike 集群高可用 安装 部署 目录汇总
# openstack pike 集群高可用 安装部署#安装环境 centos 7 史上最详细的openstack pike版 部署文档欢迎经验分享,欢迎笔记分享欢迎留言,或加QQ群663105353 ...
- activemq+Zookeper高可用集群方案配置
在高并发.对稳定性要求极高的系统中,高可用的是必不可少的,当然ActiveMQ也有自己的集群方案.从ActiveMQ 5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式 ...
- Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...
- MySQL高可用集群方案
一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+ ...
- LVS+Keepalived 高可用群集部署
LVS+Keepalived 高可用群集部署 1.LVS+Keepalived 高可用群集概述 2.LVS+Keepalived高可用群集部署 1.LVS+Keepalived 高可用群集概述: LV ...
- LVS+Keepalived 高可用环境部署记录(主主和主从模式)
之前的文章介绍了LVS负载均衡-基础知识梳理, 下面记录下LVS+Keepalived高可用环境部署梳理(主主和主从模式)的操作流程: 一.LVS+Keepalived主从热备的高可用环境部署 1)环 ...
- Centos下SFTP双机高可用环境部署记录
SFTP(SSH File Transfer Protocol),安全文件传送协议.有时也被称作 Secure File Transfer Protocol 或 SFTP.它和SCP的区别是它允许用户 ...
- Mysql分布式部署高可用集群方案
HAproxy+Mycat +MySQL主从集群高可用方案 1. HAproxy高可用方案: haproxy+keepalived,利用keepalived的VIP浮动能力,(多台ha ...
随机推荐
- 分布式一致性算法-Paxos、Raft、ZAB、Gossip
为什么需要一致性 数据不能存在单个节点(主机)上,否则可能出现单点故障. 多个节点(主机)需要保证具有相同的数据. 一致性算法就是为了解决上面两个问题. 一致性算法的定义 一致性就是数据保持一致, ...
- Pydantic字段级校验:解锁@validator的12种应用
title: Pydantic字段级校验:解锁@validator的12种应用 date: 2025/3/23 updated: 2025/3/23 author: cmdragon excerpt: ...
- ELF-Virus简易病毒程序分析
系统功能概述 ELF-Virus实现了一个简单的病毒程序,能够感染当前目录下的ELF格式的可执行文件.病毒程序通过将自身代码附加到目标文件中,并在文件末尾添加一个特定的签名来标记文件已被感染.感染后的 ...
- FastAPI 核心安全功能与模板渲染的完整示:登录、CSRF、JWT、会话、认证和缓存功能
以下是一个整合 FastAPI 核心安全功能与模板渲染的完整示例,基于多个技术文档的最佳实践,包含登录.CSRF.JWT.会话.认证和缓存功能: from datetime import dateti ...
- 太赞了!两个技巧帮你记住复杂 Linux 命令!
Linux 经历这么多个年头了,其中命令越来越多,又加上参数的多种多样,就算是实打实的高手也没有十足的把握能把各种命令运用得炉火纯青,就别说那些初学者了. 面对这些复杂难记的命令,网上的一些工具如 K ...
- 0x00 语法知识
目录 C++ STL Vector Pair String Queue Stack Deque Set Map Bitset Algorithm库函数 Reverse Unique Random_sh ...
- 康谋技术 |高效同步与处理:ADTF流服务在自动驾驶数采中的应用
随着自动驾驶技术的发展,车辆的智能化程度不断提高,这体现了车辆感知,决策以及执行的能力.在算法开发和迭代过程中,提高测试和开发效率,关键在于多传感器数据的高质量采集,确保数据的同步性.完整性和一致性. ...
- Laravel配置Route调用artisan
//web调用artisan Route::get('/artisan', function(\Illuminate\Http\Request $request) { $all = \Illumina ...
- git提示fatal: Authentication failed for但是不进入重新登录的流程,也死活不弹窗的解决办法,不用找证书删
问题: git提交代码输错了密码,提示 fatal: Authentication failed for xxx 但是不进入重新登录的流程,也死活不弹窗. 感觉git的这个设计真的很沙雕.网上说删证书 ...
- 【踩坑系列】使用Comparator.comparing对中文字符串排序结果不对
1. 踩坑经历 假设有这样一个业务场景,需要对各个城市的订单量排序,排序规则为: 先根据订单量倒序排列,再根据城市名称正序排列. 示例代码: import lombok.Getter; import ...