mirror of https://github.com/easzlab/kubeasz.git
138 lines
4.6 KiB
YAML
138 lines
4.6 KiB
YAML
|
apiVersion: v1
|
||
|
kind: ConfigMap
|
||
|
metadata:
|
||
|
name: {{ template "redis-ha.fullname" . }}-configmap
|
||
|
labels:
|
||
|
heritage: {{ .Release.Service }}
|
||
|
release: {{ .Release.Name }}
|
||
|
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
|
||
|
app: {{ template "redis-ha.fullname" . }}
|
||
|
data:
|
||
|
redis.conf: |
|
||
|
{{- if .Values.redis.customConfig }}
|
||
|
{{ .Values.redis.customConfig | indent 4 }}
|
||
|
{{- else }}
|
||
|
dir "/data"
|
||
|
{{- range $key, $value := .Values.redis.config }}
|
||
|
{{ $key }} {{ $value }}
|
||
|
{{- end }}
|
||
|
{{- if .Values.auth }}
|
||
|
requirepass replace-default-auth
|
||
|
masterauth replace-default-auth
|
||
|
{{- end }}
|
||
|
{{- end }}
|
||
|
|
||
|
sentinel.conf: |
|
||
|
{{- if .Values.sentinel.customConfig }}
|
||
|
{{ .Values.sentinel.customConfig | indent 4 }}
|
||
|
{{- else }}
|
||
|
dir "/data"
|
||
|
{{- $root := . -}}
|
||
|
{{- range $key, $value := .Values.sentinel.config }}
|
||
|
sentinel {{ $key }} {{ $root.Values.redis.masterGroupName }} {{ $value }}
|
||
|
{{- end }}
|
||
|
{{- if .Values.auth }}
|
||
|
sentinel auth-pass {{ .Values.redis.masterGroupName }} replace-default-auth
|
||
|
{{- end }}
|
||
|
{{- end }}
|
||
|
|
||
|
init.sh: |
|
||
|
HOSTNAME="$(hostname)"
|
||
|
INDEX="${HOSTNAME##*-}"
|
||
|
MASTER="$(redis-cli -h {{ template "redis-ha.fullname" . }} -p {{ .Values.sentinel.port }} sentinel get-master-addr-by-name {{ .Values.redis.masterGroupName }} | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"
|
||
|
MASTER_GROUP="{{ .Values.redis.masterGroupName }}"
|
||
|
QUORUM="{{ .Values.sentinel.quorum }}"
|
||
|
REDIS_CONF=/data/conf/redis.conf
|
||
|
REDIS_PORT={{ .Values.redis.port }}
|
||
|
SENTINEL_CONF=/data/conf/sentinel.conf
|
||
|
SENTINEL_PORT={{ .Values.sentinel.port }}
|
||
|
SERVICE={{ template "redis-ha.fullname" . }}
|
||
|
set -eu
|
||
|
|
||
|
sentinel_update() {
|
||
|
echo "Updating sentinel config"
|
||
|
sed -i "1s/^/$(cat sentinel-id)\\n/" "$SENTINEL_CONF"
|
||
|
sed -i "2s/^/sentinel monitor $MASTER_GROUP $1 $REDIS_PORT $QUORUM \\n/" "$SENTINEL_CONF"
|
||
|
echo "sentinel announce-ip $ANNOUNCE_IP" >> $SENTINEL_CONF
|
||
|
echo "sentinel announce-port $SENTINEL_PORT" >> $SENTINEL_CONF
|
||
|
}
|
||
|
|
||
|
redis_update() {
|
||
|
echo "Updating redis config"
|
||
|
echo "slaveof $1 $REDIS_PORT" >> "$REDIS_CONF"
|
||
|
echo "slave-announce-ip $ANNOUNCE_IP" >> $REDIS_CONF
|
||
|
echo "slave-announce-port $REDIS_PORT" >> $REDIS_CONF
|
||
|
}
|
||
|
|
||
|
copy_config() {
|
||
|
if [ -f "$SENTINEL_CONF" ]; then
|
||
|
grep "sentinel myid" "$SENTINEL_CONF" > sentinel-id || true
|
||
|
fi
|
||
|
cp /readonly-config/redis.conf "$REDIS_CONF"
|
||
|
cp /readonly-config/sentinel.conf "$SENTINEL_CONF"
|
||
|
}
|
||
|
|
||
|
setup_defaults() {
|
||
|
echo "Setting up defaults"
|
||
|
if [ "$INDEX" = "0" ]; then
|
||
|
echo "Setting this pod as the default master"
|
||
|
sed -i "s/^.*slaveof.*//" "$REDIS_CONF"
|
||
|
sentinel_update "$ANNOUNCE_IP"
|
||
|
else
|
||
|
DEFAULT_MASTER="$(getent hosts "$SERVICE-announce-0" | awk '{ print $1 }')"
|
||
|
if [ -z "$DEFAULT_MASTER" ]; then
|
||
|
echo "Unable to resolve host"
|
||
|
exit 1
|
||
|
fi
|
||
|
echo "Setting default slave config.."
|
||
|
redis_update "$DEFAULT_MASTER"
|
||
|
sentinel_update "$DEFAULT_MASTER"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
find_master() {
|
||
|
echo "Attempting to find master"
|
||
|
if [ "$(redis-cli -h "$MASTER"{{ if .Values.auth }} -a "$AUTH"{{ end }} ping)" != "PONG" ]; then
|
||
|
echo "Can't ping master, attempting to force failover"
|
||
|
if redis-cli -h "$SERVICE" -p "$SENTINEL_PORT" sentinel failover "$MASTER_GROUP" | grep -q 'NOGOODSLAVE' ; then
|
||
|
setup_defaults
|
||
|
return 0
|
||
|
fi
|
||
|
sleep 10
|
||
|
MASTER="$(redis-cli -h $SERVICE -p $SENTINEL_PORT sentinel get-master-addr-by-name $MASTER_GROUP | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"
|
||
|
if [ "$MASTER" ]; then
|
||
|
sentinel_update "$MASTER"
|
||
|
redis_update "$MASTER"
|
||
|
else
|
||
|
echo "Could not failover, exiting..."
|
||
|
exit 1
|
||
|
fi
|
||
|
else
|
||
|
echo "Found reachable master, updating config"
|
||
|
sentinel_update "$MASTER"
|
||
|
redis_update "$MASTER"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
mkdir -p /data/conf/
|
||
|
|
||
|
echo "Initializing config.."
|
||
|
copy_config
|
||
|
|
||
|
ANNOUNCE_IP=$(getent hosts "$SERVICE-announce-$INDEX" | awk '{ print $1 }')
|
||
|
if [ -z "$ANNOUNCE_IP" ]; then
|
||
|
"Could not resolve the announce ip for this pod"
|
||
|
exit 1
|
||
|
elif [ "$MASTER" ]; then
|
||
|
find_master
|
||
|
else
|
||
|
setup_defaults
|
||
|
fi
|
||
|
|
||
|
if [ "${AUTH:-}" ]; then
|
||
|
echo "Setting auth values"
|
||
|
sed -i "s/replace-default-auth/$AUTH/" "$REDIS_CONF" "$SENTINEL_CONF"
|
||
|
fi
|
||
|
|
||
|
echo "Ready..."
|