Pada post kali ini saya akan membagikan cara membuat Server Web Frontend dengan persistent volume dan persistent claim yang disupport NFS, berikut referensinya.
Adapun sedikit penjelasan tentang persistent volume dan persistent volume-claim seperti berikut:
Persistent Volume merupakan Objek API untuk storage yang berguna untuk menyimpan data secara persistent. Awal mulanya si administrator provision storage cluster baik secara statis maupun dinamis (Storage Classes).
Selain itu PV meupakan plugin volume seperti volume pada umumnya, akan tetapi memiliki lifecycle independent pada setiap Pod yang menggunakan PV. Objek API capture detail implementasi storage tersebut seperti NFS, iSCI atau spesifik sistem storage provider cloud.
Sedangkan PVC (Persistent Volume Claim) merupakan storage yang direquest oleh user. Setelah administrator berhasil provison cluster storage (PV), selanjutnya user bisa request resource storage (CPU, Ram) agar dapat digunakan oleh Pod atau objek resource yang lainnya baik itu bersifat ReadWriteOnce, ReadOnlyMany or ReadWriteMany.
Untuk detail penjelasan mengenai PV dan PVC bisa melihat referensi officalnya berikut.
-
Pertamakali silakan buat direktori /data pada worker-node1. Namun, jika Anda belum provision kubernetes-cluster, bisa lihat post saya sebelumnya.
sudo mkdir /data
-
Selanjutnya buat file yaml untuk deploy NFS Server di master node:
apiVersion: v1
items:
- apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
name: nfs-server
name: nfs-server
spec:
progressDeadlineSeconds: 2147483647
replicas: 1
revisionHistoryLimit: 2147483647
selector:
matchLabels:
name: nfs-server
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
name: nfs-server
spec:
containers:
- image: k8s.gcr.io/volume-nfs:0.8
imagePullPolicy: IfNotPresent
name: nfs-server
ports:
- containerPort: 2049
name: nfs
protocol: TCP
- containerPort: 20048
name: mountd
protocol: TCP
- containerPort: 111
name: rpcbind
protocol: TCP
resources: {}
securityContext:
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /exports
name: mypvc
dnsPolicy: ClusterFirst
nodeSelector:
kubernetes.io/hostname: node0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /data
type: ""
name: mypvc
status: {}
- apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: nfs-server
spec:
ports:
- name: nfs
port: 2049
protocol: TCP
targetPort: 2049
- name: mountd
port: 20048
protocol: TCP
targetPort: 20048
- name: rpcbind
port: 111
protocol: TCP
targetPort: 111
selector:
name: nfs-server
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
kind: List
metadata: {}
Note: Ganti node0 dengan hostname workernode-1 Anda.
Deploy NFS Server dengan menjalankan perintah berikut ini:
kubectl create -f nfs-server.yaml
kubectl describe deployment nfs-server
kubectl describe services nfs-server`
Catat IP Cluster NFS Server Anda:
- Download file pv-nfs-server berikut dan edit, kemudian ganti dengan cluster IP NFS-Server Anda:
wget -c https://raw.githubusercontent.com/nolsatuid/labs/master/k9-adm/script/pv.yaml
vim pv.yaml
Deploy pv-nfs-server nya:
kubectl create -f pv.yaml
kubectl get pv
- Setelah deploy objek PV, selanjutnya deploy objek PVC-nya :
kubectl create -f https://raw.githubusercontent.com/nolsatuid/labs/master/k9-adm/script/pvc.yaml
kubectl get pvc
Install nfs-commin di setiap node:
sudo apt install -y nfs-common
- Setup app dengan menggunakan pvc, deploy Pod dengan contoh image nginx:
vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx-with-pvc
spec:
progressDeadlineSeconds: 2147483647
replicas: 1
revisionHistoryLimit: 2147483647
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: webserver
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /usr/share/nginx/html
name: webservercontent
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: webservercontent
persistentVolumeClaim:
claimName: nfs
status: {}
kubectl create -f nginx.yaml
- Create service nginx:
vim nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-server
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
selector:
app: nginx
kubectl create -f nginx-svc.yaml
- Langkah yang terakhir, ganti file index.html pada direktori /data di worker node.
sudo su
echo "This is index file from www.imron.my.id" > /data/index.html
Silakan test coba akses apps di node manapun dengan perintah sebagai berikut:
curl http://ip-masternode:[XXXXX]
Note: XXXXX adalah port service Nodeport nfs-server
Sekian dan terima kasih,
Selamat mencoba 🙂