一开始打算把启动脚本和配置文件放入configmap,直接使用一个yaml文件进行部署,但是实际操作中遇到个问题, 后续解决了,再使用单一yaml文件部署, 这里使用自定义镜像方式,来进行部署,以下是部署流程
- 制作redis镜像
也可以直接使用构建好的,”k9scc/base-env:redis-7-sentinel”
- 使用yaml文件,创建redis
制作redis镜像
Dockerfile
FROM redis:7 MAINTAINER "You"
COPY *.conf /opt/conf/ COPY run.sh /opt/run.sh RUN apt update -y;apt-get install vim net-tools -y;apt-get clean && \ chmod +x /opt/run.sh
CMD /opt/run.sh
|
run.sh
#!/bin/bash pod_seq=$(echo $POD_NAME | awk -F"-" '{print $2}') if [[ ${pod_seq} -ne 0 ]];then sed -i '/^slaveof /d' /opt/conf/redis.conf echo "slaveof redis-0.redis.redis-cluster.svc.cluster.local 6379" >> /opt/conf/redis.conf fi /usr/local/bin/redis-server /opt/conf/redis.conf sleep 15 /usr/local/bin/redis-sentinel /opt/conf/sentinel.conf
|
redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
requirepass a12345678
masterauth a12345678
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
databases 16
save 900 1 save 300 10 save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum no
dbfilename dump.rdb dir /data
slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100
appendonly yes
appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
|
sentinel.conf
port 26379
dir "/tmp" sentinel deny-scripts-reconfig yes sentinel monitor mymaster redis-0.redis 6379 2 sentinel auth-pass mymaster a12345678 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 2
sentinel config-epoch mymaster 3
sentinel leader-epoch mymaster 3 SENTINEL resolve-hostnames yes SENTINEL announce-hostnames yes
|
构建redis镜像
我这边已经构建好, 也可以自己构建,
k9scc/base-env:redis-7-sentinel
|
把Dockerfile, run.sh, redis.conf, sentinel.conf放在一个目录下,然后执行下面的命令
docker build -t docker用户名/项目名:tag . docker push docker用户名/项目名:tag
|
k8s部署redis, 并使用存储类持久化存储
--- apiVersion: v1 kind: Namespace metadata: name: redis-cluster --- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis namespace: redis-cluster spec: serviceName: redis selector: matchLabels: app: redis replicas: 3 template: metadata: labels: app: redis spec: nodeSelector: {} restartPolicy: Always containers: - name: redis image: k9scc/base-env:redis-7-sentinel imagePullPolicy: Always env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name livenessProbe: tcpSocket: port: 6379 initialDelaySeconds: 3 periodSeconds: 5 readinessProbe: tcpSocket: port: 6379 initialDelaySeconds: 3 periodSeconds: 5 ports: - containerPort: 6379 resources: requests: memory: 256Mi cpu: 50m limits: memory: 2048Mi cpu: 1000m volumeMounts: - name: redis-pv-claim mountPath: /data readOnly: false volumeClaimTemplates: - metadata: name: redis-pv-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: openebs-hostpath
--- apiVersion: v1 kind: Service metadata: name: redis namespace: redis-cluster spec: type: ClusterIP ports: - name: redis port: 6379 targetPort: 6379 selector: app: redis
|
连接
连接哨兵 使用26379端口
java 连接redis哨兵配置
spring: redis: database: 4 sentinel: master: mymaster nodes: redis://redis-0.redis.redis-cluster.svc.cluster.local:26379,redis://redis-1.redis.redis-cluster.svc.cluster.local:26379,redis://redis-2.redis.redis-cluster.svc.cluster.local:26379 password: a12345678
|
客户端连接redis, 使用podip + 6379端口
redis-cli 10.1.x.x -a a12345678
|