app/toot: start implementing redis
diff --git a/kube/redis.libsonnet b/kube/redis.libsonnet
new file mode 100644
index 0000000..b90cb58
--- /dev/null
+++ b/kube/redis.libsonnet
@@ -0,0 +1,92 @@
+# 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 "app name must be set",
+ storageClassName: "waw-hdd-redundant-1",
+ prefix: "", # if set, should be 'foo-'
+
+ image: "redis:5.0.4-alpine",
+ resources: {
+ requests: {
+ cpu: "50m",
+ memory: "64Mi",
+ },
+ limits: {
+ cpu: "500m",
+ memory: "256Mi",
+ },
+ },
+ },
+
+
+ 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,
+ spec+: {
+ storageClassName: cfg.storageClassName,
+ accessModes: [ "ReadWriteOnce" ],
+ resources: {
+ requests: {
+ storage: "5Gi",
+ },
+ },
+ },
+ },
+ deployment: kube.Deployment(redis.makeName("redis")) {
+ metadata+: redis.metadata,
+ spec+: {
+ replicas: 1,
+ template+: {
+ spec+: {
+ volumes_: {
+ data: kube.PersistentVolumeClaimVolume(redis.volumeClaim),
+ },
+ containers_: {
+ redis: kube.Container(redis.makeName("redis")) {
+ image: cfg.image,
+ args: [
+ "redis-server",
+ "--appendonly", "yes",
+ ],
+ ports_: {
+ client: { containerPort: 6379 },
+ },
+ volumeMounts_: {
+ data: { mountPath: "/data" },
+ },
+ resources: cfg.resources,
+ },
+ },
+ },
+ },
+ },
+ },
+ svc: kube.Service(redis.makeName("redis")) {
+ metadata+: redis.metadata,
+ target_pod:: redis.deployment.spec.template,
+ spec+: {
+ ports: [
+ { name: "client", port: 6379, targetPort: 6379, protocol: "TCP" },
+ ],
+ type: "ClusterIP",
+ },
+ },
+}