From 7c4a86d7bb2b769b613d341169aab14f6af79402 Mon Sep 17 00:00:00 2001 From: marcel-dempers Date: Thu, 25 Jun 2020 18:12:37 +1000 Subject: [PATCH] add pv files --- .../persistentvolume/persistentvolume.yaml | 16 ++++ .../persistentvolumeclaim.yaml | 11 +++ .../persistentvolume/postgres-no-pv.yaml | 50 ++++++++++++ .../persistentvolume/postgres-with-pv.yaml | 57 ++++++++++++++ kubernetes/persistentvolume/readme.md | 77 +++++++++++++++++++ 5 files changed, 211 insertions(+) create mode 100644 kubernetes/persistentvolume/persistentvolume.yaml create mode 100644 kubernetes/persistentvolume/persistentvolumeclaim.yaml create mode 100644 kubernetes/persistentvolume/postgres-no-pv.yaml create mode 100644 kubernetes/persistentvolume/postgres-with-pv.yaml create mode 100644 kubernetes/persistentvolume/readme.md diff --git a/kubernetes/persistentvolume/persistentvolume.yaml b/kubernetes/persistentvolume/persistentvolume.yaml new file mode 100644 index 0000000..3ad1267 --- /dev/null +++ b/kubernetes/persistentvolume/persistentvolume.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: example-volume + labels: + type: local +spec: + #we use local node storage here! + #kubectl get storageclass + storageClassName: hostpath + capacity: + storage: 1Gi + accessModes: + - ReadWriteOnce + hostPath: + path: "/mnt/data" \ No newline at end of file diff --git a/kubernetes/persistentvolume/persistentvolumeclaim.yaml b/kubernetes/persistentvolume/persistentvolumeclaim.yaml new file mode 100644 index 0000000..3686f13 --- /dev/null +++ b/kubernetes/persistentvolume/persistentvolumeclaim.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: example-claim +spec: + storageClassName: hostpath + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Mi \ No newline at end of file diff --git a/kubernetes/persistentvolume/postgres-no-pv.yaml b/kubernetes/persistentvolume/postgres-no-pv.yaml new file mode 100644 index 0000000..f696553 --- /dev/null +++ b/kubernetes/persistentvolume/postgres-no-pv.yaml @@ -0,0 +1,50 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: postgres-config + labels: + app: postgres +data: + POSTGRES_DB: postgresdb + POSTGRES_USER: admin + POSTGRES_PASSWORD: admin123 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: postgres +spec: + serviceName: postgres + selector: + matchLabels: + app: postgres + replicas: 1 + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: postgres:10.4 + imagePullPolicy: "IfNotPresent" + ports: + - containerPort: 5432 + envFrom: + - configMapRef: + name: postgres-config +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres + labels: + app: postgres +spec: + selector: + app: postgres + ports: + - protocol: TCP + name: http + port: 5432 + targetPort: 5432 \ No newline at end of file diff --git a/kubernetes/persistentvolume/postgres-with-pv.yaml b/kubernetes/persistentvolume/postgres-with-pv.yaml new file mode 100644 index 0000000..ab5e28f --- /dev/null +++ b/kubernetes/persistentvolume/postgres-with-pv.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: postgres-config + labels: + app: postgres +data: + POSTGRES_DB: postgresdb + POSTGRES_USER: admin + POSTGRES_PASSWORD: admin123 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: postgres +spec: + serviceName: postgres + selector: + matchLabels: + app: postgres + replicas: 1 + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: postgres:10.4 + imagePullPolicy: "IfNotPresent" + ports: + - containerPort: 5432 + envFrom: + - configMapRef: + name: postgres-config + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumes: + - name: data + persistentVolumeClaim: + claimName: example-claim +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres + labels: + app: postgres +spec: + selector: + app: postgres + ports: + - protocol: TCP + name: http + port: 5432 + targetPort: 5432 \ No newline at end of file diff --git a/kubernetes/persistentvolume/readme.md b/kubernetes/persistentvolume/readme.md new file mode 100644 index 0000000..287c440 --- /dev/null +++ b/kubernetes/persistentvolume/readme.md @@ -0,0 +1,77 @@ +# Persisted Volumes Demo + +## Container Storage + +By default containers store their data on the file system like any other process. +Container file system is temporary and not persisted during container restarts +When container is recreated, so is the file system + + + +``` +# run postgres +docker run -d --rm -e POSTGRES_DB=postgresdb -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=admin123 postgres:10.4 + +# enter the container +docker exec -it bash + +# login to postgres +psql --username=admin postgresdb + +#create a table +CREATE TABLE COMPANY( + ID INT PRIMARY KEY NOT NULL, + NAME TEXT NOT NULL, + AGE INT NOT NULL, + ADDRESS CHAR(50), + SALARY REAL +); + +#show table +\dt + +# quit +\q +``` + +Restarting the above container and going back in you will notice `\dt` commands returning no tables. +Since data is lost. + +Same can be demonstrated using Kubernetes + +``` +cd .\kubernetes\persistedvolumes\ + +kubectl create ns postgres +kubectl apply -n postgres -f ./postgres-no-pv.yaml +kubectl -n postgres get pods +kubectl -n postgres exec -it postgres-0 bash + +# run the same above mentioned commands to create and list the database table + +kubectl delete po -n postgres postgres-0 + +# exec back in and confirm table does not exist. +``` + +# Persist data Docker + +``` +docker volume create postges +docker run -d --rm -v postges:/var/lib/postgresql/data -e POSTGRES_DB=postgresdb -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=admin123 postgres:10.4 + +# run the same tests as above and notice +``` + +# Persist data Kubernetes + + +``` +kubectl apply -f persistedvolume.yaml +kubectl apply -n postgres -f persistedvolumeclaim.yaml + +kubectl apply -n postgres -f postgres-with-pv.yaml + +kubectl -n postgres get pods + +```