# Redis on Kubernetes. # For now, single instance (no redis-sentinel or redis-cluster) local kube = import "kube.libsonnet"; { local redis = self, local cfg = redis.cfg, cfg:: { namespace: error "namespace must be set", appName: error "appName must be set", prefix: "", # if set, should be 'foo-' # valid version tag for https://hub.docker.com/_/redis/ version: error "version must be set (to a valid docker hub tag, e.g. 5.0.4-alpine)", image: "redis:" + self.version, password: null, # Persist data to disk persistence: true, storageSize: "5Gi", storageClassName: error "storageClassName must be set", resources: { requests: { cpu: "50m", memory: "64Mi", }, limits: { cpu: "500m", memory: "256Mi", }, }, }, host:: redis.svc.host, makeName(suffix):: cfg.prefix + suffix, metadata:: { namespace: cfg.namespace, labels: { "app.kubernetes.io/name": cfg.appName, "app.kubernetes.io/managed-by": "kubecfg", "app.kubernetes.io/component": "redis", }, }, volumeClaim: kube.PersistentVolumeClaim(redis.makeName("redis")) { metadata+: redis.metadata, storage:: cfg.storageSize, storageClass:: cfg.storageClassName, }, deployment: kube.Deployment(redis.makeName("redis")) { metadata+: redis.metadata, spec+: { replicas: 1, template+: { spec+: { volumes_: { data: redis.volumeClaim.volume, }, containers_: { redis: kube.Container(redis.makeName("redis")) { image: cfg.image, args: [ "redis-server", ] + (if cfg.persistence then ["--appendonly", "yes"] else []) + (if cfg.password != null then ["--requirepass", "$(REDIS_PASSWORD)"] else []), ports_: { client: { containerPort: 6379 }, }, volumeMounts_: { data: { mountPath: "/data" }, }, env_: { [if cfg.password != null then "REDIS_PASSWORD"]: cfg.password, }, resources: cfg.resources, }, }, securityContext: { runAsUser: 100, runAsGroup: 101, fsGroup: 101, }, }, }, }, }, svc: kube.Service(redis.makeName("redis")) { metadata+: redis.metadata, target:: redis.deployment, }, }