Deploy Objek PV dan PVC di Kubernetes Cluster

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.

  1. Pertamakali silakan buat direktori /data pada worker-node1. Namun, jika Anda belum provision kubernetes-cluster, bisa lihat post saya sebelumnya.
    sudo mkdir /data

  2. 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:
enter image description here

  1. 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

enter image description here
Deploy pv-nfs-server nya:

kubectl create -f pv.yaml
kubectl get pv
  1. 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
  1. 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
  1. 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
  1. 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]

enter image description here

Note: XXXXX adalah port service Nodeport nfs-server

Sekian dan terima kasih,
Selamat mencoba 🙂

Verified by MonsterInsights