ããã«ã¡ã¯ãNecoããã¸ã§ã¯ãã®æ± æ·»(@zoetro)ã§ãã
ä»åã¯ãKubernetesåãã«TopoLVMã¨ããCSI (Container Storage Interface) ãã©ã°ã¤ã³ãéçºããã®ã§ç´¹ä»ãããã¨æãã¾ãã TopoLVMã¯ä»¥ä¸ã®ãããªç¹å¾´ãæã£ã¦ãããKubernetesã§ãã¼ã«ã«ã¹ãã¬ã¼ã¸ãæå¹ã«å©ç¨ãããã¨ãã§ãã¾ãã
- LVM (Logical Volume Manager) ã«ããããªã¥ã¼ã 管ç
- ãããã¸ã¼ãèæ ®ãããã¤ãããã¯ãããã¸ã§ãã³ã°
- ãã¼ãã®ç©ºã容éã«å¿ããã¹ã±ã¸ã¥ã¼ãªã³ã°
æ¬è¨äºã§ã¯ãCSIãã©ã°ã¤ã³ãèªä½ããã«è³ã£ãçµç·¯ã¨TopoLVMã®ç¹å¾´ã®ç´¹ä»ãElasticsearchã®ã¹ãã¬ã¼ã¸ã¨ãã¦å©ç¨ããä¾ãç´¹ä»ãã¾ãã
ã¹ãã¬ã¼ã¸ã¸ã®åãçµã¿
Kubernetesã§ã¹ãã¬ã¼ã¸ãæ±ããã¨ã¯é£ããã¨ããè¨ããã¦ãã¾ãããããå®éã®ã¨ããã ãKubernetesã®ã¹ãã¬ã¼ã¸ãé£ããã®ã§ã¯ãªããã¹ãã¬ã¼ã¸ãé£ããã®ã ã ã¨è¨ãããããã«ãã©ã®ãããªãã©ãããã©ã¼ã ã§ãã£ã¦ãã¹ãã¬ã¼ã¸ãæ±ããã¨ã¯é£ããã®ã§ãã
幸ããªãã¨ã«ãæè¿ã®Kubernetesã§ã¯ã¹ãã¬ã¼ã¸ã«é¢ããæ©è½è¿½å ãæ´»çºã«ãããªããã¦ãã¾ãã ç¹ã«CSI(Container Storage Interface)ãã©ã°ã¤ã³ã¨å¼ã°ããä»çµã¿ãKubernetes 1.13ããGA(General Availability)ã¨ãªã£ããã¨ã大ããã§ããã
CSIã¨ã¯ãKubernetesãªã©ã®ã³ã³ãããªã¼ã±ã¹ãã¬ã¼ã·ã§ã³ã·ã¹ãã ã«ããã¦ãã³ã³ããããä»»æã®ã¹ãã¬ã¼ã¸ãå©ç¨ããããã®æ¨æºåãããä»çµã¿ã§ãã CSIãå©ç¨ãããã¨ã§ãKubernetesã®ã½ã¼ã¹ã³ã¼ãã夿´ãããã¨ãªããKubernetesã«ä»»æã®ã¹ãã¬ã¼ã¸ã·ã¹ãã ãçµã¿è¾¼ããã¨ãç°¡åã«ã§ããããã«ãªãã¾ããã
ãã¦ãã¹ãã¬ã¼ã¸ã¨ä¸å£ã«è¨ã£ã¦ããæ§ã ãªã¿ã¤ãã®ã¹ãã¬ã¼ã¸ãåå¨ãã¾ãã æã ã¯ç¾å¨ã®ã¨ãããKubernetesä¸ã§ä»¥ä¸ã®ãããªã¹ãã¬ã¼ã¸ãæ±ããããã«ãããã¨ãã¦ãã¾ãã
- é«éãªãã¼ã«ã«ã¹ãã¬ã¼ã¸
- ã¯ã¼ã«ã¼ãã¼ãã®ãã¼ã«ã«ã¹ãã¬ã¼ã¸ãKubernetesã®PersistentVolumeã¨ãã¦æ±ã
- NVMe SSDã®æ§è½ãæ´»ããã¦ã Elasticsearch ã MySQL ãªã©é«IOPSãå¿ è¦ãªããã«ã¦ã§ã¢ã®ã¹ãã¬ã¼ã¸ã¨ãã¦å©ç¨
- å¯ç¨æ§ã¯ããã«ã¦ã§ã¢ã®ã¬ããªã±ã¼ã·ã§ã³ã§æ ä¿ãã
- é«å¯ç¨ãããã¯ã¼ã¯ã¹ãã¬ã¼ã¸
- ãããã¯ã¼ã¯çµç±ã§å©ç¨å¯è½ãªã¹ãã¬ã¼ã¸ãKubernetesã®PersistentVolumeã¨ãã¦æ±ã
- ã¹ãã¼ããã«ãªã¢ããªã±ã¼ã·ã§ã³ã®æ°¸ç¶åããªã¥ã¼ã ã¨ãã¦å©ç¨
- 大容éãªåæ£ãªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸
- ãããã¯ã¼ã¯çµç±ã§å©ç¨å¯è½ãªã¹ãã¬ã¼ã¸ãAmazon S3äºæã®APIçµç±ã§æ±ã
- ææ¸ãç»åãåç»ãªã©ã®å¤§å®¹éãã¼ã¿ãä¿å
ã2. é«å¯ç¨ãããã¯ã¼ã¯ã¹ãã¬ã¼ã¸ãã¨ã3. 忣ãªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸ãã«ã¤ãã¦ã¯ãCeph/Rookãå©ç¨ããäºå®ã§ãã
ä»åç´¹ä»ããTopoLVMã¯ãã1. é«éãªãã¼ã«ã«ã¹ãã¬ã¼ã¸ããå®ç¾ããããã«éçºããã½ããã¦ã§ã¢ã§ãã
Kubernetesã®ãã¼ã«ã«ã¹ãã¬ã¼ã¸äºæ
Kubernetesã§ãã¼ã«ã«ã¹ãã¬ã¼ã¸ãæ±ãããã®ä»çµã¿ã¯ããã¤ãç¨æããã¦ãã¾ãã ä¾ãã°ãhostPath PersistentVolumeã¯ããã¼ã«ã«ã¹ãã¬ã¼ã¸ã®ãã¹ãæå®ãã¦Podãããã¦ã³ããããã¨ãã§ããä»çµã¿ã§ãã ããããhostPathã¯ãã«ããã¼ãã¯ã©ã¹ã¿ã«å¯¾å¿ãã¦ãããã主ã«ã·ã³ã°ã«ãã¼ãã¯ã©ã¹ã¿ã§ãã¹ãç¨éã¨ãã¦ä½¿ãããã®ãã®ã§ãã
local PersistentVolumeãhostPathã¨åãããã«ãã¼ã«ã«ã¹ãã¬ã¼ã¸ã®ãã¹ãæå®ãã¦Podãããã¦ã³ããããã¨ãã§ãã¾ããnodeAffinityã«ããããªã¥ã¼ã ãé ç½®ãããã¼ããæå®ãããã¨ãã§ãã¾ãã ããããKubernetes 1.16æç¹ã§ã¯ Dynamic Provisioning ã«å¯¾å¿ãã¦ããªããããæåã§PersistentVolumeãªã½ã¼ã¹ã使ãããã¼ã«ã«ã¹ãã¬ã¼ã¸ã®æºåããã¦ããå¿ è¦ãããã¾ãã
hostPath ã local PersistentVolume ã¯ããã¹ãä¸ã®ãã£ã¬ã¯ããªããã¦ã³ããã¦å©ç¨ããåç´ãªãã®ã§ãã ãã®ãããè¤æ°ã®ãã¼ããã£ã¹ã¯ãSSDãæ±ã£ãããã¹ãã¬ã¼ã¸ã®ãµã¤ãºãã¢ã¯ã»ã¹æ¨©ãå¶éããããã«ã¯ä½ããã®ä»çµã¿ãå¿ è¦ã«ãªãã¾ãã
ãã®ãããªä»çµã¿ã¨ãã¦ã¯ããã¼ããæä¾å¯è½ãªã¹ãã¬ã¼ã¸ãããªã¥ã¼ã ã°ã«ã¼ãã¨ãã¦ã¾ã¨ããè«ççãªããªã¥ã¼ã ãåãåºãã¦æ±ãã LVM (Logical Volume Manager) ãã²ã¨ã¤ã®è§£æ±ºçã¨ãªãã§ãããã
Kubernetesåãã®LVMãå©ç¨ããCSIãã©ã°ã¤ã³ãæ¢ãã¦ã¿ãã¨ããã¤ãã®å®è£ ãè¦ã¤ããã¾ãã ãããã対å¿CSIã®ãã¼ã¸ã§ã³ãå¤ãã£ãããæã ãå¿ è¦ã¨ããæ©è½ãå®è£ ããã¦ããªãã£ãããã¾ããã
TopoLVMã®ç¹å¾´
ãªãã®ãªãä½ã£ã¦ãã¾ããã ã¨ãããã¨ã§ã以ä¸ã®ãããªç¹å¾´ãæã¤TopoLVMã¨ããCSIãã©ã°ã¤ã³ãéçºãã¾ããã
- LVM (Logical Volume Manager) ã«ããããªã¥ã¼ã 管ç
- ãããã¸ã¼ãèæ ®ãããã¤ãããã¯ãããã¸ã§ãã³ã°
- ãã¼ãã®ç©ºã容éã«å¿ããã¹ã±ã¸ã¥ã¼ãªã³ã°
ãããã®ç¹å¾´ã以ä¸ã«è§£èª¬ãã¦ããã¾ãã
LVM (Logical Volume Manager) ã«ããããªã¥ã¼ã 管ç
TopoLVMã§ã¯ãLVMãå©ç¨ãã¦ãã¼ã«ã«ã¹ãã¬ã¼ã¸ã®ç®¡çããããªãã¾ãã
ãµã¼ãã¼ãã¨ã«ç°ãªãå°æ°ã®HDDãSSDãæè¼ãã¦ããå ´åã§ãããããã1ã¤ã®VG(Volume Group)ã¨ãã¦æ±ããã¨ã«ãã管çãæ¥½ã«ãªãã¾ãã
Kubernetesããã®è¦æ±ã«å¿ãã¦ãVGããLV(Logical Volume)ãåãåºãã¦å©ç¨ãã¾ãã ãã®ã¨ããLVãã¨ã«ããªã¥ã¼ã ã®ãµã¤ãºãã¢ã¯ã»ã¹æ¨©éãrawãããã¯ã¨ãã¦å©ç¨ããã®ãããã¡ã¤ã«ã·ã¹ãã çµç±ã§å©ç¨ããã®ããªã©ãæå®ãããã¨ãã§ãã¾ãã
ãããã¸ã¼ãèæ ®ãããã¤ãããã¯ãããã¸ã§ãã³ã°
Kubernetesã§ã¯ããªã¥ã¼ã ãæ±ãããã«ãPersistentVolumeClaim(PVC)ã¨PersistentVolume(PV)ã¨ãã2種é¡ã®ãªã½ã¼ã¹ãç¨æãã¦ãã¾ãã PVã¯å ·ä½çãªããªã¥ã¼ã ã管çããããã®ãªã½ã¼ã¹ã§ãã¹ãã¬ã¼ã¸ã®ã¿ã¤ããå ´æããµã¤ãºãã¢ã¯ã»ã¹ã¢ã¼ããªã©ã®æ å ±ã管çãã¦ãã¾ãã 䏿¹ã®PVCã¯ãå©ç¨ãããããªã¥ã¼ã ã®è¦æ±ããããªãããã®ãªã½ã¼ã¹ã§ãããµã¤ãºãã¢ã¯ã»ã¹ã¢ã¼ããªã©å©ç¨ãããããªã¥ã¼ã ã®æ¡ä»¶ãæå®ã§ãã¾ãã
Podããã¯PVCãæå®ãã¦å©ç¨ãããããªã¥ã¼ã ã®è¦æ±ãåºãã¾ãã ããããã¨Kubernetesãæ¡ä»¶ã«ãããããé©åãªPVãPVCã«çµã³ã¤ããPodããããªã¥ã¼ã ãå©ç¨ã§ããããã«ãã¦ããã¾ãã ãã®ããã«Podãå ·ä½çãªããªã¥ã¼ã (PV)ã«ä¾åãããªããã¨ã§ãPodã®å¯æ¬æ§ãé«ãããã¨ãã§ãã¾ãã
ãã¤ãããã¯ãããã¸ã§ãã³ã°ã¨ã¯ãPVCã宣è¨ããã¨ãPVãäºåã«ç¨æãã¦ãããªãã¦ãåçã«PVããããã¸ã§ãã³ã°ãã¦ãããä»çµã¿ã§ãã TopoLVMã§ã¯PVCã宣è¨ãããã¨ãPVCã«æå®ããããµã¤ãºã®LV(LogicalVolume)ãåãåºããPVã¨ãã¦æ±ããããã«ãã¾ãã
ãã®ã¨ããåãåºããLVã¯ã©ã®ãã¼ãä¸ããã§ãã¢ã¯ã»ã¹ã§ããããã§ã¯ããã¾ããã ã¹ã±ã¸ã¥ã¼ã«ãããPodã¨åããã¼ãä¸ã«LVãåãåºãå¿ è¦ãããã¾ãã ãã®ããã«ãPodã®ä½ç½®ãèæ ®ãã¦Volumeã®ãããã¸ã§ãã³ã°ããããªããã¨ã Topology-Aware Volume Provisioning ã¨å¼ã³ã¾ãã
TopoLVM㯠Topology-Aware Volume Provisioning ã«å¯¾å¿ãã¦ãããPodã®ã¹ã±ã¸ã¥ã¼ã«ããããã¼ãä¸ã«ããªã¥ã¼ã ã使ããã¾ãã
ãã¼ãã®ç©ºã容éã«å¿ããã¹ã±ã¸ã¥ã¼ãªã³ã°
Topology-Aware Volume Provisioningã«ãããPodã®ã¹ã±ã¸ã¥ã¼ã«ããããã¼ãä¸ã«ããªã¥ã¼ã ã使ãããã¨èª¬æãã¾ããã ã§ã¯ãã®ã¨ããPodã¯ã©ã®ãã¼ãã«é ç½®ããã®ãããã§ããããï¼
Kubernetesã®ããã©ã«ãã®ã¹ã±ã¸ã¥ã¼ã©ã«ä»»ããã¨ãCPUãã¡ã¢ãªéãSelectorãAffinityãªã©ã®æ å ±ã«åºã¥ãã¦Podã®ãããã¤å ãæ±ºå®ããã¾ãã ãã®ãããã¹ãã¬ã¼ã¸ã®ç©ºãããªããã¼ãã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ããã¦ãã¾ãå¯è½æ§ãããã¾ãã ã¾ãã空ã容éãã®ãªã®ãªã®ãã¼ãã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ããã¦ãã¾ãã¨ããã®å¾ã«ããªã¥ã¼ã ã®ãªãµã¤ãºããããªããã¨ãé£ãããªã£ã¦ãã¾ãã¾ãã
Kubernetesã«ã¯Scheduler extenderã¨ããä»çµã¿ããããPodã®ã¹ã±ã¸ã¥ã¼ãªã³ã°ã¢ã«ã´ãªãºã ãæ¡å¼µãããã¨ãã§ãã¾ãã
TopoLVMã§ã¯Scheduler Extenderã«ãããã¹ã±ã¸ã¥ã¼ã©ã以ä¸ã®ããã«æ¡å¼µãã¦ãã¾ãã
- ãã£ã¹ã¯å®¹éä¸è¶³ãã¦ãããã¼ãã¯ã¹ã±ã¸ã¥ã¼ãªã³ã°å¯¾è±¡ããå¤ã
- 空ã容éãå¤ããã¼ãã»ã©ã¹ã±ã¸ã¥ã¼ãªã³ã°ã¹ã³ã¢ãé«ããªã
ããã«ãããTopoLVMã®ããªã¥ã¼ã ãå©ç¨ããPodã¯ãé©åãªãã¼ãã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ãããããã«ãªãã¾ãã
Elasticsearchã®ã¹ãã¬ã¼ã¸ã«TopoLVMãã¤ãã£ã¦ã¿ã
TopoLVMã®å©ç¨ä¾ã¨ãã¦ãElasticsearchã®ã¹ãã¬ã¼ã¸ã¨ãã¦å©ç¨ããæ¹æ³ãç´¹ä»ãã¾ãã
Kubernetesä¸ã«Elasticsearchãæ§ç¯ããã«ã¯ãElasticç¤¾ã®æä¾ãã¦ããECK(Elastic Cloud on Kubernetes)ãå©ç¨ãããã¨ãã§ãã¾ãã
ECKã§ã¯ãã¤ãããã¯ãããã¸ã§ãã³ã°ãå¯è½ãªã¹ãã¬ã¼ã¸ãã©ã°ã¤ã³ãæä¾ãã¦ããããã®ãã©ã°ã¤ã³ãå©ç¨ãããã¨ã§ãã¼ã«ã«ã¹ãã¬ã¼ã¸ãElasticsearchã®ã¹ãã¬ã¼ã¸ã¨ãã¦å©ç¨ãããã¨ãã§ãã¾ãã
ãããããã®local-volumeãã©ã°ã¤ã³ã§ã¯ãã¼ãã®ç©ºã容éã«å¿ããã¹ã±ã¸ã¥ã¼ãªã³ã°ã¯å®ç¾ã§ãã¾ãã*1ã
ããã§ãlocal-volumeãã©ã°ã¤ã³ã®ä»£ããã«TopoLVMãå©ç¨ãã¦ã¿ã¾ãããã
ãªããããã§ã¯ä¸è¨ã®ãã¼ã¸ã§ã³ãå©ç¨ãããã¨ã¨ãã¾ãã
- ECK: v1.0.0-beta.1
- TopoLVM: v0.2.0
ã¾ããkindã®Kubernetesã¯ã©ã¹ã¿ä¸ã«TopoLVMã®ãã¢ç°å¢ãæ§ç¯ãã¾ãã Dockerã®ã¤ã³ã¹ãã¼ã«ãããUbuntu 18.04ç°å¢ãç¨æããä¸è¨ã®ã³ãã³ããå®è¡ãã¦ãã ãã*2ã
$ git clone https://github.com/cybozu-go/topolvm.git $ cd topolvm/example $ make setup $ make run
次ã«ãECKãKuberntesã¯ã©ã¹ã¿ä¸ã«ãããã¤ãã¾ã*3ã
$ export KUBECONFIG=$(kind get kubeconfig-path) $ kubectl apply -f https://download.elastic.co/downloads/eck/1.0.0-beta1/all-in-one.yaml
ãã°ã表示ãã¦ECKãç«ã¡ä¸ããã¾ã§å°ãå¾ ã¡ã¾ãã
$ kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
次ã«ãElasticsearchããããã¤ããããã®ãããã§ã¹ããã¡ã¤ã«(elastcisearch.yaml)ãç¨æãã¾ãã
ããã§volumeClaimTemplates ãæå®ãããã¨ã§ãElasticsearchãå©ç¨ããã¹ãã¬ã¼ã¸ã夿´ãããã¨ãã§ãã¾ãã
storageClassNameãã£ã¼ã«ãã«topolvm-provisionerãæå®ããã¨ãTopoLVMã®ã¹ãã¬ã¼ã¸ãå©ç¨ããããã¨ã«ãªãã¾ãã
apiVersion: elasticsearch.k8s.elastic.co/v1beta1 kind: Elasticsearch metadata: name: quickstart spec: version: 7.4.2 nodeSets: - name: default count: 3 config: node.master: true node.data: true node.ingest: true node.store.allow_mmap: false volumeClaimTemplates: - metadata: name: elasticsearch-data spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: topolvm-provisioner
ã§ã¯ããã®ãããã§ã¹ããé©ç¨ãã¦Elasticsearchããããã¤ãã¦ã¿ã¾ãããã
$ kubectl apply -f elastcisearch.yaml
ãã°ããããã¨Elasticsearchãç«ã¡ä¸ãããå©ç¨å¯è½ãªç¶æ ã«ãªãã¾ãã
ä¸è¨ã®ã³ãã³ããå®è¡ããã¨ãElasticsearchã®åãã¼ãã«LV(Logical Volume)ãå²ãå½ã¦ããã¦ãããã¨ã確èªãããã¨ãã§ãã¾ãã
$ kubectl get pvc,pv NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/elasticsearch-data-quickstart-es-default-0 Bound pvc-01c8da19-c7f9-4702-b4bd-f9d027d91953 1Gi RWO topolvm-provisioner 20m persistentvolumeclaim/elasticsearch-data-quickstart-es-default-1 Bound pvc-37c45f53-5bfe-4b11-b1c9-498d2507edfb 1Gi RWO topolvm-provisioner 20m persistentvolumeclaim/elasticsearch-data-quickstart-es-default-2 Bound pvc-a382b88b-f164-4215-9625-1151868d5791 1Gi RWO topolvm-provisioner 20m NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/pvc-01c8da19-c7f9-4702-b4bd-f9d027d91953 1Gi RWO Delete Bound default/elasticsearch-data-quickstart-es-default-0 topolvm-provisioner 20m persistentvolume/pvc-37c45f53-5bfe-4b11-b1c9-498d2507edfb 1Gi RWO Delete Bound default/elasticsearch-data-quickstart-es-default-1 topolvm-provisioner 20m persistentvolume/pvc-a382b88b-f164-4215-9625-1151868d5791 1Gi RWO Delete Bound default/elasticsearch-data-quickstart-es-default-2 topolvm-provisioner 20m $ sudo lvscan ACTIVE '/dev/myvg/07fb3a9d-f8a1-4163-841a-ec41677205ae' [1.00 GiB] inherit ACTIVE '/dev/myvg/8b7bd0fd-5564-4d88-97ba-91b704fe9c55' [1.00 GiB] inherit ACTIVE '/dev/myvg/64ba3ca7-93fa-47ea-b9df-4cccb6c65ed4' [1.00 GiB] inherit
ã¾ã¨ã
ä»åã¯LVMãå©ç¨ããKubernetesåãã®ãã¼ã«ã«ã¹ãã¬ã¼ã¸ç¨CSIãã©ã°ã¤ã³ã«ã¤ãã¦ç´¹ä»ãã¾ããã
ç¾å¨ã®ã¨ãããã¹ãã¬ã¼ã¸ã®ç©ºã容éã ããã¿ã¦ã¹ã±ã¸ã¥ã¼ãªã³ã°ããããªã£ã¦ãã¾ãããå°æ¥çã«ã¯IOPSãèæ ®ããã¹ã±ã¸ã¥ã¼ãªã³ã°ããããªãããã¨èãã¦ãã¾ãã ã¾ããKubernetse 1.16ã§ã¯CSIã®ãªãµã¤ãºæ©è½ãå°å ¥ããã¾ãããTopoLVMã§ã¯ããã«å¯¾å¿ãã¦ããªã¼ããªãµã¤ãºæ©è½ãå®ç¾ãããã¨èãã¦ãã¾ãã
*1:仿§ã®æ¤è¨ã¯ãããªããã¦ããããã§ã: https://github.com/elastic/cloud-on-k8s/blob/79cded22fcae59fdeb7267aa5cf75efdc5b43418/docs/design/0007-local-volume-total-capacity.md
*2:åè: https://github.com/cybozu-go/topolvm/tree/master/example
*3:åè: https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html