blob: 0c87c2d81d19ff35c9ea7143d64c9a4a071489a3 [file] [log] [blame]
# 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,
},
}