raw block volume EKS
Pastikan EBS CSI Driver sudah terinstall pada EKS. Jika belum silahkan ikuti tutorial berikut Belajar Cloud AWS – Menginstall EBS CSI Driver pada service EKS (Elastic Kubernetes Service).
Pendahuluan
Kali ini kita akan membuat sebuah volume di kubernetes (EKS) dengan tipe raw block volume melalui file konfigurasi .yaml.
Sebenarnya contohnya sudah ada disini Raw Block Volume, tapi saya akan bawakan sesuai versi saya sendiri disini.
Apa itu Raw Block Volume
Berdasarkan sumber dari sini, raw block volume adalah:
A block volume is a volume that will appear as a block device inside the container. A mounted (file) volume is volume that will be mounted using a specified file system and appear as a directory inside the container.
Intinya, raw block volume adalah sebuah volume yang langsung bisa diattach kedalam container sebagai block device, tanpa membuat filesystem disisi nodenya.
Berbeda jika dibandingkan dengan mounted volume yang harus dibuat filesystemnya terlebih dahulu disisi nodenya, baru kemudian dimount kedalam container.
Berikut perbedaan raw block volume dan mounted volume, saya ambil dari youtube:
Raw Block Volume
Mounted Volume (filesystem)
Prerequisite
Sebelum memulai, berikut prasyarat yang harus dipenuhi:
- Versi Kubernetes 1.13+ (CSI 1.0)
- aws-ebs-csi-driver yang sudah kita install pada tutorial sebelumnya
Install Raw Block Volume di EKS
Kita akan buat 3 file yaml:
- storage_class.yaml -> untuk class storagenya
- claim.yaml -> persistent volume claim
- pod.yaml -> pod yang akan connect ke volume EBS
Note: Ketiga file tersebut akan kita apply di namespace default
storage_class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
- Kita buat class storagenya dengan nama ebs-sc
- Binding modenya waitForFirstConsumer, artinya volume EBS akan dibuat jika consumer (pod) sudah dibuat
Apply storage classnya menggunakan command berikut:
$ kubectl apply -f storage_class.yaml
claim.yaml
Selanjutnya kita buat persistent volume claim
claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: block-claim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
storageClassName: ebs-sc
resources:
requests:
storage: 4Gi
- Kita beri nama pvcnya block-claim
- akses modenya read write once
- volume modenya block (raw block volume)
- kaitkan pvc ke storage class melalui storageClassName: ebs-sc
- buat volume EBS sebesar 4Gi (4 GB)
Lalu apply claim.yaml
$ kubectl apply -f claim.yaml
Kita cek status persistent volume claim dengan
$ kubectl get pvc
Statusnya masih pending, karena belum ada pod yang dideploy. Step berikutnya kita akan deploy pod.
pod.yaml
Selanjutnya kita deploy sebuah pod
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: busybox
command: ["/bin/sh", "-c"]
args: ["tail -f /dev/null"]
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: block-claim
- Kita depoy pod dengan nama app dan image busybox
- command dan args diatas supaya mempertahakan container tetap up (running)
- raw block volume akan dimount ke dalam container dengan path /dev/xvda
- panggil raw block volume (claim.yaml) yang sudah kita buat, dengan claimName: block-claim
Lalu kita apply pod.yaml
$ kubectl apply -f pod.yaml
Cek pod jika sudah running
$ kubectl get pods
Sekarang kita cek volumenya di dashboard EC2 -> Elastic Block Store -> Volume.
Harusnya akan ada volume baru seperti ini
Note: Jika volume statusnya insufficient data, tunggu sekitar 5 menit karena volume perlu sync ke EKS.
Volume diatas sudah terattach otomatis ke salah satu instance / node dari EKS.
Testing Copy Data ke volume baru
Sekarang ke bagian podsnya, kita akan coba copy data ke volume baru tersebut.
Jalankan command berikut:
$ kubectl exec -it app -- dd if=/dev/zero of=/dev/xvda bs=1024k count=100
Penjelasan:
- Connect ke pods app menggunakan exec -it
- perintah dd untuk convert & copy file
- sumber filenya dari /dev/zero
- dicopy ke /dev/xvda yang merupakan volume baru yang dimounted
- bs=1024k buat file dengan ukuran 1MB
- count=100 dilooping sebanyak 100x
- akan tergenerate 100 file dengan total size: 100MB
Bagus, datanya sudah tergenerate ke volume baru tersebut sebesar 100.0MB
Cek /dev/xvda didalam pods
Kita akan login ke podnya untuk mengecek /dev/xvda
$ kubectl exec -it app sh
Lalu cek /dev/xvda dengan command ls -al
$ ls -al /dev/svda
Bisa dilihat /dev/xvda sudah termounted.
Note: Sayangnya kita tidak bisa melihat isi dari volume /dev/xvda tersebut, karena merupakan block device (raw block volume) yang tidak tergenerate sebagai filesystem.