blob: 571fe7b399bb482e3c0fa96beede93638c8facc0 [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",
Sergiusz Bazanskid07861b2019-08-08 17:48:25 +020011 storageClassName: "waw-hdd-paranoid-2",
Sergiusz Bazanski5f2dc852019-04-02 02:36:22 +020012 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 },
Sergiusz Bazanskia2ee8652020-01-22 21:48:48 +010070 securityContext: {
71 runAsUser: 999,
72 },
Sergiusz Bazanski5f2dc852019-04-02 02:36:22 +020073 },
74 },
75 },
76 },
77 svc: kube.Service(postgres.makeName("postgres")) {
78 metadata+: postgres.metadata,
79 target_pod:: postgres.deployment.spec.template,
80 spec+: {
81 ports: [
82 { name: "client", port: 5432, targetPort: 5432, protocol: "TCP" },
83 ],
84 type: "ClusterIP",
85 },
86 },
87}