From d3338da90a64481ea8657262d595d399310cda6d Mon Sep 17 00:00:00 2001 From: Vegard Hagen Date: Sun, 25 Aug 2024 23:58:06 +0200 Subject: [PATCH] feat(database): add cnpg for database management --- k8s/infra/database/application-set.yaml | 37 +++++++++++++++++++ k8s/infra/database/cnpg/kustomization.yaml | 15 ++++++++ k8s/infra/database/cnpg/ns.yaml | 4 ++ k8s/infra/database/cnpg/values.yaml | 0 k8s/infra/database/kustomization.yaml | 10 +++++ k8s/infra/database/ns.yaml | 4 ++ .../database/pg-cluster/cnpg-cluster.yaml | 10 +++++ .../database/pg-cluster/kustomization.yaml | 6 +++ k8s/infra/database/pg-single/cnpg-single.yaml | 17 +++++++++ .../database/pg-single/kustomization.yaml | 6 +++ k8s/infra/database/project.yaml | 18 +++++++++ k8s/infra/monitoring/application-set.yaml | 3 ++ .../kube-prometheus-stack.yaml | 2 +- tofu/kubernetes/bootstrap/volumes/README.md | 2 + .../volumes/proxmox-volume/config.tf | 2 +- tofu/kubernetes/main.tf | 4 ++ 16 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 k8s/infra/database/application-set.yaml create mode 100644 k8s/infra/database/cnpg/kustomization.yaml create mode 100644 k8s/infra/database/cnpg/ns.yaml create mode 100644 k8s/infra/database/cnpg/values.yaml create mode 100644 k8s/infra/database/kustomization.yaml create mode 100644 k8s/infra/database/ns.yaml create mode 100644 k8s/infra/database/pg-cluster/cnpg-cluster.yaml create mode 100644 k8s/infra/database/pg-cluster/kustomization.yaml create mode 100644 k8s/infra/database/pg-single/cnpg-single.yaml create mode 100644 k8s/infra/database/pg-single/kustomization.yaml create mode 100644 k8s/infra/database/project.yaml diff --git a/k8s/infra/database/application-set.yaml b/k8s/infra/database/application-set.yaml new file mode 100644 index 0000000..60b8db5 --- /dev/null +++ b/k8s/infra/database/application-set.yaml @@ -0,0 +1,37 @@ +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: database + namespace: argocd + labels: + dev.stonegarden: database +spec: + generators: + - git: + repoURL: https://github.com/vehagn/homelab + revision: HEAD + directories: + - path: k8s/infra/database/* + template: + metadata: + name: '{{ path.basename }}' + labels: + dev.stonegarden: controllers + spec: + project: database + source: + plugin: + name: kustomize-build-with-helm + repoURL: https://github.com/vehagn/homelab + targetRevision: HEAD + path: '{{ path }}' + destination: + name: in-cluster + namespace: argocd + syncPolicy: + automated: + selfHeal: true + prune: true + syncOptions: + - ApplyOutOfSyncOnly=true + - ServerSideApply=true diff --git a/k8s/infra/database/cnpg/kustomization.yaml b/k8s/infra/database/cnpg/kustomization.yaml new file mode 100644 index 0000000..edf51d8 --- /dev/null +++ b/k8s/infra/database/cnpg/kustomization.yaml @@ -0,0 +1,15 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: cnpg-system + +resources: + - ns.yaml + +helmCharts: + - name: cloudnative-pg + repo: https://cloudnative-pg.github.io/charts + releaseName: cnpg + namespace: cnpg-system + includeCRDs: true + version: 0.22.0 + valuesFile: values.yaml diff --git a/k8s/infra/database/cnpg/ns.yaml b/k8s/infra/database/cnpg/ns.yaml new file mode 100644 index 0000000..8deac4c --- /dev/null +++ b/k8s/infra/database/cnpg/ns.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: cnpg-system diff --git a/k8s/infra/database/cnpg/values.yaml b/k8s/infra/database/cnpg/values.yaml new file mode 100644 index 0000000..e69de29 diff --git a/k8s/infra/database/kustomization.yaml b/k8s/infra/database/kustomization.yaml new file mode 100644 index 0000000..fd49dc5 --- /dev/null +++ b/k8s/infra/database/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +commonLabels: + dev.stonegarden: auth + app.kubernetes.io/managed-by: argocd + +resources: + - ns.yaml + - project.yaml + - application-set.yaml diff --git a/k8s/infra/database/ns.yaml b/k8s/infra/database/ns.yaml new file mode 100644 index 0000000..f3f8717 --- /dev/null +++ b/k8s/infra/database/ns.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: cnpg-database diff --git a/k8s/infra/database/pg-cluster/cnpg-cluster.yaml b/k8s/infra/database/pg-cluster/cnpg-cluster.yaml new file mode 100644 index 0000000..6fcfb93 --- /dev/null +++ b/k8s/infra/database/pg-cluster/cnpg-cluster.yaml @@ -0,0 +1,10 @@ +apiVersion: postgresql.cnpg.io/v1 +kind: Cluster +metadata: + name: cluster-example + namespace: cnpg-database +spec: + instances: 3 + storage: + storageClass: proxmox-csi + size: 4G diff --git a/k8s/infra/database/pg-cluster/kustomization.yaml b/k8s/infra/database/pg-cluster/kustomization.yaml new file mode 100644 index 0000000..85637e9 --- /dev/null +++ b/k8s/infra/database/pg-cluster/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: cnpg-database + +resources: + - cnpg-cluster.yaml diff --git a/k8s/infra/database/pg-single/cnpg-single.yaml b/k8s/infra/database/pg-single/cnpg-single.yaml new file mode 100644 index 0000000..eb3b386 --- /dev/null +++ b/k8s/infra/database/pg-single/cnpg-single.yaml @@ -0,0 +1,17 @@ +apiVersion: postgresql.cnpg.io/v1 +kind: Cluster +metadata: + name: single-example + namespace: cnpg-database +spec: + instances: 1 + affinity: + nodeSelector: + topology.kubernetes.io/zone: euclid + storage: + size: 4G + pvcTemplate: + storageClassName: proxmox-csi + volumeName: pv-single-database + accessModes: + - ReadWriteOnce diff --git a/k8s/infra/database/pg-single/kustomization.yaml b/k8s/infra/database/pg-single/kustomization.yaml new file mode 100644 index 0000000..02233fc --- /dev/null +++ b/k8s/infra/database/pg-single/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: cnpg-database + +resources: + - cnpg-single.yaml diff --git a/k8s/infra/database/project.yaml b/k8s/infra/database/project.yaml new file mode 100644 index 0000000..aee0aa3 --- /dev/null +++ b/k8s/infra/database/project.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: AppProject +metadata: + name: database + namespace: argocd +spec: + sourceRepos: + - 'https://github.com/vehagn/homelab' + destinations: + - namespace: 'argocd' + server: '*' + - namespace: 'cnpg-database' + server: '*' + - namespace: 'cnpg-system' + server: '*' + clusterResourceWhitelist: + - group: '*' + kind: '*' diff --git a/k8s/infra/monitoring/application-set.yaml b/k8s/infra/monitoring/application-set.yaml index 91ba5de..f65d333 100644 --- a/k8s/infra/monitoring/application-set.yaml +++ b/k8s/infra/monitoring/application-set.yaml @@ -32,3 +32,6 @@ spec: automated: selfHeal: true prune: true + syncOptions: + - ApplyOutOfSyncOnly=true + - ServerSideApply=true diff --git a/k8s/infra/monitoring/prometheus-stack/kube-prometheus-stack.yaml b/k8s/infra/monitoring/prometheus-stack/kube-prometheus-stack.yaml index 399cb1a..f979067 100644 --- a/k8s/infra/monitoring/prometheus-stack/kube-prometheus-stack.yaml +++ b/k8s/infra/monitoring/prometheus-stack/kube-prometheus-stack.yaml @@ -26,4 +26,4 @@ spec: prune: true syncOptions: - ApplyOutOfSyncOnly=true - - ServerSideApply=true \ No newline at end of file + - ServerSideApply=true diff --git a/tofu/kubernetes/bootstrap/volumes/README.md b/tofu/kubernetes/bootstrap/volumes/README.md index 95f567f..f7c3678 100644 --- a/tofu/kubernetes/bootstrap/volumes/README.md +++ b/tofu/kubernetes/bootstrap/volumes/README.md @@ -29,6 +29,7 @@ tofu state rm "module.volumes.module.proxmox-volume[\"pv-qbittorrent-config\"].r tofu state rm 'module.volumes.module.proxmox-volume["pv-keycloak"].restapi_object.proxmox-volume' tofu state rm 'module.volumes.module.proxmox-volume["pv-netbird-management"].restapi_object.proxmox-volume' tofu state rm 'module.volumes.module.proxmox-volume["pv-netbird-signal"].restapi_object.proxmox-volume' +tofu state rm 'module.volumes.module.proxmox-volume["pv-database"].restapi_object.proxmox-volume' ``` ## import proxmox volume @@ -46,6 +47,7 @@ tofu import 'module.volumes.module.proxmox-volume["pv-radarr-config"].restapi_ob tofu import 'module.volumes.module.proxmox-volume["pv-remark42"].restapi_object.proxmox-volume' /api2/json/nodes/euclid/storage/local-zfs/content/local-zfs:vm-9999-pv-remark42 tofu import 'module.volumes.module.proxmox-volume["pv-sonarr-config"].restapi_object.proxmox-volume' /api2/json/nodes/cantor/storage/local-zfs/content/local-zfs:vm-9999-pv-sonarr-config tofu import 'module.volumes.module.proxmox-volume["pv-torrent-config"].restapi_object.proxmox-volume' /api2/json/nodes/euclid/storage/local-zfs/content/local-zfs:vm-9999-pv-torrent-config +tofu import 'module.volumes.module.proxmox-volume["pv-database"].restapi_object.proxmox-volume' /api2/json/nodes/euclid/storage/local-zfs/content/local-zfs:vm-9999-pv-database ``` ## import persistent volume diff --git a/tofu/kubernetes/bootstrap/volumes/proxmox-volume/config.tf b/tofu/kubernetes/bootstrap/volumes/proxmox-volume/config.tf index 3414276..e095ad1 100644 --- a/tofu/kubernetes/bootstrap/volumes/proxmox-volume/config.tf +++ b/tofu/kubernetes/bootstrap/volumes/proxmox-volume/config.tf @@ -17,7 +17,7 @@ resource "restapi_object" "proxmox-volume" { }) lifecycle { - prevent_destroy = true + prevent_destroy = false } } diff --git a/tofu/kubernetes/main.tf b/tofu/kubernetes/main.tf index 0fcb71e..ff10114 100644 --- a/tofu/kubernetes/main.tf +++ b/tofu/kubernetes/main.tf @@ -152,5 +152,9 @@ module "volumes" { node = "abel" size = "10G" } + pv-single-database = { + node = "euclid" + size = "4G" + } } }