State Persistence
Some of the scenario questions here are based on Kodekloud's CKAD course labs.
CKAD and CKA can have similar scenario questions. It is recommended to go through the CKA practice tests.
Shortcuts
First run the two commands below for shortcuts.
export do="--dry-run=client -o yaml"
export now="--force --grace-period=0"
Questions
-
Configure a volume to store the webapp logs (stored at /log/app.log) at /var/log/webapp on the host. Use the spec provided below.
-
Name: webapp
-
Image Name: kodekloud/event-simulator
-
Volume HostPath: /var/log/webapp
-
Volume Mount: /log
Answer
controlplane ~ ➜ k get poNAME READY STATUS RESTARTS AGEwebapp 1/1 Running 0 48scontrolplane ~ ➜ k exec -it webapp -- cat /log/app.log[2023-12-30 11:51:39,293] INFO in event-simulator: USER3 is viewing page3[2023-12-30 11:51:40,294] INFO in event-simulator: USER3 is viewing page3[2023-12-30 11:51:41,295] INFO in event-simulator: USER3 is viewing page3[2023-12-30 11:51:42,296] INFO in event-simulator: USER1 is viewing page1[2023-12-30 11:51:43,297] INFO in event-simulator: USER1 is viewing page2[2023-12-30 11:51:44,298] WARNING in event-simulator: USER5 Failed to Login as the account is locked due to MANY FAILED ATTEMPTS.Generate a YAML file first and then delete the pod.
controlplane ~ ➜ k get poNAME READY STATUS RESTARTS AGEwebapp 1/1 Running 0 4m54scontrolplane ~ ➜ k get po webapp -o yaml > webapp.ymlcontrolplane ~ ➜ ls -ltotal 4-rw-rw-rw- 1 root root 0 Dec 13 05:39 sample.yaml-rw-r--r-- 1 root root 2658 Dec 30 06:56 webapp.ymlcontrolplane ~ ➜ k delete po webapp $nowWarning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.pod "webapp" force deletedcontrolplane ~ ➜ k get poNo resources found in default namespace.Add the volume and volumemount in the YAML file. Follow K8S docs.
## webapp.ymlapiVersion: v1kind: Podmetadata:name: webappspec:containers:- name: event-simulatorimage: kodekloud/event-simulatorenv:- name: LOG_HANDLERSvalue: filevolumeMounts:- mountPath: /logname: log-volumevolumes:- name: log-volumehostPath:# directory location on hostpath: /var/log/webapp# this field is optionaltype: Directorycontrolplane ~ ➜ k apply -f webapp.ymlpod/webapp createdcontrolplane ~ ➜ k get poNAME READY STATUS RESTARTS AGEwebapp 1/1 Running 0 3s -
-
Create a Persistent Volume with the given specification.
-
Volume Name: pv-log
-
Storage: 100Mi
-
Access Modes: ReadWriteMany
-
Host Path: /pv/log
-
Reclaim Policy: Retain
Answer
## pv-log.yamlapiVersion: v1kind: PersistentVolumemetadata:name: pv-logspec:persistentVolumeReclaimPolicy: RetainaccessModes:- ReadWriteManycapacity:storage: 100MistorageClassName: ""hostPath:path: /pv/logcontrolplane ~ ➜ k apply -f pv-log.yamlpersistentvolume/pv-log createdcontrolplane ~ ➜ k get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-log 100Mi RWX Retain Available 2s -
-
Create a Persistent Volume Claim with the given specification.
-
Volume Name: claim-log-1
-
Storage Request: 50Mi
-
Access Modes: ReadWriteMany
Answer
## pvc-log.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: claim-log-1spec:accessModes:- ReadWriteManyresources:requests:storage: 50Micontrolplane ~ ➜ k apply -f pvc-log.yamlpersistentvolumeclaim/claim-log-1 createdcontrolplane ~ ➜ k get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-log 100Mi RWX Retain Bound default/claim-log-1 4m9scontrolplane ~ ➜ k get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEclaim-log-1 Bound pv-log 100Mi RWX 11s -
-
What is the Volume Binding Mode used for this storage class local-storage?
controlplane ~ ➜ k get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGElocal-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 9m44slocal-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 36sportworx-io-priority-high kubernetes.io/portworx-volume Delete Immediate false 36sAnswer
controlplane ~ ✖ k describe sc local-storageName: local-storageIsDefaultClass: NoAnnotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"local-storage"},"provisioner":"kubernetes.io/no-provisioner","volumeBindingMode":"WaitForFirstConsumer"}Provisioner: kubernetes.io/no-provisionerParameters: <none>AllowVolumeExpansion: <unset>MountOptions: <none>ReclaimPolicy: DeleteVolumeBindingMode: WaitForFirstConsumerEvents: <none> -
Create a new PersistentVolumeClaim by the name of local-pvc that should bind to the volume local-pv.
-
PVC: local-pvc
-
Correct Access Mode?
-
Correct StorageClass Used?
-
PVC requests volume size = 500Mi?
Answer
controlplane ~ ➜ k get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGElocal-pv 500Mi RWO Retain Available local-storage 19mcontrolplane ~ ➜ k describe pv local-pvName: local-pvLabels: <none>Annotations: <none>Finalizers: [kubernetes.io/pv-protection]StorageClass: local-storageStatus: AvailableClaim:Reclaim Policy: RetainAccess Modes: RWOVolumeMode: FilesystemCapacity: 500MiNode Affinity:Required Terms:Term 0: kubernetes.io/hostname in [controlplane]Message:Source:Type: LocalVolume (a persistent volume backed by local storage on a node)Path: /opt/vol1Events: <none>## local-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: local-pvcspec:accessModes:- ReadWriteOncevolumeMode: FilesystemstorageClassName: local-storageresources:requests:storage: 500Micontrolplane ~ ➜ k apply -f local-pvc.yamlpersistentvolumeclaim/local-pvc created -
-
Create a new pod called nginx with the image nginx:alpine. The Pod should make use of the PVC local-pvc and mount the volume at the path /var/www/html. The PV local-pv should be in a bound state.
controlplane ~ ➜ k get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGElocal-pv 500Mi RWO Retain Available local-storage 29mcontrolplane ~ ➜ k get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGElocal-pvc Pending local-storage 5m17sAnswer
controlplane ~ ➜ export do="--dry-run=client -o yaml"controlplane ~ ➜ export now="--force --grace-period 0"controlplane ~ ➜ k run nginx --image nginx:alpine $do > nginx.yaml## nginx.yamlapiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: nginxname: nginxspec:containers:- image: nginx:alpinename: nginxresources: {}volumeMounts:- mountPath: "/var/www/html"name: local-pvvolumes:- name: local-pvpersistentVolumeClaim:claimName: local-pvcstatus: {}controlplane ~ ➜ k apply -f nginx.yamlpod/nginx createdcontrolplane ~ ➜ k get poNAME READY STATUS RESTARTS AGEnginx 1/1 Running 0 6scontrolplane ~ ➜ k get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGElocal-pv 500Mi RWO Retain Bound default/local-pvc local-storage 31mcontrolplane ~ ➜ k get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGElocal-pvc Bound local-pv 500Mi RWO local-storage 7m16s -
Create a new Storage Class called delayed-volume-sc that makes use of the below specs:
-
provisioner: kubernetes.io/no-provisioner
-
volumeBindingMode: WaitForFirstConsumer
Answer
## delayed-volume-sc.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: delayed-volume-scannotations:storageclass.kubernetes.io/is-default-class: "false"provisioner: kubernetes.io/no-provisionervolumeBindingMode: WaitForFirstConsumercontrolplane ~ ➜ k apply -f delayed-volume-sc.yamlstorageclass.storage.k8s.io/delayed-volume-sc createdcontrolplane ~ ➜ k get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGElocal-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 45mlocal-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 35mportworx-io-priority-high kubernetes.io/portworx-volume Delete Immediate false 35mdelayed-volume-sc kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 3s -