apiVersion: apps/v1 kind: StatefulSet metadata: name: sentinel spec: serviceName: sentinel replicas: 3 selector: matchLabels: app: sentinel template: metadata: labels: app: sentinel spec: initContainers: - name: config image: redis:6.0-alpine command: [ "sh", "-c" ] args: - | REDIS_PASSWORD=a-very-complex-password-here nodes=redis-0.redis.redis.svc.cluster.local,redis-1.redis.redis.svc.cluster.local,redis-2.redis.redis.svc.cluster.local for i in ${nodes//,/ } do echo "finding master at $i" MASTER=$(redis-cli --no-auth-warning --raw -h $i -a $REDIS_PASSWORD info replication | awk '{print $1}' | grep master_host: | cut -d ":" -f2) if [ "$MASTER" == "" ]; then echo "no master found" MASTER= else echo "found $MASTER" break fi done echo "sentinel monitor mymaster $MASTER 6379 2" >> /tmp/master echo "port 5000 $(cat /tmp/master) sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 sentinel auth-pass mymaster $REDIS_PASSWORD " > /etc/redis/sentinel.conf cat /etc/redis/sentinel.conf volumeMounts: - name: redis-config mountPath: /etc/redis/ containers: - name: sentinel image: redis:6.0-alpine command: ["redis-sentinel"] args: ["/etc/redis/sentinel.conf"] ports: - containerPort: 5000 name: sentinel volumeMounts: - name: redis-config mountPath: /etc/redis/ - name: data mountPath: /data volumes: - name: redis-config emptyDir: {} volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "standard" resources: requests: storage: 50Mi --- apiVersion: v1 kind: Service metadata: name: sentinel spec: clusterIP: None ports: - port: 5000 targetPort: 5000 name: sentinel selector: app: sentinel