blob: 0c87c2d81d19ff35c9ea7143d64c9a4a071489a3 [file] [log] [blame]
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +02001# Redis on Kubernetes.
2# For now, single instance (no redis-sentinel or redis-cluster)
3
4local kube = import "kube.libsonnet";
5
6{
7 local redis = self,
8 local cfg = redis.cfg,
9
10 cfg:: {
11 namespace: error "namespace must be set",
radexec11a812023-11-18 17:58:19 +010012 appName: error "appName must be set",
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020013 prefix: "", # if set, should be 'foo-'
radexec11a812023-11-18 17:58:19 +010014
15 # valid version tag for https://hub.docker.com/_/redis/
16 version: error "version must be set (to a valid docker hub tag, e.g. 5.0.4-alpine)",
17 image: "redis:" + self.version,
18
Piotr Dobrowolski89a1ee92020-10-10 19:44:14 +020019 password: null,
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020020
Piotr Dobrowolski529e1812021-02-13 19:44:37 +010021 # Persist data to disk
22 persistence: true,
radexec11a812023-11-18 17:58:19 +010023 storageSize: "5Gi",
24 storageClassName: error "storageClassName must be set",
Piotr Dobrowolski529e1812021-02-13 19:44:37 +010025
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020026 resources: {
radexec11a812023-11-18 17:58:19 +010027 requests: { cpu: "50m", memory: "64Mi", },
28 limits: { cpu: "500m", memory: "256Mi", },
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020029 },
30 },
31
radexec11a812023-11-18 17:58:19 +010032 host:: redis.svc.host,
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020033
34 makeName(suffix):: cfg.prefix + suffix,
35
36 metadata:: {
37 namespace: cfg.namespace,
38 labels: {
39 "app.kubernetes.io/name": cfg.appName,
40 "app.kubernetes.io/managed-by": "kubecfg",
41 "app.kubernetes.io/component": "redis",
42 },
43 },
44
45 volumeClaim: kube.PersistentVolumeClaim(redis.makeName("redis")) {
46 metadata+: redis.metadata,
radexec11a812023-11-18 17:58:19 +010047 storage:: cfg.storageSize,
radex36964dc2023-11-24 11:19:46 +010048 storageClass:: cfg.storageClassName,
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020049 },
radexec11a812023-11-18 17:58:19 +010050
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020051 deployment: kube.Deployment(redis.makeName("redis")) {
52 metadata+: redis.metadata,
53 spec+: {
54 replicas: 1,
55 template+: {
56 spec+: {
57 volumes_: {
radex4ffc64d2023-11-24 13:28:57 +010058 data: redis.volumeClaim.volume,
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020059 },
60 containers_: {
61 redis: kube.Container(redis.makeName("redis")) {
62 image: cfg.image,
63 args: [
64 "redis-server",
Piotr Dobrowolski529e1812021-02-13 19:44:37 +010065 ]
66 + (if cfg.persistence then ["--appendonly", "yes"] else [])
67 + (if cfg.password != null then ["--requirepass", "$(REDIS_PASSWORD)"] else []),
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020068 ports_: {
69 client: { containerPort: 6379 },
70 },
71 volumeMounts_: {
72 data: { mountPath: "/data" },
73 },
Piotr Dobrowolski89a1ee92020-10-10 19:44:14 +020074 env_: {
75 [if cfg.password != null then "REDIS_PASSWORD"]: cfg.password,
76 },
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020077 resources: cfg.resources,
78 },
79 },
Sergiusz Bazanskif8b4cd72020-02-15 12:39:35 +010080 securityContext: {
81 runAsUser: 100,
Piotr Dobrowolski2759eb72021-01-31 20:07:29 +010082 runAsGroup: 101,
83 fsGroup: 101,
Sergiusz Bazanskif8b4cd72020-02-15 12:39:35 +010084 },
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020085 },
86 },
87 },
88 },
radexec11a812023-11-18 17:58:19 +010089
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020090 svc: kube.Service(redis.makeName("redis")) {
91 metadata+: redis.metadata,
radex8b8f3872023-11-24 11:09:46 +010092 target:: redis.deployment,
Sergiusz Bazanski6916f7e2019-04-04 16:53:53 +020093 },
94}