在Kubernetes中部署Redisson主要涉及两个方面:部署Redis集群和配置Redisson客户端。以下是详细的部署方案:
- 部署Redis集群
1.1 使用StatefulSet部署Redis哨兵模式
yaml
# redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
port 6379
bind 0.0.0.0
appendonly yes
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0-alpine
ports:
- containerPort: 6379
command: ["redis-server", "/etc/redis/redis.conf"]
volumeMounts:
- name: redis-config
mountPath: /etc/redis
- name: redis-data
mountPath: /data
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
volumes:
- name: redis-config
configMap:
name: redis-config
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
clusterIP: None
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
- 部署使用Redisson的应用程序
2.1 创建ConfigMap存储Redisson配置
yaml
# redisson-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redisson-config
data:
redisson.yaml: |
singleServerConfig:
address: "redis://redis-service:6379"
database: 0
connectionPoolSize: 64
connectionMinimumIdleSize: 24
subscriptionConnectionPoolSize: 50
dnsMonitoringInterval: 5000
codec: !<org.redisson.codec.JsonJacksonCodec> {}
threads: 16
nettyThreads: 32
transportMode: "NIO"
2.2 部署Spring Boot应用示例
yaml
# application-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redisson-app
spec:
replicas: 2
selector:
matchLabels:
app: redisson-app
template:
metadata:
labels:
app: redisson-app
spec:
containers:
- name: app
image: your-app:latest
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "k8s"
- name: REDISSON_CONFIG_PATH
value: "/app/config/redisson.yaml"
volumeMounts:
- name: redisson-config
mountPath: /app/config
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 500m
memory: 1Gi
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 20
periodSeconds: 5
volumes:
- name: redisson-config
configMap:
name: redisson-config
---
apiVersion: v1
kind: Service
metadata:
name: redisson-app-service
spec:
selector:
app: redisson-app
ports:
- port: 80
targetPort: 8080
type: ClusterIP
- 使用Helm Chart部署(推荐)
3.1 创建Redisson Helm Chart
redisson-chart/
├── Chart.yaml
├── values.yaml
└── templates/
├── deployment.yaml
├── service.yaml
├── configmap.yaml
└── serviceaccount.yaml
Chart.yaml:
yaml
apiVersion: v2
name: redisson-app
description: A Helm chart for Redisson application
version: 0.1.0
appVersion: "1.0"
values.yaml:
yaml
replicaCount: 2
image:
repository: your-app
tag: latest
pullPolicy: IfNotPresent
redisson:
config: |
singleServerConfig:
address: "redis://redis-service:6379"
connectionPoolSize: 64
connectionMinimumIdleSize: 24
mode: "single" # single, cluster, sentinel
service:
type: ClusterIP
port: 80
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 500m
memory: 1Gi
- 高级配置:Redis集群模式
4.1 Redis集群配置
yaml
# redis-cluster-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redisson-cluster-config
data:
redisson.yaml: |
clusterServersConfig:
nodeAddresses:
- "redis://redis-0.redis-service:6379"
- "redis://redis-1.redis-service:6379"
- "redis://redis-2.redis-service:6379"
scanInterval: 1000
slaveConnectionMinimumIdleSize: 24
slaveConnectionPoolSize: 64
masterConnectionMinimumIdleSize: 24
masterConnectionPoolSize: 64
codec: !<org.redisson.codec.JsonJacksonCodec> {}
- Java应用配置示例
5.1 Spring Boot配置类
java
@Configuration
public class RedissonConfig {
@Value("${redisson.config.path:classpath:redisson.yaml}")
private String configPath;
@Bean
public RedissonClient redissonClient() throws IOException {
Config config;
if (configPath.startsWith("classpath:")) {
String path = configPath.substring("classpath:".length());
InputStream is = getClass().getClassLoader().getResourceAsStream(path);
config = Config.fromYAML(is);
} else {
// 从文件系统读取
config = Config.fromYAML(new File(configPath));
}
return Redisson.create(config);
}
}
5.2 Kubernetes服务发现配置
yaml
# 使用Kubernetes API发现Redis节点
apiVersion: v1
kind: ConfigMap
metadata:
name: redisson-k8s-config
data:
redisson.yaml: |
clusterServersConfig:
nodeAddresses: []
loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
discovery: !<org.redisson.config.KubernetesServersConfig>
namespace: "default"
serviceName: "redis-service"
pingConnectionInterval: 30000
codec: !<org.redisson.codec.JsonJacksonCodec> {}
- 部署命令
bash
# 部署Redis集群
kubectl apply -f redis-config.yaml
# 等待Redis就绪
kubectl wait --for=condition=ready pod -l app=redis --timeout=300s
# 部署Redisson应用
kubectl apply -f redisson-config.yaml
kubectl apply -f application-deployment.yaml
# 或者使用Helm部署
helm install redisson-app ./redisson-chart -n default
- 验证部署
bash
# 检查Pod状态
kubectl get pods -l app=redisson-app
# 查看日志
kubectl logs deployment/redisson-app
# 测试连接
kubectl exec -it deployment/redisson-app -- curl http://localhost:8080/actuator/health
这个部署方案提供了从基础的Redis部署到完整的Redisson应用部署的全套配置,支持单机模式、集群模式,并且可以通过Helm进行灵活的配置管理。根据你的具体需求,可以调整资源配置和Redisson的配置参数。