From b0079fbb31729c4d8f5361d0c49d37379f8218ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Fri, 19 Sep 2025 09:30:02 +0800 Subject: [PATCH] add redis rocketmq xxljob --- nacos/install-nacos.sh | 2 +- redis/README.md | 118 ++++++++++ redis/install-redis.sh | 50 +++++ redis/redis-configmap.yaml | 61 ++++++ redis/redis-deployment.yaml | 70 ++++++ redis/redis-service.yaml | 16 ++ rocketmq/README.md | 216 +++++++++++++++++++ rocketmq/install-rocketmq.sh | 65 ++++++ rocketmq/rocketmq-broker-deployment.yaml | 57 +++++ rocketmq/rocketmq-broker-service.yaml | 24 +++ rocketmq/rocketmq-compose-style.tar.gz | Bin 0 -> 5329 bytes rocketmq/rocketmq-configmap.yaml | 144 +++++++++++++ rocketmq/rocketmq-nameserver-deployment.yaml | 51 +++++ rocketmq/rocketmq-nameserver-service.yaml | 16 ++ xxljob/README.md | 100 +++++++++ xxljob/install-xxljob.sh | 37 ++++ xxljob/xxljob-deployment.yaml | 57 +++++ xxljob/xxljob-ingress.yaml | 25 +++ xxljob/xxljob-service.yaml | 17 ++ 19 files changed, 1125 insertions(+), 1 deletion(-) create mode 100644 redis/README.md create mode 100755 redis/install-redis.sh create mode 100644 redis/redis-configmap.yaml create mode 100644 redis/redis-deployment.yaml create mode 100644 redis/redis-service.yaml create mode 100644 rocketmq/README.md create mode 100755 rocketmq/install-rocketmq.sh create mode 100644 rocketmq/rocketmq-broker-deployment.yaml create mode 100644 rocketmq/rocketmq-broker-service.yaml create mode 100644 rocketmq/rocketmq-compose-style.tar.gz create mode 100644 rocketmq/rocketmq-configmap.yaml create mode 100644 rocketmq/rocketmq-nameserver-deployment.yaml create mode 100644 rocketmq/rocketmq-nameserver-service.yaml create mode 100644 xxljob/README.md create mode 100755 xxljob/install-xxljob.sh create mode 100644 xxljob/xxljob-deployment.yaml create mode 100644 xxljob/xxljob-ingress.yaml create mode 100644 xxljob/xxljob-service.yaml diff --git a/nacos/install-nacos.sh b/nacos/install-nacos.sh index f0147f9..a691067 100755 --- a/nacos/install-nacos.sh +++ b/nacos/install-nacos.sh @@ -29,5 +29,5 @@ kubectl get svc nacos -n default kubectl get ingress nacos-ingress -n default echo "Nacos 安装完成!" -echo "访问地址: https://nacos-ops.t-aaron.com" +echo "访问地址: https://nacos-ops.t-aaron.com/nacos" echo "默认用户名/密码: nacos/nacos" diff --git a/redis/README.md b/redis/README.md new file mode 100644 index 0000000..1f646bc --- /dev/null +++ b/redis/README.md @@ -0,0 +1,118 @@ +# Redis 安装指南 + +本目录包含在 Kubernetes 集群中安装 Redis 的配置文件。 + +## 文件说明 + +- `install-redis.sh` - Redis 安装脚本 +- `redis-deployment.yaml` - Redis Deployment 配置 +- `redis-service.yaml` - Redis Service 配置 +- `redis-configmap.yaml` - Redis 配置文件 + +## 安装步骤 + +1. 确保 kubectl 已安装并配置好集群连接 +2. 运行安装脚本: + ```bash + chmod +x install-redis.sh + ./install-redis.sh + ``` + +## 配置说明 + +### Redis 配置 +- **端口**: 6379 +- **密码**: redis123 +- **内存限制**: 512Mi +- **持久化**: 启用 RDB 和 AOF +- **数据目录**: /data + +### 服务访问 +- **集群内访问**: `redis.default.svc.cluster.local:6379` +- **密码**: redis123 + +## 使用示例 + +### 连接 Redis +```bash +# 获取 Redis Pod 名称 +kubectl get pods -l app=redis + +# 连接到 Redis +kubectl exec -it -n default -- redis-cli -a redis123 +``` + +### 基本操作 +```bash +# 设置键值 +SET mykey "Hello Redis" + +# 获取值 +GET mykey + +# 查看所有键 +KEYS * + +# 查看 Redis 信息 +INFO +``` + +### 从应用连接 +```yaml +# 在应用的配置中使用 +redis: + host: redis.default.svc.cluster.local + port: 6379 + password: redis123 +``` + +## 监控和维护 + +### 查看 Redis 状态 +```bash +kubectl get pods -l app=redis +kubectl logs +``` + +### 查看 Redis 信息 +```bash +kubectl exec -it -- redis-cli -a redis123 INFO +``` + +### 备份数据 +```bash +# 创建快照 +kubectl exec -it -- redis-cli -a redis123 BGSAVE + +# 查看备份文件 +kubectl exec -it -- ls -la /data/ +``` + +## 故障排除 + +### 常见问题 + +1. **Pod 启动失败** + - 检查资源限制 + - 查看 Pod 日志:`kubectl logs ` + +2. **连接被拒绝** + - 检查 Service 配置 + - 验证网络策略 + +3. **内存不足** + - 调整 maxmemory 配置 + - 增加 Pod 内存限制 + +### 日志查看 +```bash +kubectl logs -f +``` + +## 生产环境建议 + +1. **持久化存储**: 使用 PersistentVolume 替代 emptyDir +2. **高可用**: 考虑 Redis Sentinel 或 Redis Cluster +3. **监控**: 集成 Prometheus 监控 +4. **备份**: 定期备份 RDB 和 AOF 文件 +5. **安全**: 使用强密码和网络策略 diff --git a/redis/install-redis.sh b/redis/install-redis.sh new file mode 100755 index 0000000..dad3eb3 --- /dev/null +++ b/redis/install-redis.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +echo "开始安装 Redis 到 Kubernetes 集群..." + +# 检查 kubectl 是否可用 +if ! command -v kubectl &> /dev/null; then + echo "错误: kubectl 命令未找到,请先安装 kubectl" + exit 1 +fi + +# 应用 Redis 配置 +echo "应用 Redis ConfigMap..." +kubectl apply -f redis-configmap.yaml + +echo "应用 Redis Deployment..." +kubectl apply -f redis-deployment.yaml + +echo "应用 Redis Service..." +kubectl apply -f redis-service.yaml + +# 等待 Pod 启动 +echo "等待 Redis Pod 启动..." +kubectl wait --for=condition=ready pod -l app=redis -n default --timeout=300s + +# 检查状态 +echo "检查 Redis 部署状态..." +kubectl get pods -l app=redis -n default +kubectl get svc redis -n default + +# 测试 Redis 连接 +echo "测试 Redis 连接..." +REDIS_POD=$(kubectl get pods -l app=redis -n default -o jsonpath='{.items[0].metadata.name}') +if [ ! -z "$REDIS_POD" ]; then + echo "在 Pod $REDIS_POD 中测试 Redis..." + kubectl exec -it $REDIS_POD -n default -- redis-cli ping + if [ $? -eq 0 ]; then + echo "Redis 连接测试成功!" + else + echo "Redis 连接测试失败!" + fi +fi + +echo "Redis 安装完成!" +echo "Redis 服务地址: redis.default.svc.cluster.local:6379" +echo "默认密码: redis123" +echo "" +echo "使用示例:" +echo "kubectl exec -it -n default -- redis-cli -a redis123" +echo "" +echo "注意: 请确保已正确配置 Redis 密码和持久化存储" diff --git a/redis/redis-configmap.yaml b/redis/redis-configmap.yaml new file mode 100644 index 0000000..cc613aa --- /dev/null +++ b/redis/redis-configmap.yaml @@ -0,0 +1,61 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: redis-config + namespace: default + labels: + app: redis +data: + redis.conf: | + # Redis 配置文件 + + # 网络配置 + bind 0.0.0.0 + port 6379 + timeout 300 + tcp-keepalive 60 + + # 安全配置 + requirepass redis123 + + # 持久化配置 + save 900 1 + save 300 10 + save 60 10000 + + # RDB 配置 + rdbcompression yes + rdbchecksum yes + dbfilename dump.rdb + dir /data + + # AOF 配置 + appendonly yes + appendfilename "appendonly.aof" + appendfsync everysec + no-appendfsync-on-rewrite no + auto-aof-rewrite-percentage 100 + auto-aof-rewrite-min-size 64mb + + # 内存配置 + maxmemory 256mb + maxmemory-policy allkeys-lru + + # 日志配置 + loglevel notice + logfile "" + + # 其他配置 + daemonize no + supervised no + pidfile /var/run/redis_6379.pid + + # 客户端配置 + maxclients 10000 + + # 慢查询日志 + slowlog-log-slower-than 10000 + slowlog-max-len 128 + + # 延迟监控 + latency-monitor-threshold 100 diff --git a/redis/redis-deployment.yaml b/redis/redis-deployment.yaml new file mode 100644 index 0000000..d8dac79 --- /dev/null +++ b/redis/redis-deployment.yaml @@ -0,0 +1,70 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: redis + namespace: default + labels: + app: redis +spec: + replicas: 1 + selector: + matchLabels: + app: redis + template: + metadata: + labels: + app: redis + spec: + containers: + - name: redis + image: registry.t-aaron.com/redis:7.2-alpine + ports: + - containerPort: 6379 + name: redis + command: + - redis-server + - /etc/redis/redis.conf + env: + - name: REDIS_PASSWORD + value: "redis123" + resources: + requests: + memory: "256Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "200m" + livenessProbe: + exec: + command: + - redis-cli + - -a + - redis123 + - ping + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + exec: + command: + - redis-cli + - -a + - redis123 + - ping + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + volumeMounts: + - name: redis-config + mountPath: /etc/redis + - name: redis-data + mountPath: /data + volumes: + - name: redis-config + configMap: + name: redis-config + - name: redis-data + emptyDir: {} + restartPolicy: Always diff --git a/redis/redis-service.yaml b/redis/redis-service.yaml new file mode 100644 index 0000000..25423ae --- /dev/null +++ b/redis/redis-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: redis + namespace: default + labels: + app: redis +spec: + type: ClusterIP + ports: + - name: redis + port: 6379 + targetPort: 6379 + protocol: TCP + selector: + app: redis diff --git a/rocketmq/README.md b/rocketmq/README.md new file mode 100644 index 0000000..0f15132 --- /dev/null +++ b/rocketmq/README.md @@ -0,0 +1,216 @@ +# RocketMQ 安装指南 + +本目录包含在 Kubernetes 集群中安装 RocketMQ 的配置文件。 + +## 文件说明 + +- `install-rocketmq.sh` - RocketMQ 安装脚本 +- `rocketmq-nameserver-deployment.yaml` - NameServer Deployment 配置 +- `rocketmq-broker-deployment.yaml` - Broker Deployment 配置 +- `rocketmq-nameserver-service.yaml` - NameServer Service 配置 +- `rocketmq-broker-service.yaml` - Broker Service 配置 +- `rocketmq-configmap.yaml` - RocketMQ 配置文件 + +## RocketMQ 架构 + +RocketMQ 由两个核心组件组成: + +### 1. NameServer +- **作用**: 注册中心,管理 Broker 和 Topic 的路由信息 +- **端口**: 9876 +- **服务地址**: `rocketmq-nameserver.default.svc.cluster.local:9876` + +### 2. Broker +- **作用**: 消息存储和转发 +- **端口**: 10911 (主端口), 10912 (VIP端口) +- **服务地址**: `rocketmq-broker.default.svc.cluster.local:10911` + +## 安装步骤 + +1. 确保 kubectl 已安装并配置好集群连接 +2. 运行安装脚本: + ```bash + chmod +x install-rocketmq.sh + ./install-rocketmq.sh + ``` + +## 配置说明 + +### 镜像配置 +- **NameServer**: `registry.t-aaron.com/apache/rocketmq:4.9.7` +- **Broker**: `registry.t-aaron.com/apache/rocketmq:4.9.7` + +### 资源限制 +- **NameServer**: 512Mi-1Gi 内存, 200m-500m CPU +- **Broker**: 1Gi-2Gi 内存, 300m-1000m CPU + +### 存储配置 +- **日志目录**: `/opt/rocketmq-4.9.7/logs` +- **数据目录**: `/opt/rocketmq-4.9.7/store` +- **配置目录**: `/opt/rocketmq-4.9.7/conf` + +## 使用示例 + +### 查看服务状态 +```bash +# 查看 NameServer Pod +kubectl get pods -l app=rocketmq-nameserver + +# 查看 Broker Pod +kubectl get pods -l app=rocketmq-broker + +# 查看服务 +kubectl get svc -l app=rocketmq +``` + +### 查看日志 +```bash +# NameServer 日志 +kubectl logs -f + +# Broker 日志 +kubectl logs -f +``` + +### 进入容器 +```bash +# 进入 NameServer 容器 +kubectl exec -it -- sh + +# 进入 Broker 容器 +kubectl exec -it -- sh +``` + +### 测试连接 +```bash +# 测试 NameServer 连接 +kubectl exec -it -- netstat -tlnp | grep 9876 + +# 测试 Broker 连接 +kubectl exec -it -- netstat -tlnp | grep 10911 +``` + +## 应用集成 + +### Java 应用配置 +```properties +# application.properties +rocketmq.name-server=rocketmq-nameserver.default.svc.cluster.local:9876 +rocketmq.producer.group=producer-group +rocketmq.consumer.group=consumer-group +``` + +### Spring Boot 集成 +```xml + + org.apache.rocketmq + rocketmq-spring-boot-starter + 2.2.3 + +``` + +```java +@RestController +public class MessageController { + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @PostMapping("/send") + public String sendMessage(@RequestParam String message) { + rocketMQTemplate.convertAndSend("test-topic", message); + return "Message sent: " + message; + } +} +``` + +## 监控和维护 + +### 健康检查 +```bash +# 检查 NameServer 健康状态 +kubectl get pods -l app=rocketmq-nameserver -o wide + +# 检查 Broker 健康状态 +kubectl get pods -l app=rocketmq-broker -o wide +``` + +### 性能监控 +```bash +# 查看资源使用情况 +kubectl top pods -l app=rocketmq + +# 查看详细资源信息 +kubectl describe pods -l app=rocketmq +``` + +### 数据备份 +```bash +# 备份 Broker 数据 +kubectl exec -it -- tar -czf /tmp/rocketmq-backup.tar.gz /opt/rocketmq-4.9.7/store + +# 复制备份文件到本地 +kubectl cp :/tmp/rocketmq-backup.tar.gz ./rocketmq-backup.tar.gz +``` + +## 故障排除 + +### 常见问题 + +1. **NameServer 启动失败** + - 检查内存配置 + - 查看启动日志 + - 验证端口占用 + +2. **Broker 连接 NameServer 失败** + - 检查网络连接 + - 验证 NameServer 地址配置 + - 查看 Broker 日志 + +3. **消息发送失败** + - 检查 Topic 是否存在 + - 验证 Producer 配置 + - 查看 Broker 状态 + +4. **消息消费失败** + - 检查 Consumer 配置 + - 验证 Topic 和 Tag 配置 + - 查看消费日志 + +### 日志分析 +```bash +# 查看错误日志 +kubectl logs | grep ERROR + +# 查看警告日志 +kubectl logs | grep WARN + +# 实时查看日志 +kubectl logs -f +``` + +## 生产环境建议 + +1. **高可用部署**: 部署多个 NameServer 和 Broker 实例 +2. **持久化存储**: 使用 PersistentVolume 替代 emptyDir +3. **资源监控**: 集成 Prometheus 和 Grafana 监控 +4. **日志管理**: 配置日志收集和分析 +5. **安全配置**: 启用 ACL 和网络策略 +6. **备份策略**: 定期备份消息数据 +7. **性能调优**: 根据业务需求调整 JVM 参数 + +## 扩展功能 + +### 管理控制台 +可以部署 RocketMQ Console 来管理消息队列: +```bash +# 部署 Console +kubectl apply -f rocketmq-console-deployment.yaml +kubectl apply -f rocketmq-console-service.yaml +``` + +### 集群部署 +对于生产环境,建议部署 RocketMQ 集群: +- 多个 NameServer 实例 +- 多个 Broker 实例(Master-Slave) +- 负载均衡配置 diff --git a/rocketmq/install-rocketmq.sh b/rocketmq/install-rocketmq.sh new file mode 100755 index 0000000..c934919 --- /dev/null +++ b/rocketmq/install-rocketmq.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +echo "开始安装 RocketMQ 到 Kubernetes 集群..." + +# 检查 kubectl 是否可用 +if ! command -v kubectl &> /dev/null; then + echo "错误: kubectl 命令未找到,请先安装 kubectl" + exit 1 +fi + +# 应用 RocketMQ 配置 +echo "应用 RocketMQ ConfigMap..." +kubectl apply -f rocketmq-configmap.yaml + +echo "应用 RocketMQ NameServer Deployment..." +kubectl apply -f rocketmq-nameserver-deployment.yaml + +echo "应用 RocketMQ NameServer Service..." +kubectl apply -f rocketmq-nameserver-service.yaml + +echo "应用 RocketMQ Broker Deployment..." +kubectl apply -f rocketmq-broker-deployment.yaml + +echo "应用 RocketMQ Broker Service..." +kubectl apply -f rocketmq-broker-service.yaml + +# 等待 Pod 启动 +echo "等待 RocketMQ NameServer Pod 启动..." +kubectl wait --for=condition=ready pod -l app=rocketmq-nameserver -n default --timeout=300s + +echo "等待 RocketMQ Broker Pod 启动..." +kubectl wait --for=condition=ready pod -l app=rocketmq-broker -n default --timeout=300s + +# 检查状态 +echo "检查 RocketMQ 部署状态..." +echo "=== NameServer Pods ===" +kubectl get pods -l app=rocketmq-nameserver -n default +echo "=== Broker Pods ===" +kubectl get pods -l app=rocketmq-broker -n default +echo "=== Services ===" +kubectl get svc -l app=rocketmq -n default + +# 测试 RocketMQ 连接 +echo "测试 RocketMQ NameServer 连接..." +NAMESERVER_POD=$(kubectl get pods -l app=rocketmq-nameserver -n default -o jsonpath='{.items[0].metadata.name}') +if [ ! -z "$NAMESERVER_POD" ]; then + echo "在 Pod $NAMESERVER_POD 中测试 NameServer..." + kubectl exec -it $NAMESERVER_POD -n default -- sh -c "netstat -tlnp | grep 9876" + if [ $? -eq 0 ]; then + echo "RocketMQ NameServer 连接测试成功!" + else + echo "RocketMQ NameServer 连接测试失败!" + fi +fi + +echo "RocketMQ 安装完成!" +echo "NameServer 地址: rocketmq-nameserver.default.svc.cluster.local:9876" +echo "Broker 地址: rocketmq-broker.default.svc.cluster.local:10911" +echo "" +echo "使用示例:" +echo "1. 查看 NameServer 日志: kubectl logs -f -n default" +echo "2. 查看 Broker 日志: kubectl logs -f -n default" +echo "3. 进入 NameServer 容器: kubectl exec -it -n default -- sh" +echo "" +echo "注意: 请确保已正确配置 RocketMQ 的存储和网络策略" diff --git a/rocketmq/rocketmq-broker-deployment.yaml b/rocketmq/rocketmq-broker-deployment.yaml new file mode 100644 index 0000000..5324d10 --- /dev/null +++ b/rocketmq/rocketmq-broker-deployment.yaml @@ -0,0 +1,57 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rocketmq-broker + namespace: default + labels: + app: rocketmq-broker +spec: + replicas: 1 + selector: + matchLabels: + app: rocketmq-broker + template: + metadata: + labels: + app: rocketmq-broker + spec: + containers: + - name: rocketmq-broker + image: registry.t-aaron.com/apache/rocketmq:5.3.2 + command: + - sh + - mqbroker + ports: + - containerPort: 10909 + name: broker-admin + - containerPort: 10911 + name: broker + - containerPort: 10912 + name: broker-vip + env: + - name: JAVA_OPT_EXT + value: "-Xms1g -Xmx1g -Xmn512m" + - name: NAMESRV_ADDR + value: "rocketmq-nameserver:9876" + resources: + requests: + memory: "1Gi" + cpu: "300m" + limits: + memory: "2Gi" + cpu: "1000m" + livenessProbe: + tcpSocket: + port: 10911 + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + tcpSocket: + port: 10911 + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + restartPolicy: Always diff --git a/rocketmq/rocketmq-broker-service.yaml b/rocketmq/rocketmq-broker-service.yaml new file mode 100644 index 0000000..b7cd890 --- /dev/null +++ b/rocketmq/rocketmq-broker-service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: rocketmq-broker + namespace: default + labels: + app: rocketmq-broker +spec: + type: ClusterIP + ports: + - name: broker-admin + port: 10909 + targetPort: 10909 + protocol: TCP + - name: broker + port: 10911 + targetPort: 10911 + protocol: TCP + - name: broker-vip + port: 10912 + targetPort: 10912 + protocol: TCP + selector: + app: rocketmq-broker diff --git a/rocketmq/rocketmq-compose-style.tar.gz b/rocketmq/rocketmq-compose-style.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..28988357ae208c62680061cc6f8137d82836c44a GIT binary patch literal 5329 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 jzp0EPenviiae literal 0 HcmV?d00001 diff --git a/rocketmq/rocketmq-configmap.yaml b/rocketmq/rocketmq-configmap.yaml new file mode 100644 index 0000000..22cc0de --- /dev/null +++ b/rocketmq/rocketmq-configmap.yaml @@ -0,0 +1,144 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: rocketmq-config + namespace: default + labels: + app: rocketmq +data: + broker.conf: | + # RocketMQ Broker 配置文件 + + # Broker 集群名称 + brokerClusterName=DefaultCluster + + # Broker 名称 + brokerName=broker-a + + # Broker ID (0 表示 Master) + brokerId=0 + + # 删除文件时间点,默认凌晨4点 + deleteWhen=04 + + # 文件保留时间,默认48小时 + fileReservedTime=48 + + # Broker 角色 + # - ASYNC_MASTER 异步复制Master + # - SYNC_MASTER 同步双写Master + # - SLAVE + brokerRole=ASYNC_MASTER + + # 刷盘方式 + # - ASYNC_FLUSH 异步刷盘 + # - SYNC_FLUSH 同步刷盘 + flushDiskType=ASYNC_FLUSH + + # NameServer 地址 + namesrvAddr=rocketmq-nameserver:9876 + + # Broker 监听端口 + listenPort=10911 + + # Broker 对外服务端口 + brokerIP1= + + # Broker 对外服务端口2 + brokerIP2= + + # 存储路径 + storePathRootDir=/home/rocketmq/store + + # CommitLog 存储路径 + storePathCommitLog=/home/rocketmq/store/commitlog + + # 消息队列存储路径 + storePathConsumeQueue=/home/rocketmq/store/consumequeue + + # 消息索引存储路径 + storePathIndex=/home/rocketmq/store/index + + # checkpoint 文件存储路径 + storeCheckpoint=/home/rocketmq/store/checkpoint + + # abort 文件存储路径 + abortFile=/home/rocketmq/store/abort + + # 限制的消息大小 + maxMessageSize=65536 + + # 发送消息线程池数量 + sendMessageThreadPoolNums=128 + + # 拉消息线程池数量 + pullMessageThreadPoolNums=128 + + # 注册Broker到NameServer的超时时间 + registerBrokerTimeoutMills=3000 + + # 发送心跳间隔 + heartbeatBrokerInterval=30000 + + # 持久化Consumer消费进度间隔 + persistConsumerOffsetInterval=5000 + + # 是否允许 Broker 自动创建Topic + autoCreateTopicEnable=true + + # 是否允许 Broker 自动创建订阅组 + autoCreateSubscriptionGroup=true + + # 是否启动时允许重复注册Broker + checkThreadPoolQueueSize=1000 + + # 客户端回调线程池数量 + clientCallbackExecutorThreads=8 + + # 消费线程池最小线程数 + consumeThreadMin=20 + + # 消费线程池最大线程数 + consumeThreadMax=20 + + # 消费线程池队列大小 + consumeConcurrentlyMaxSpan=2000 + + # 消费超时时间 + consumeTimeout=15m + + # 消费失败重试次数 + maxReconsumeTimes=16 + + # 消费失败重试间隔 + retryMaxTimes=16 + + # 发送消息超时时间 + sendMessageTimeout=3000 + + # 压缩消息体阈值 + compressMsgBodyOverHowmuch=4096 + + # 是否压缩消息体 + compressedReadEnable=true + + # 是否启用消息轨迹 + traceTopicEnable=false + + # ACL 配置 + aclEnable=false + + # 消息过滤 + messageFilterClass= + + # 是否启用消息过滤 + enablePropertyFilter=false + + # 是否启用消息过滤 + enableConsumeMessageExtProperty=false + + # 是否启用消息过滤 + enableConsumeMessageExtProperty=false + + # 是否启用消息过滤 + enableConsumeMessageExtProperty=false diff --git a/rocketmq/rocketmq-nameserver-deployment.yaml b/rocketmq/rocketmq-nameserver-deployment.yaml new file mode 100644 index 0000000..2c7eebc --- /dev/null +++ b/rocketmq/rocketmq-nameserver-deployment.yaml @@ -0,0 +1,51 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rocketmq-nameserver + namespace: default + labels: + app: rocketmq-nameserver +spec: + replicas: 1 + selector: + matchLabels: + app: rocketmq-nameserver + template: + metadata: + labels: + app: rocketmq-nameserver + spec: + containers: + - name: rocketmq-nameserver + image: registry.t-aaron.com/apache/rocketmq:5.3.2 + command: + - sh + - mqnamesrv + ports: + - containerPort: 9876 + name: nameserver + env: + - name: JAVA_OPT_EXT + value: "-Xms512m -Xmx512m -Xmn128m" + resources: + requests: + memory: "512Mi" + cpu: "200m" + limits: + memory: "1Gi" + cpu: "500m" + livenessProbe: + tcpSocket: + port: 9876 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + tcpSocket: + port: 9876 + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + restartPolicy: Always diff --git a/rocketmq/rocketmq-nameserver-service.yaml b/rocketmq/rocketmq-nameserver-service.yaml new file mode 100644 index 0000000..9323fb0 --- /dev/null +++ b/rocketmq/rocketmq-nameserver-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: rocketmq-nameserver + namespace: default + labels: + app: rocketmq-nameserver +spec: + type: ClusterIP + ports: + - name: nameserver + port: 9876 + targetPort: 9876 + protocol: TCP + selector: + app: rocketmq-nameserver diff --git a/xxljob/README.md b/xxljob/README.md new file mode 100644 index 0000000..8265790 --- /dev/null +++ b/xxljob/README.md @@ -0,0 +1,100 @@ +# XXL-JOB 安装说明 + +## 概述 +XXL-JOB 是一个分布式任务调度平台,本目录包含了在 Kubernetes 集群中部署 XXL-JOB 的所有配置文件。 + +## 文件说明 +- `xxljob-deployment.yaml` - XXL-JOB Admin 部署配置 +- `xxljob-service.yaml` - XXL-JOB Admin 服务配置 +- `xxljob-ingress.yaml` - XXL-JOB Admin 入口配置 +- `install-xxljob.sh` - 自动安装脚本 + +## 安装前准备 + +### 1. 数据库准备 +确保 MySQL 数据库已安装并运行,并创建 `xxl_job` 数据库: + +```sql +CREATE DATABASE xxl_job DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +``` + +### 2. 数据库初始化 +执行 XXL-JOB 提供的数据库初始化脚本 `/sql/xxl_job.sql` + +### 3. 镜像准备 +确保以下镜像已推送到镜像仓库: +- `registry.t-aaron.com/xxl-job/xxl-job-admin:latest` + +## 安装步骤 + +### 方法一:使用安装脚本(推荐) +```bash +chmod +x install-xxljob.sh +./install-xxljob.sh +``` + +### 方法二:手动安装 +```bash +# 应用部署配置 +kubectl apply -f xxljob-deployment.yaml + +# 应用服务配置 +kubectl apply -f xxljob-service.yaml + +# 应用入口配置 +kubectl apply -f xxljob-ingress.yaml +``` + +## 访问信息 +- **访问地址**: https://xxljob-ops.t-aaron.com +- **默认用户名**: admin +- **默认密码**: 123456 + +## 配置说明 + +### 数据库连接 +默认配置连接到名为 `mysql` 的 MySQL 服务: +- 数据库: xxl_job +- 用户名: root +- 密码: 123456 + +如需修改数据库连接信息,请编辑 `xxljob-deployment.yaml` 文件中的 `PARAMS` 环境变量。 + +### 访问令牌 +默认访问令牌为 `default_token`,如需修改请编辑 `xxljob-deployment.yaml` 文件。 + +## 验证安装 +安装完成后,可以通过以下命令检查部署状态: + +```bash +# 检查 Pod 状态 +kubectl get pods -l app=xxl-job-admin + +# 检查服务状态 +kubectl get svc xxl-job-admin + +# 检查入口状态 +kubectl get ingress xxl-job-admin-ingress +``` + +## 故障排除 + +### 常见问题 +1. **Pod 启动失败**: 检查数据库连接配置是否正确 +2. **无法访问**: 检查 Ingress 配置和域名解析 +3. **数据库连接失败**: 确认 MySQL 服务是否正常运行 + +### 日志查看 +```bash +kubectl logs -l app=xxl-job-admin +``` + +## 卸载 +如需卸载 XXL-JOB,执行以下命令: + +```bash +kubectl delete -f xxljob-ingress.yaml +kubectl delete -f xxljob-service.yaml +kubectl delete -f xxljob-deployment.yaml +``` + diff --git a/xxljob/install-xxljob.sh b/xxljob/install-xxljob.sh new file mode 100755 index 0000000..4dc2c72 --- /dev/null +++ b/xxljob/install-xxljob.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +echo "开始安装 XXL-JOB 到 Kubernetes 集群..." + +# 检查 kubectl 是否可用 +if ! command -v kubectl &> /dev/null; then + echo "错误: kubectl 命令未找到,请先安装 kubectl" + exit 1 +fi + +# 应用 XXL-JOB 配置 +echo "应用 XXL-JOB Deployment..." +kubectl apply -f xxljob-deployment.yaml + +echo "应用 XXL-JOB Service..." +kubectl apply -f xxljob-service.yaml + +echo "应用 XXL-JOB Ingress..." +kubectl apply -f xxljob-ingress.yaml + +# 等待 Pod 启动 +echo "等待 XXL-JOB Pod 启动..." +kubectl wait --for=condition=ready pod -l app=xxl-job-admin -n default --timeout=300s + +# 检查状态 +echo "检查 XXL-JOB 部署状态..." +kubectl get pods -l app=xxl-job-admin -n default +kubectl get svc xxl-job-admin -n default +kubectl get ingress xxl-job-admin-ingress -n default + +echo "XXL-JOB 安装完成!" +echo "访问地址: https://xxljob-ops.t-aaron.com" +echo "默认用户名/密码: admin/123456" +echo "" +echo "注意: 请确保MySQL数据库已正确配置,并且xxl_job数据库已创建" +echo "数据库初始化脚本: /sql/xxl_job.sql" + diff --git a/xxljob/xxljob-deployment.yaml b/xxljob/xxljob-deployment.yaml new file mode 100644 index 0000000..4459d56 --- /dev/null +++ b/xxljob/xxljob-deployment.yaml @@ -0,0 +1,57 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: xxl-job-admin + namespace: default + labels: + app: xxl-job-admin +spec: + replicas: 1 + selector: + matchLabels: + app: xxl-job-admin + template: + metadata: + labels: + app: xxl-job-admin + spec: + containers: + - name: xxl-job-admin + image: registry.t-aaron.com/xxl-job/xxl-job-admin:latest + ports: + - containerPort: 8080 + name: http + env: + - name: PARAMS + value: "--spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456 --xxl.job.accessToken=default_token" + resources: + requests: + memory: "512Mi" + cpu: "250m" + limits: + memory: "1Gi" + cpu: "500m" + livenessProbe: + httpGet: + path: /actuator/health + port: 8080 + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /actuator/health + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + volumeMounts: + - name: xxl-job-logs + mountPath: /data/applogs + volumes: + - name: xxl-job-logs + emptyDir: {} + restartPolicy: Always + diff --git a/xxljob/xxljob-ingress.yaml b/xxljob/xxljob-ingress.yaml new file mode 100644 index 0000000..98e9b6e --- /dev/null +++ b/xxljob/xxljob-ingress.yaml @@ -0,0 +1,25 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: xxl-job-admin-ingress + namespace: default + annotations: + traefik.ingress.kubernetes.io/router.entrypoints: web,websecure + traefik.ingress.kubernetes.io/router.tls: "true" +spec: + tls: + - hosts: + - xxljob-ops.t-aaron.com + secretName: tls + rules: + - host: xxljob-ops.t-aaron.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: xxl-job-admin + port: + number: 8080 + diff --git a/xxljob/xxljob-service.yaml b/xxljob/xxljob-service.yaml new file mode 100644 index 0000000..0522508 --- /dev/null +++ b/xxljob/xxljob-service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: xxl-job-admin + namespace: default + labels: + app: xxl-job-admin +spec: + type: ClusterIP + ports: + - name: http + port: 8080 + targetPort: 8080 + protocol: TCP + selector: + app: xxl-job-admin +