From ff68c8cd24baef66ebb038d237b8f501c84edde5 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Fri, 6 Sep 2024 16:09:25 +0200 Subject: Add script and configuration for Kubernetes --- k8s/cas-config.yaml | 8 ++++++++ k8s/cas-deployment.yaml | 47 ++++++++++++++++++++++++++++++++++++++++++++ k8s/cas-secret.yaml | 8 ++++++++ k8s/cas-service.yaml | 11 +++++++++++ k8s/network-policy.yaml | 18 +++++++++++++++++ k8s/pgdata-pvc.yaml | 10 ++++++++++ k8s/postgres-deployment.yaml | 38 +++++++++++++++++++++++++++++++++++ k8s/postgres-service.yaml | 11 +++++++++++ release.sh | 10 ---------- scripts/k8s.yaml | 40 +++++++++++++++++++++++++++++++++++++ scripts/release.sh | 10 ++++++++++ 11 files changed, 201 insertions(+), 10 deletions(-) create mode 100644 k8s/cas-config.yaml create mode 100644 k8s/cas-deployment.yaml create mode 100644 k8s/cas-secret.yaml create mode 100644 k8s/cas-service.yaml create mode 100644 k8s/network-policy.yaml create mode 100644 k8s/pgdata-pvc.yaml create mode 100644 k8s/postgres-deployment.yaml create mode 100644 k8s/postgres-service.yaml delete mode 100755 release.sh create mode 100755 scripts/k8s.yaml create mode 100755 scripts/release.sh diff --git a/k8s/cas-config.yaml b/k8s/cas-config.yaml new file mode 100644 index 0000000..a7aa9d8 --- /dev/null +++ b/k8s/cas-config.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cas-config +data: + RUST_LOG: ${RUST_LOG} + DATABASE_URL: "postgres://postgres:password@postgres-service:5432/gis" + ALLOWED_HOST: "0.0.0.0:8000" diff --git a/k8s/cas-deployment.yaml b/k8s/cas-deployment.yaml new file mode 100644 index 0000000..f070fe4 --- /dev/null +++ b/k8s/cas-deployment.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cas-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: cas + template: + metadata: + labels: + app: cas + spec: + containers: + - name: cas + image: ghcr.io/cas-4/backend:latest + imagePullPolicy: Always + env: + - name: RUST_LOG + valueFrom: + configMapKeyRef: + name: cas-config + key: RUST_LOG + - name: DATABASE_URL + valueFrom: + configMapKeyRef: + name: cas-config + key: DATABASE_URL + - name: JWT_SECRET + valueFrom: + secretKeyRef: + name: cas-secret + key: JWT_SECRET + - name: EXPO_ACCESS_TOKEN + valueFrom: + secretKeyRef: + name: cas-secret + key: EXPO_ACCESS_TOKEN + - name: ALLOWED_HOST + valueFrom: + configMapKeyRef: + name: cas-config + key: ALLOWED_HOST + ports: + - containerPort: 8000 + restartPolicy: Always diff --git a/k8s/cas-secret.yaml b/k8s/cas-secret.yaml new file mode 100644 index 0000000..268c119 --- /dev/null +++ b/k8s/cas-secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: cas-secret +type: Opaque +data: + JWT_SECRET: ${JWT_SECRET} + EXPO_ACCESS_TOKEN: ${EXPO_ACCESS_TOKEN} diff --git a/k8s/cas-service.yaml b/k8s/cas-service.yaml new file mode 100644 index 0000000..98a7a9d --- /dev/null +++ b/k8s/cas-service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: cas-service +spec: + ports: + - port: 8000 + targetPort: 8000 + selector: + app: cas + type: ClusterIP diff --git a/k8s/network-policy.yaml b/k8s/network-policy.yaml new file mode 100644 index 0000000..2af8a27 --- /dev/null +++ b/k8s/network-policy.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: allow-cas-postgres +spec: + podSelector: + matchLabels: + app: cas + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: postgres + ports: + - protocol: TCP + port: 5432 diff --git a/k8s/pgdata-pvc.yaml b/k8s/pgdata-pvc.yaml new file mode 100644 index 0000000..7580530 --- /dev/null +++ b/k8s/pgdata-pvc.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pgdata-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/k8s/postgres-deployment.yaml b/k8s/postgres-deployment.yaml new file mode 100644 index 0000000..fd9945f --- /dev/null +++ b/k8s/postgres-deployment.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: postgis/postgis:16-3.4 + env: + - name: POSTGRES_USER + value: "postgres" + - name: POSTGRES_PASSWORD + value: "password" + - name: POSTGRES_DB + value: "gis" + ports: + - containerPort: 5432 + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: pgdata + - mountPath: /docker-entrypoint-initdb.d + name: schema + volumes: + - name: pgdata + persistentVolumeClaim: + claimName: pgdata-pvc + - name: schema + hostPath: + path: ${PGDATA} diff --git a/k8s/postgres-service.yaml b/k8s/postgres-service.yaml new file mode 100644 index 0000000..ad3b969 --- /dev/null +++ b/k8s/postgres-service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: postgres-service +spec: + ports: + - port: 5432 + targetPort: 5432 + selector: + app: postgres + type: ClusterIP diff --git a/release.sh b/release.sh deleted file mode 100755 index 9c513f4..0000000 --- a/release.sh +++ /dev/null @@ -1,10 +0,0 @@ -if [ $# -eq 0 ]; then - echo "You must pass the version number." - exit 1 -fi - -sed -i "3s/.*/version = \"$1\"/" Cargo.toml -cargo c -git add Cargo.* -git commit -m "release: version $1" -git tag -a "v$1" -m "Version $1" diff --git a/scripts/k8s.yaml b/scripts/k8s.yaml new file mode 100755 index 0000000..350a19a --- /dev/null +++ b/scripts/k8s.yaml @@ -0,0 +1,40 @@ +#!/bin/bash + +usage() { + echo "Usage: $0 (apply|delete)" +} + +if [ $# -ne 1 ]; then + usage + exit 1 +fi + +command=$1 + +if [ "$1" != "apply" ] && [ "$1" != "delete" ]; then + usage + exit 1 +fi + +K8S_FOLDER="../k8s" + +if [ "$(basename "$PWD")" = "backend" ]; then + K8S_FOLDER="./k8s" +fi + +YAML_FILES=( + "cas-config.yaml" + "cas-deployment.yaml" + "cas-secret.yaml" + "cas-service.yaml" + "network-policy.yaml" + "pgdata-pvc.yaml" + "postgres-deployment.yaml" + "postgres-service.yaml" +) + +for file in "${YAML_FILES[@]}"; do + file="$K8S_FOLDER/$file" + echo "${command^}ing $file ..." + envsubst < $file | kubectl "$command" -f - +done diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..9c513f4 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,10 @@ +if [ $# -eq 0 ]; then + echo "You must pass the version number." + exit 1 +fi + +sed -i "3s/.*/version = \"$1\"/" Cargo.toml +cargo c +git add Cargo.* +git commit -m "release: version $1" +git tag -a "v$1" -m "Version $1" -- cgit v1.2.3-18-g5258