diff --git a/clusters/cl01tl/manifests/blocky/ConfigMap-blocky-valkey-init-scripts.yaml b/clusters/cl01tl/manifests/blocky/ConfigMap-blocky-valkey-init-scripts.yaml new file mode 100644 index 000000000..de5d0d775 --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/ConfigMap-blocky-valkey-init-scripts.yaml @@ -0,0 +1,87 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: blocky-valkey-init-scripts + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm +data: + init.sh: |- + #!/bin/sh + set -eu + + # Default config paths + VALKEY_CONFIG=${VALKEY_CONFIG_PATH:-/data/conf/valkey.conf} + + LOGFILE="/data/init.log" + DATA_DIR="/data/conf" + + # Logging function (outputs to stderr and file) + log() { + echo "$(date) $1" | tee -a "$LOGFILE" >&2 + } + + # Clean old log if requested + if [ "${KEEP_OLD_LOGS:-false}" != "true" ]; then + rm -f "$LOGFILE" + fi + + if [ -f "$LOGFILE" ]; then + log "Detected restart of this instance ($HOSTNAME)" + fi + + log "Creating configuration in $DATA_DIR..." + mkdir -p "$DATA_DIR" + rm -f "$VALKEY_CONFIG" + + + # Base valkey.conf + log "Generating base valkey.conf" + { + echo "port 6379" + echo "protected-mode no" + echo "bind * -::*" + echo "dir /data" + } >>"$VALKEY_CONFIG" + # Replica mode configuration + log "Configuring replication mode" + + # Use POD_INDEX from Kubernetes metadata + POD_INDEX=${POD_INDEX:-0} + IS_MASTER=false + + # Check if this is pod-0 (master) + if [ "$POD_INDEX" = "0" ]; then + IS_MASTER=true + log "This pod (index $POD_INDEX) is configured as MASTER" + else + log "This pod (index $POD_INDEX) is configured as REPLICA" + fi + + # Configure replica settings + if [ "$IS_MASTER" = "false" ]; then + MASTER_HOST="blocky-valkey-0.blocky-valkey-headless.blocky.svc.cluster.local" + MASTER_PORT="6379" + + log "Configuring replica to follow master at $MASTER_HOST:$MASTER_PORT" + + { + echo "" + echo "# Replica Configuration" + echo "replicaof $MASTER_HOST $MASTER_PORT" + echo "replica-announce-ip blocky-valkey-$POD_INDEX.blocky-valkey-headless.blocky.svc.cluster.local" + } >>"$VALKEY_CONFIG" + fi + + # Append extra configs if present + if [ -f /usr/local/etc/valkey/valkey.conf ]; then + log "Appending /usr/local/etc/valkey/valkey.conf" + cat /usr/local/etc/valkey/valkey.conf >>"$VALKEY_CONFIG" + fi + if [ -d /extravalkeyconfigs ]; then + log "Appending files in /extravalkeyconfigs/" + cat /extravalkeyconfigs/* >>"$VALKEY_CONFIG" + fi diff --git a/clusters/cl01tl/manifests/blocky/ConfigMap-blocky.yaml b/clusters/cl01tl/manifests/blocky/ConfigMap-blocky.yaml index 5b51f41c0..30f71911f 100644 --- a/clusters/cl01tl/manifests/blocky/ConfigMap-blocky.yaml +++ b/clusters/cl01tl/manifests/blocky/ConfigMap-blocky.yaml @@ -240,7 +240,7 @@ data: cacheTimeNegative: 30m redis: - address: redis-replication-blocky-master.blocky:6379 + address: blocky-valkey.blocky:6379 required: true prometheus: diff --git a/clusters/cl01tl/manifests/blocky/Deployment-blocky.yaml b/clusters/cl01tl/manifests/blocky/Deployment-blocky.yaml index ad624a2c3..59874056d 100644 --- a/clusters/cl01tl/manifests/blocky/Deployment-blocky.yaml +++ b/clusters/cl01tl/manifests/blocky/Deployment-blocky.yaml @@ -22,7 +22,7 @@ spec: template: metadata: annotations: - checksum/configMaps: 841b86021474fd4676f79d87f40b9003cbde5ace583c0c78da5bb8de6dfeafbb + checksum/configMaps: 547195f75f9fdf4345c81fd17b765851cf66dcac82b124e8780458e7ca25431b labels: app.kubernetes.io/controller: main app.kubernetes.io/instance: blocky diff --git a/clusters/cl01tl/manifests/blocky/PodMonitor-blocky-valkey.yaml b/clusters/cl01tl/manifests/blocky/PodMonitor-blocky-valkey.yaml new file mode 100644 index 000000000..6b20279c4 --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/PodMonitor-blocky-valkey.yaml @@ -0,0 +1,23 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: blocky-valkey + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: valkey + app.kubernetes.io/component: podmonitor +spec: + podMetricsEndpoints: + - port: metrics + interval: 30s + namespaceSelector: + matchNames: + - blocky + selector: + matchLabels: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky diff --git a/clusters/cl01tl/manifests/blocky/PrometheusRule-blocky-valkey.yaml b/clusters/cl01tl/manifests/blocky/PrometheusRule-blocky-valkey.yaml new file mode 100644 index 000000000..688d8c38b --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/PrometheusRule-blocky-valkey.yaml @@ -0,0 +1,47 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: blocky-valkey + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: valkey +spec: + groups: + - name: blocky-valkey + rules: + - alert: ValkeyDown + annotations: + description: Valkey instance {{ $labels.instance }} is down. + summary: Valkey instance {{ $labels.instance }} down + expr: | + redis_up{service="blocky-valkey-metrics"} == 0 + for: 2m + labels: + severity: error + - alert: ValkeyMemoryHigh + annotations: + description: | + Valkey instance {{ $labels.instance }} is using {{ $value }}% of its available memory. + summary: Valkey instance {{ $labels.instance }} is using too much memory + expr: | + redis_memory_used_bytes{service="blocky-valkey-metrics"} * 100 + / + redis_memory_max_bytes{service="blocky-valkey-metrics"} + > 90 <= 100 + for: 2m + labels: + severity: error + - alert: ValkeyKeyEviction + annotations: + description: | + Valkey instance {{ $labels.instance }} has evicted {{ $value }} keys in the last 5 minutes. + summary: Valkey instance {{ $labels.instance }} has evicted keys + expr: | + increase(redis_evicted_keys_total{service="blocky-valkey-metrics"}[5m]) > 0 + for: 1s + labels: + severity: error diff --git a/clusters/cl01tl/manifests/blocky/RedisReplication-redis-replication-blocky.yaml b/clusters/cl01tl/manifests/blocky/RedisReplication-redis-replication-blocky.yaml deleted file mode 100644 index 47c233472..000000000 --- a/clusters/cl01tl/manifests/blocky/RedisReplication-redis-replication-blocky.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: redis.redis.opstreelabs.in/v1beta2 -kind: RedisReplication -metadata: - name: redis-replication-blocky - namespace: blocky - labels: - helm.sh/chart: redis-replication-1.0.4 - app.kubernetes.io/version: "1.0.4" - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: redis-replication-blocky - app.kubernetes.io/instance: blocky - app.kubernetes.io/part-of: blocky -spec: - clusterSize: 1 - podSecurityContext: - fsGroup: 1000 - runAsUser: 1000 - kubernetesConfig: - image: "quay.io/opstree/redis:v8.4.0" - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 10m - memory: 32Mi - storage: - volumeClaimTemplate: - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 1Gi - storageClassName: ceph-block - redisExporter: - enabled: true - image: "quay.io/opstree/redis-exporter:v1.80.2" diff --git a/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-headless.yaml b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-headless.yaml new file mode 100644 index 000000000..cb80c52b4 --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-headless.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Service +metadata: + name: blocky-valkey-headless + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: headless +spec: + type: ClusterIP + clusterIP: None + publishNotReadyAddresses: true + ports: + - name: tcp + port: 6379 + targetPort: tcp + protocol: TCP + selector: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky diff --git a/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-metrics.yaml b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-metrics.yaml new file mode 100644 index 000000000..7f4a7bd9e --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-metrics.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Service +metadata: + name: blocky-valkey-metrics + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: metrics + app.kubernetes.io/part-of: valkey + annotations: +spec: + type: ClusterIP + ports: + - name: metrics + port: 9121 + protocol: TCP + targetPort: metrics + selector: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky diff --git a/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-read.yaml b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-read.yaml new file mode 100644 index 000000000..9f76c0c7e --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey-read.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: Service +metadata: + name: blocky-valkey-read + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: read +spec: + type: ClusterIP + ports: + - name: tcp + port: 6379 + targetPort: tcp + protocol: TCP + selector: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky diff --git a/clusters/cl01tl/manifests/blocky/Service-blocky-valkey.yaml b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey.yaml new file mode 100644 index 000000000..981739fc6 --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/Service-blocky-valkey.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Service +metadata: + name: blocky-valkey + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: primary +spec: + type: ClusterIP + ports: + - port: 6379 + targetPort: tcp + protocol: TCP + name: tcp + selector: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + statefulset.kubernetes.io/pod-name: blocky-valkey-0 diff --git a/clusters/cl01tl/manifests/blocky/ServiceAccount-blocky-valkey.yaml b/clusters/cl01tl/manifests/blocky/ServiceAccount-blocky-valkey.yaml new file mode 100644 index 000000000..ff779194d --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/ServiceAccount-blocky-valkey.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: blocky-valkey + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm +automountServiceAccountToken: false diff --git a/clusters/cl01tl/manifests/blocky/ServiceMonitor-blocky-valkey.yaml b/clusters/cl01tl/manifests/blocky/ServiceMonitor-blocky-valkey.yaml new file mode 100644 index 000000000..63d8682df --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/ServiceMonitor-blocky-valkey.yaml @@ -0,0 +1,24 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: blocky-valkey + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: valkey + app.kubernetes.io/component: service-monitor +spec: + endpoints: + - port: metrics + interval: 30s + namespaceSelector: + matchNames: + - blocky + selector: + matchLabels: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/component: metrics diff --git a/clusters/cl01tl/manifests/blocky/ServiceMonitor-redis-replication-blocky.yaml b/clusters/cl01tl/manifests/blocky/ServiceMonitor-redis-replication-blocky.yaml deleted file mode 100644 index 5d450f9bf..000000000 --- a/clusters/cl01tl/manifests/blocky/ServiceMonitor-redis-replication-blocky.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: redis-replication-blocky - namespace: blocky - labels: - helm.sh/chart: redis-replication-1.0.4 - app.kubernetes.io/version: "1.0.4" - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: redis-replication-blocky - app.kubernetes.io/instance: blocky - app.kubernetes.io/part-of: blocky -spec: - selector: - matchLabels: - app: redis-replication-blocky - redis_setup_type: replication - role: replication - endpoints: - - port: redis-exporter - interval: 30s - scrapeTimeout: 10s diff --git a/clusters/cl01tl/manifests/blocky/StatefulSet-blocky-valkey.yaml b/clusters/cl01tl/manifests/blocky/StatefulSet-blocky-valkey.yaml new file mode 100644 index 000000000..89c18df2e --- /dev/null +++ b/clusters/cl01tl/manifests/blocky/StatefulSet-blocky-valkey.yaml @@ -0,0 +1,129 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: blocky-valkey + labels: + helm.sh/chart: valkey-0.9.3 + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + app.kubernetes.io/version: "9.0.3" + app.kubernetes.io/managed-by: Helm +spec: + serviceName: blocky-valkey-headless + replicas: 3 + podManagementPolicy: OrderedReady + selector: + matchLabels: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + volumeClaimTemplates: + - metadata: + name: valkey-data + spec: + accessModes: + - ReadWriteOnce + storageClassName: "ceph-block" + resources: + requests: + storage: "1Gi" + template: + metadata: + labels: + app.kubernetes.io/name: valkey + app.kubernetes.io/instance: blocky + annotations: + checksum/initconfig: "b997c0967aeeee370412add1d41691a1" + spec: + automountServiceAccountToken: false + serviceAccountName: blocky-valkey + securityContext: + fsGroup: 1000 + runAsGroup: 1000 + runAsUser: 1000 + initContainers: + - name: blocky-valkey-init + image: docker.io/valkey/valkey:9.0.3 + imagePullPolicy: IfNotPresent + securityContext: + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + command: ["/scripts/init.sh"] + env: + - name: POD_INDEX + valueFrom: + fieldRef: + fieldPath: metadata.labels['apps.kubernetes.io/pod-index'] + volumeMounts: + - name: valkey-data + mountPath: /data + - name: scripts + mountPath: /scripts + containers: + - name: blocky-valkey + image: docker.io/valkey/valkey:9.0.3 + imagePullPolicy: IfNotPresent + command: ["valkey-server"] + args: ["/data/conf/valkey.conf"] + securityContext: + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + env: + - name: POD_INDEX + valueFrom: + fieldRef: + fieldPath: metadata.labels['apps.kubernetes.io/pod-index'] + - name: VALKEY_LOGLEVEL + value: "notice" + ports: + - name: tcp + containerPort: 6379 + protocol: TCP + startupProbe: + exec: + command: ["sh", "-c", "valkey-cli ping"] + livenessProbe: + exec: + command: ["sh", "-c", "valkey-cli ping"] + resources: + requests: + cpu: 10m + memory: 128Mi + volumeMounts: + - name: valkey-data + mountPath: /data + - name: metrics + image: ghcr.io/oliver006/redis_exporter:v1.81.0 + imagePullPolicy: "IfNotPresent" + ports: + - name: metrics + containerPort: 9121 + startupProbe: + tcpSocket: + port: metrics + livenessProbe: + tcpSocket: + port: metrics + readinessProbe: + httpGet: + path: / + port: metrics + resources: + requests: + cpu: 10m + memory: 64M + env: + - name: REDIS_ALIAS + value: blocky-valkey + volumes: + - name: scripts + configMap: + name: blocky-valkey-init-scripts + defaultMode: 0555