最近、さくらVPS上にkubernetesを構築して、その上で開発を行うことが多くなってきています。さくらVPSなどでは、クラウドサービスにありがちな従量課金の部分がかからないので気兼ねなく開発しています。今回は、オンプレk8s上で開発する際につまりそうなhostPathを使ったDynamic Volume Provisioningを利用する方法についてご紹介します。

調べようと思ったきっかけ

GKEにデプロイする際に利用していたHelmチャットを実行したところ、下記のように利用できるpersistent volumesがないと言われてしまったPVCの状態がPendingのままになる現状が発生していました。

 kubectl describe pvc xxxx                                                                                                            Events:
  Type    Reason         Age                  From                         Message
  ----    ------         ----                 ----                         -------
  Normal  FailedBinding  4s (x23 over 5m24s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set

hostPathとは

hostPathは、kubernetes Node上の領域をコンテナにマッピングするプラグインです。セキュリティの観点で無効になっているケースが多いです。

hostPathを利用できるようにする

/etc/kubernetes/manifests/kube-controller-manager.yamlというファイルの起動パラメータに下記を追記します。この変更は、プロセスの再起動は不要で自動で反映されます


   - --enable-hostpath-provisioner=true

storageclassでhost-pathを利用できるようにする

$ cat k8s_hostpath/provisioner.yaml                                                                                                                                                          
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: standard
  annotations:
    storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/host-path

$ kubectl apply -f k8s_hostpath/   

ここまで行ってから再度helmを実行するとPVCの生成時にhost-pathを使ってPVが生成されました。無事解決。

まとめ

kubernetes on クラウドの場合は、クラウドがいい感じにやってくれていることも多いですね。たまにオンプレk8sを触ってみるのもいいですね。