blob: bc087cf6b84193fb59cdffa2a346e34f0b26ab88 [file] [log] [blame]
Sergiusz Bazanski5f2dc852019-04-02 02:36:22 +02001# PostgreSQL on Kubernetes.
2
3local kube = import "kube.libsonnet";
4
5{
6 local postgres = self,
7 local cfg = postgres.cfg,
8 cfg:: {
9 namespace: error "namespace must be set",
10 appName: error "app name must be set",
11 storageClassName: "waw-hdd-redundant-1",
12 prefix: "", # if set, should be 'foo-'
13
14 image: "postgres:10.4",
15 database: error "database must be set",
16 username: error "username must be set",
17 # not literal, instead ref for env (like { secretKeyRef: ... })
18 password: error "password must be set",
19 },
20
21 makeName(suffix):: cfg.prefix + suffix,
22
23 metadata:: {
24 namespace: cfg.namespace,
25 labels: {
26 "app.kubernetes.io/name": cfg.appName,
27 "app.kubernetes.io/managed-by": "kubecfg",
28 "app.kubernetes.io/component": "postgres",
29 },
30 },
31
32 volumeClaim: kube.PersistentVolumeClaim(postgres.makeName("postgres")) {
33 metadata+: postgres.metadata,
34 spec+: {
35 storageClassName: cfg.storageClassName,
36 accessModes: [ "ReadWriteOnce" ],
37 resources: {
38 requests: {
39 storage: "30Gi",
40 },
41 },
42 },
43 },
44 deployment: kube.Deployment(postgres.makeName("postgres")) {
45 metadata+: postgres.metadata,
46 spec+: {
47 replicas: 1,
48 template+: {
49 spec+: {
50 volumes_: {
51 data: kube.PersistentVolumeClaimVolume(postgres.volumeClaim),
52 },
53 containers_: {
54 postgres: kube.Container(postgres.makeName("postgres")) {
55 image: cfg.image,
56 ports_: {
57 client: { containerPort: 5432 },
58 },
59 env_: {
60 POSTGRES_DB: cfg.database,
61 POSTGRES_USER: cfg.username,
62 POSTGRES_PASSWORD: cfg.password,
63 PGDATA: "/var/lib/postgresql/data/pgdata",
64 },
65 volumeMounts_: {
66 data: { mountPath: "/var/lib/postgresql/data" },
67 },
68 },
69 },
70 },
71 },
72 },
73 },
74 svc: kube.Service(postgres.makeName("postgres")) {
75 metadata+: postgres.metadata,
76 target_pod:: postgres.deployment.spec.template,
77 spec+: {
78 ports: [
79 { name: "client", port: 5432, targetPort: 5432, protocol: "TCP" },
80 ],
81 type: "ClusterIP",
82 },
83 },
84}