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 0000000..2898835 Binary files /dev/null and b/rocketmq/rocketmq-compose-style.tar.gz differ 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 +