Skip to content

Commit e32e5aa

Browse files
committed
initial commit
0 parents  commit e32e5aa

12 files changed

+457
-0
lines changed

.helmignore

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Patterns to ignore when building packages.
2+
# This supports shell glob matching, relative path matching, and
3+
# negation (prefixed with !). Only one pattern per line.
4+
.DS_Store
5+
# Common VCS dirs
6+
.git/
7+
.gitignore
8+
.bzr/
9+
.bzrignore
10+
.hg/
11+
.hgignore
12+
.svn/
13+
# Common backup files
14+
*.swp
15+
*.bak
16+
*.tmp
17+
*.orig
18+
*~
19+
# Various IDEs
20+
.project
21+
.idea/
22+
*.tmproj
23+
.vscode/

Chart.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: v2
2+
name: redis-cluster
3+
description: A redis-cluster helm chart
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.1.0"

README.md

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
2+
## Redis Cluster Kubernetes Helm Charts
3+
4+
This repository contains Redis cluster helm charts that can survive pod restarts in which the pod IPs get changed afterwards, the cluster will be recovered successfully.
5+
6+
![Redis-Cluster](data:image/png;base64,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)
7+
8+
### Parameters
9+
10+
| Name | Description | Example |
11+
|--|--|--|
12+
`nameOverride` | String to override `redis-cluster.name` template | `redis-cluster`
13+
`fullnameOverride` | String to override `redis-cluster.fullname` `template` | `redis-cluster`
14+
`redis.image` | Redis docker image | `redis:7.2.3`
15+
`redis.port` | Redis server port | `6379`
16+
`redis.bus` | Redis cluster bus port | `16379`
17+
`redis.resources` | The resources of the redis container | `{}`
18+
`cluster.init` | A boolean to specify whether the cluster should be initialized. (Can be false when cluster is already created and maybe you just want to change the resources of the cluster) | `true`
19+
`cluster.master` | Number of master nodes | `3`
20+
`cluster.replicas` | Number of replicas of each master | `1`
21+
`metrics.enabled` | Turn on/off Redis exporter | `true`
22+
`metrics.image` | Docker image of Redis exporter | `oliver006/redis_exporter:v1.55.0`
23+
`metrics.resources` | Resources of metrics container | `{}`
24+
`metrics.serviceMonitor.enabled` | Create a service monitor if `metrics` is enabled | `true`
25+
`metrics.serviceMonitor.interval` | Metrics scraping interval | `30s`
26+
`service.enabled` | Create a service to access the cluster | `true`
27+
`service.type` | Service type | `ClusterIP`
28+
`persistence.storage` | volume storage | `2Gi`
29+
`persistence.accessModes` | volume access modes | `["ReadWriteOnce"]`
30+
`persistence.storageClassName`| Storage class name of PVC | `ceph-rdb`
31+
`extraConfig`| Passing extra key-value configs to redis.conf | `{}`
32+
33+
Please see the values.yaml to see how these parameters are used.
34+
35+
### Deploy
36+
37+
Clone the repo and `cd` to the repo directory.
38+
39+
```
40+
helm upgrade -i redis-cluster . -f values.yaml
41+
```

templates/_helpers.tpl

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
{{/*
2+
Expand the name of the chart.
3+
*/}}
4+
{{- define "redis-cluster.name" -}}
5+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
6+
{{- end }}
7+
8+
{{/*
9+
Create a default fully qualified app name.
10+
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
11+
If release name contains chart name it will be used as a full name.
12+
*/}}
13+
{{- define "redis-cluster.fullname" -}}
14+
{{- if .Values.fullnameOverride }}
15+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
16+
{{- else }}
17+
{{- $name := default .Chart.Name .Values.nameOverride }}
18+
{{- if contains $name .Release.Name }}
19+
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
20+
{{- else }}
21+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
22+
{{- end }}
23+
{{- end }}
24+
{{- end }}
25+
26+
{{/*
27+
Create chart name and version as used by the chart label.
28+
*/}}
29+
{{- define "redis-cluster.chart" -}}
30+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
31+
{{- end }}
32+
33+
{{/*
34+
Common labels
35+
*/}}
36+
{{- define "redis-cluster.labels" -}}
37+
helm.sh/chart: {{ include "redis-cluster.chart" . }}
38+
{{ include "redis-cluster.selectorLabels" . }}
39+
{{- if .Chart.AppVersion }}
40+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
41+
{{- end }}
42+
app.kubernetes.io/managed-by: {{ .Release.Service }}
43+
{{- end }}
44+
45+
{{/*
46+
Selector labels
47+
*/}}
48+
{{- define "redis-cluster.selectorLabels" -}}
49+
app.kubernetes.io/name: {{ include "redis-cluster.name" . }}
50+
app.kubernetes.io/instance: {{ .Release.Name }}
51+
{{- end }}
52+
53+
{{/*
54+
Create the name of the service account to use
55+
*/}}
56+
{{- define "redis-cluster.serviceAccountName" -}}
57+
{{- if .Values.serviceAccount.create }}
58+
{{- default (include "redis-cluster.fullname" .) .Values.serviceAccount.name }}
59+
{{- else }}
60+
{{- default "default" .Values.serviceAccount.name }}
61+
{{- end }}
62+
{{- end }}
63+
64+
{{/*
65+
replicaCount = master + master * replica
66+
*/}}
67+
{{- define "redis-cluster.replicaCount" -}}
68+
{{- mul .Values.cluster.master .Values.cluster.replicas | add .Values.cluster.master }}
69+
{{- end }}
70+
71+
{{- define "redis-cluster.addToConfig" -}}
72+
{{- if eq (printf "%s" .value) "" }}
73+
{{ .key }} ""
74+
{{- else }}
75+
{{ .key }} {{ .value }}
76+
{{- end }}
77+
{{- end }}
78+
79+
{{- define "redis-cluster.getHostPorts" -}}
80+
{{- $hostPorts := "" -}}
81+
{{- range $i := until (include "redis-cluster.replicaCount" . | int) }}
82+
{{- $hostPorts = printf "%s%s-%d.%s-headless.%s.svc.cluster.local:%d " $hostPorts (include "redis-cluster.name" $) $i (include "redis-cluster.name" $) $.Release.Namespace ($.Values.redis.port | int) }}
83+
{{- end }}
84+
{{- $hostPorts }}
85+
{{- end }}
86+
87+
{{- define "redis-cluster.getRedisAddrs" -}}
88+
{{- $hostPorts := "" -}}
89+
{{- range $i := until (include "redis-cluster.replicaCount" . | int) }}
90+
{{- $hostPorts = printf "%sredis://%s-%d.%s-headless.%s.svc.cluster.local:%d " $hostPorts (include "redis-cluster.name" $) $i (include "redis-cluster.name" $) $.Release.Namespace ($.Values.redis.port | int) }}
91+
{{- end }}
92+
{{- $hostPorts | trimSuffix " " }}
93+
{{- end }}

templates/configmap.yaml

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: {{ include "redis-cluster.name" . }}-config-map
5+
namespace: {{ .Release.Namespace | quote }}
6+
labels: {{ include "redis-cluster.labels" . | nindent 4 }}
7+
data:
8+
redis.conf: |
9+
dir /data/redis
10+
cluster-enabled yes
11+
cluster-config-file nodes.conf
12+
port {{ .Values.redis.port }}
13+
cluster-port {{ .Values.redis.bus }}
14+
cluster-preferred-endpoint-type hostname
15+
{{- range $key, $value := $.Values.extraConfig }}
16+
{{- include "redis-cluster.addToConfig" (dict "key" $key "value" $value) | indent 4 }}
17+
{{- end }}

templates/job.yaml

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{{- if .Values.cluster.init }}
2+
apiVersion: batch/v1
3+
kind: Job
4+
metadata:
5+
name: {{ include "redis-cluster.name" . }}-job
6+
namespace: {{ .Release.Namespace | quote }}
7+
labels: {{ include "redis-cluster.labels" . | nindent 4 }}
8+
spec:
9+
template:
10+
spec:
11+
restartPolicy: "OnFailure"
12+
initContainers:
13+
- name: ping-redises
14+
image: atkrad/wait4x:2.13.0
15+
command:
16+
- /bin/sh
17+
- /scripts/ping.sh
18+
volumeMounts:
19+
- name: scripts
20+
mountPath: /scripts
21+
containers:
22+
- name: init-cluster
23+
image: {{ .Values.redis.image }}
24+
command:
25+
- /bin/bash
26+
- /scripts/init-cluster.sh
27+
volumeMounts:
28+
- name: scripts
29+
mountPath: /scripts
30+
volumes:
31+
- name: scripts
32+
configMap:
33+
name: {{ include "redis-cluster.name" . }}-scripts
34+
{{- end }}

templates/scripts.yaml

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: {{ include "redis-cluster.name" . }}-scripts
5+
namespace: {{ .Release.Namespace | quote }}
6+
labels: {{ include "redis-cluster.labels" . | nindent 4 }}
7+
data:
8+
init-cluster.sh: |
9+
#!/bin/bash
10+
11+
redis-cli --cluster create --cluster-yes {{ include "redis-cluster.getHostPorts" . }} --cluster-replicas {{ .Values.cluster.replicas }}
12+
13+
run.sh: |
14+
#!/bin/bash
15+
16+
HOSTNAME=$(eval "hostname")
17+
redis-server /etc/redis/redis.conf --cluster-announce-hostname ${HOSTNAME}.{{ include "redis-cluster.name" . }}-headless.{{ .Release.Namespace }}.svc.cluster.local
18+
19+
fix-ips.sh: |
20+
#!/bin/bash
21+
22+
CLUSTER_CONFIG="/data/redis/nodes.conf"
23+
24+
if [ -f ${CLUSTER_CONFIG} ]; then
25+
OLD_IP=$(eval "cat ${CLUSTER_CONFIG} | grep 'myself' | cut -d' ' -f2 | cut -d'@' -f1 | cut -d':' -f1")
26+
27+
if [ "${OLD_IP}" == "${POD_IP}" ]; then
28+
echo "IPs match."
29+
elif [ "${OLD_IP}" == "" ]; then
30+
echo "OLD_IP is empty, make sure the cluster is initialized."
31+
elif [ "${POD_IP}" == "" ]; then
32+
echo "NEW_IP is empty."
33+
exit 1
34+
else
35+
echo "IPs don't match. OLD_IP=${OLD_IP}, NEW_IP=${POD_IP}."
36+
sed -i.bak -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/" ${CLUSTER_CONFIG}
37+
echo "Node IP was updated successfully, new nodes.conf:"
38+
cat ${CLUSTER_CONFIG} | grep "myself"
39+
fi
40+
else
41+
echo "${CLUSTER_CONFIG} doesn't exist, no need to update IPs."
42+
fi
43+
44+
ping.sh: |
45+
#!/bin/sh
46+
47+
REDIS_ADDRS="{{ include "redis-cluster.getRedisAddrs" . }}"
48+
49+
for addr in ${REDIS_ADDRS}; do
50+
echo "PINGING ${addr}"
51+
wait4x redis ${addr} --timeout 600s --connection-timeout 600s --interval 5s
52+
echo "PONG!"
53+
echo ""
54+
done
55+
56+
echo "All Redises are ready!"

0 commit comments

Comments
 (0)