Introduction
Hi, I am Akshay Rao, will be starting a exercise series on k8s.
In this blog there will not explanation only problems and solutions.if you want explanation have a look at this series:-
https://dev.to/aksrao1998/series/24887
Pre-requisite
have minikube or kind running in the local machine.
Note:- k is alias for kubectl.
Let's Start
Problem 1
Create busybox pod with two containers, each one will have the image busybox and will run the 'sleep 3600' command. Make both containers mount an emptyDir at '/etc/foo'. Connect to the second busybox, write the first column of '/etc/passwd' file to '/etc/foo/passwd'. Connect to the first busybox and write '/etc/foo/passwd' file to standard output. Delete pod.
Solution
[k8s-ckad (⎈|minikube:mynamespace)]$ k run busybox --image=busybox --dry-run=client -o yaml > pod2.yaml
#edit the pod2.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: busybox
name: busybox
spec:
dnsPolicy: ClusterFirst
restartPolicy: Never
containers:
- image: busybox
name: busybox0
command: ["/bin/sh","-c","sleep 3600"]
volumeMounts:
- mountPath: /etc/foo
name: anyvolume
resources: {}
- image: busybox
name: busybox1
command: ["/bin/sh","-c","sleep 3600"]
volumeMounts:
- mountPath: /etc/foo
name: anyvolume
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
volumes:
- name: anyvolume
emptyDir: {}
status: {}
[k8s-ckad (⎈|minikube:mynamespace)]$ k create -f pod2.yaml
pod/busybox created
# login in container
[k8s-ckad (⎈|minikube:mynamespace)]$ k exec -it busybox -c busybox0 -- /bin/sh
/etc # cd /etc/foo/
/etc/foo # ls
/etc/foo # cat /etc/passwd
root:x:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/false
bin:x:2:2:bin:/bin:/bin/false
sys:x:3:3:sys:/dev:/bin/false
sync:x:4:100:sync:/bin:/bin/sync
mail:x:8:8:mail:/var/spool/mail:/bin/false
www-data:x:33:33:www-data:/var/www:/bin/false
operator:x:37:37:Operator:/var:/bin/false
nobody:x:65534:65534:nobody:/home:/bin/false
/etc/foo # cat /etc/passwd | awk '{print $1}' > /etc/foo/passwd
/etc/foo # ls
passwd
/etc/foo # cat passwd
root:x:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/false
bin:x:2:2:bin:/bin:/bin/false
sys:x:3:3:sys:/dev:/bin/false
sync:x:4:100:sync:/bin:/bin/sync
mail:x:8:8:mail:/var/spool/mail:/bin/false
www-data:x:33:33:www-data:/var/www:/bin/false
operator:x:37:37:Operator:/var:/bin/false
nobody:x:65534:65534:nobody:/home:/bin/false
/etc/foo #
# verify this is updated in the other container automatically
[k8s-ckad (⎈|minikube:mynamespace)]$ k exec -it busybox -c busybox1 -- /bin/sh
/ #
/ # cat /etc/foo/passwd
root:x:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/false
bin:x:2:2:bin:/bin:/bin/false
sys:x:3:3:sys:/dev:/bin/false
sync:x:4:100:sync:/bin:/bin/sync
mail:x:8:8:mail:/var/spool/mail:/bin/false
www-data:x:33:33:www-data:/var/www:/bin/false
operator:x:37:37:Operator:/var:/bin/false
nobody:x:65534:65534:nobody:/home:/bin/false
Problem 2
Create a PersistentVolume of 10Gi, called 'myvolume'. Make it have accessMode of 'ReadWriteOnce' and 'ReadWriteMany', storageClassName 'normal', mounted on hostPath '/etc/foo'. Save it on pv.yaml, add it to the cluster. Show the PersistentVolumes that exist on the cluster.
Solution
# create a file name pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: myvolume
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: normal
hostPath:
path: /etc/foo
# verify
[k8s-ckad (⎈|minikube:mynamespace)]$ k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
myvolume 10Gi RWO,RWX Recycle Available normal 32s
Problem 3
Create a PersistentVolumeClaim for this storage class, called 'mypvc', a request of 4Gi and an accessMode of ReadWriteOnce, with the storageClassName of normal, and save it on pvc.yaml. Create it on the cluster. Show the PersistentVolumeClaims of the cluster.
Solution
# create a pvc.yaml file
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: normal
# verify
[k8s-ckad (⎈|minikube:mynamespace)]$ k create -f pvc.yaml
persistentvolumeclaim/mypvc created
[k8s-ckad (⎈|minikube:mynamespace)]$ k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound myvolume 10Gi RWO,RWX normal 5s
Problem 3
- Create a busybox pod with command 'sleep 3600', save it on pod.yaml. Mount the PersistentVolumeClaim to '/etc/foo'. Connect to the 'busybox' pod, and copy the '/etc/passwd' file to '/etc/foo/passwd'.
- Create a second pod which is identical with the one you just created (you can easily do it by changing the 'name' property on pod.yaml). Connect to it and verify that '/etc/foo' contains the 'passwd' file. Delete pods to cleanup. Note: If you can't see the file from the second pod, can you figure out why? What would you do to fix that?
Solution
Part-1
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: busybox
name: busybox
spec:
dnsPolicy: ClusterFirst
restartPolicy: Never
containers:
- image: busybox
name: busybox0
command: ["/bin/sh","-c","sleep 3600"]
volumeMounts:
- mountPath: /etc/foo
name: anyvolume
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
volumes:
- name: anyvolume
persistentVolumeClaim:
claimName: mypvc
status: {}
[k8s-ckad (⎈|minikube:mynamespace)]$ k create -f pod.yaml
pod/busybox created
Copy the passwd file
[k8s-ckad (⎈|minikube:mynamespace)]$ k exec -it busybox -- /bin/sh
/ # cp /etc/passwd /etc/foo/
/ # ls /etc/foo
passwd
Part-2
# change the labels to busybox1
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: busybo1
name: busybox1
spec:
dnsPolicy: ClusterFirst
restartPolicy: Never
containers:
- image: busybox
name: busybox1
command: ["/bin/sh","-c","sleep 3600"]
volumeMounts:
- mountPath: /etc/foo
name: anyvolume
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
volumes:
- name: anyvolume
persistentVolumeClaim:
claimName: mypvc
status: {}
[k8s-ckad (⎈|minikube:mynamespace)]$ k create -f pod3.yaml
pod/busybox1 created
#verify
[k8s-ckad (⎈|minikube:mynamespace)]$ k exec -it busybox1 -- /bin/sh
/ #
/ # ls /etc/foo
passwd
/ #
# delete the resources
[k8s-ckad (⎈|minikube:mynamespace)]$ k delete po busybox
pod "busybox" deleted
[k8s-ckad (⎈|minikube:mynamespace)]$ k delete po busybox1
pod "busybox1" deleted
[k8s-ckad (⎈|minikube:mynamespace)]$ k delete pv myvolume
persistentvolume "myvolume" deleted
[k8s-ckad (⎈|minikube:mynamespace)]$ k delete pvc mypvc
persistentvolumeclaim "mypvc" deleted
Top comments (0)