Persist the VotingApp’s databases
By default, k3s comes with the default StorageClass named local-path which can be verified using the following command.
$ kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 1h4m
- In a file named pvc-redis.yaml, define the specification for a PersistentVolumeClaim with the following characteristics:
- name: redis
- ReadWriteOnce mode
- request for 1G storage
Then modify the redis Deployment specification by adding a volume based on this PersistentVolumeClaim, and use the volumeMounts instruction to ensure that the associated PersistentVolume is mounted in the /data directory of the redis container.
In a file named pvc-db.yaml containing the specification for a PersistentVolumeClaim with the following characteristics:
- name: db
- ReadWriteOnce mode
- request for 1G of storage
Then modify the db Deployment specification by adding a volume based on this PersistentVolumeClaim, and use the volumeMounts instruction to ensure that the associated PersistentVolume is mounted in the /var/lib/postgresql/data directory of the postgres container.
Deploy the application defined in these specifications and verify that it is working correctly.
List the PersistentVolumeClaim resources. What do you observe?
Delete the application.
Solution
- The specification to define the PersistentVolumeClaim named redis:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
The redis Deployment is modified as follows:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: redis
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis:7.0.8-alpine3.17
name: redis
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: redis
- The specification to define the PersistentVolumeClaim named db:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
The db Deployment is modified as follows:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: db
name: db
spec:
replicas: 1
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- image: postgres:15.1-alpine3.17
name: postgres
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: db
key: password
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
ports:
- containerPort: 5432
name: postgres
volumes:
- name: data
persistentVolumeClaim:
claimName: db
- Deploy the application using the following command from the manifests directory:
kubectl apply -f .
Using the IP address of one of the cluster nodes, you can access the vote and result interfaces via ports 31000 and 31001 respectively.
- You can list the PersistentVolumeClaim resources and observe that a PersistentVolume has been created for each of the 2 PVCs.
List of PersistentVolumeClaims:
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/redis Bound pvc-789e3c5c-4402-4b96-b09d-ee441e8ade1d 1Gi RWO local-path 39s
persistentvolumeclaim/db Bound pvc-75b9a32c-eab5-4452-a9b8-12d41dd74e7a 1Gi RWO local-path 39s
List of PersistentVolumes:
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-789e3c5c-4402-4b96-b09d-ee441e8ade1d 1Gi RWO Delete Bound default/redis local-path 32s
persistentvolume/pvc-75b9a32c-eab5-4452-a9b8-12d41dd74e7a 1Gi RWO Delete Bound default/db local-path 32s
- Delete the application using the following command from the manifests directory:
kubectl delete -f .