【Kubernetes】Volumeとは(概要と代表的なプラグイン) | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

今回はkubernetes(以下k8s)のVolumeの概要と代表的なプラグインについてまとめる。

 

もくじ

1.Volumeとは ( Volumeとは(IT一般用語) / k8sにおけるVolumeとは )

2.Volumeをマウントするpodのマニフェスト基本形

3.代表的なVolumeプラグイン ( emptyDir / hostPath / secret / configMap / projected )

4.volumeMountsのオプション ( readOnly )

参考文献

 

■Volumeとは

◎Volumeとは(IT一般用語)

そもそもVolumeは、k8sの専門用語ではない。(知ってるよって方はごめんなさい、私は知らなかったw)

外部記憶装置の管理単位の1つであり、ひとつながりの連続した記憶領域のことをいう。

(参考:IT用語辞典

◎k8sにおけるVolumeとは

k8sにおいても、ひとまとまりの記憶領域をVolumeと呼ぶ。

記憶装置の管理単位という本来の意味よりも、「記憶領域」という意味合いで使われているように思う。

 

k8sではVolume(=記憶領域)があらかじめ用意されており、Worker Node上の任意のパスにマウントすることで、利用できるようになる。
k8sがもとから用意しているもののため、新規作成や、既存Volumeの削除はできない。(あくまでマウントしてどのように使うかの話。)

 

Volumeは抽象化され、podと疎結合なリソースとして定義されているため、

以降で取り上げるVolumeプラグインを用いて、Volume領域を利用することになる。

 

なお、プラグインは、k8s標準で利用できる仕組みの他、各種クラウドサービスと連携したものも多数ある。(クラウドサービス例:AWS、GCE、Azureなどなど)

クラウドサービス関連の詳しいことは、各種公式ページ等をググってほしい。

 

■Volumeをマウントするpodのマニフェスト基本形

どのVolumeプラグインを使うかによって、Volumeを利用するpodのマニフェストファイルは一部異なってくる。

しかし共通する部分もあるため、ここでは基本的な書き方を説明する。

apiVersion: v1

kind: Pod

metadata:

  name: sample-pod

spec:

  containers:

  - image: nginx: 1.14

    name: test-container

    volumeMounts:

    - name: test-volume

      mountPath: /cache

  volumes:

    - name: test-volume

      (プラグイン名): (Volumeの詳細。プラグインによって記述する内容が変わる)

 

赤字の部分が、Volume関連の情報を記述するところ。

spec.containers[].volumeMountsに、①Volume名(name)と、②Volumeをマウントしたい(Volumeの記憶内容を配置したい)ディレクトリパス(mountPath)を記述する。

 

また、spec.volumesに、①Volume名(name)と、②利用するVolumeプラグイン名を記述する。

②の部分に、Volume設定の詳細を記述していくことになるが、プラグインによって書く内容は異なる。

 

以下、代表的なVolumeプラグインの紹介と、podマニフェストの書き方を紹介する。

 

■代表的なVolumeプラグイン

◎emptyDir

pod間のデータ共有目的で利用する。

Podが削除されるとemptyDirの中身も削除され、永続化はできない

名前の通り「空っぽのディレクトリ」であり、あくまでも一時的なディスク領域であることに注意したい。

 

<マニフェストファイル(該当箇所のみ)例>

spec:

  containers:

    volumeMounts:

    - name: test-volume

      mountPath: /cache

  volumes:

    - name: test-volume

      emptyDir: {}

spec.volumes以下の、Vlolumeの詳細を書く部分は、シンプルに、

emptyDir: {}

と書けばOK。

 

◎hostPath

Worker Node上の任意の領域をマウントするプラグイン。

コンテナにWorker Nodeのディレクトリ情報を渡し、領域を利用することになるため、セキュリティ的に微妙な点もある。従って、どうしても利用しなければならない時以外は、積極的な利用は控えたほうが無難。

 

以下の利用目的の場合は、Worker Nodeのマウント先ディレクトリは、以下を指定する。

  • コンテナがDocker内部へアクセスする必要のある時: /var/lib/docker
  • コンテナでcAdvisorを利用する時: /sys

その他、Worker Nodeの任意の領域にマウントすることが可能。

 

<マニフェストファイル(該当箇所のみ)例>

spec:

  containers:

    volumeMounts:

    - name: test-volume

      mountPath: /srv

  volumes:

    - name: test-volume

      hostPath: 

        path: /etc

        type: DirectoryOrCreate

spec.volumes[].hostPath.pathは定義必須。ここでWorker Nodeのどこにマウントするかを指定する。

spec.volumes[].hostPath.typeはオプション定義。マウントの詳細設定を決めることができる。

例のDirectoryOreCreateを指定した場合は、ディレクトリにマウントし、もし指定したディレクトリが無かった場合はディレクトリ作成のうえマウントする設定になる。

 

その他定義できるtypeの詳細は、公式を参照のこと。

 

◎Secret

機密情報(パスワードやトークン、SSHキー等)を安全に保存しておくためのリソース。

Secretの概要および、Volumeとしてマウントするpodマニフェストファイル例など、詳しくは以下の記事参照。

https://ameblo.jp/bakery-diary/entry-12615574380.html

 

◎ConfigMap

Secretリソースを利用するほど機密ではないが、キー&バリュー形式の設定情報などを保管しておきたい時に使うリソース。

ConfigMapの概要および、Volumeとしてマウントするpodマニフェストファイル例など、詳しくは以下の記事参照。

https://ameblo.jp/bakery-diary/entry-12615300336.html

 

◎projected

Sercret、downwardAPI、ConfigMap、serviceAccountTokenのVolumeマウントを、1か所のディレクトリに集約するプラグイン。

ただし、利用するpodと各リソースは、同じネームスペース内に存在している必要がある。

 

<マニフェストファイル(該当箇所のみ)例>

  volumes:
  - name: all-in-one
    projected:
      sources:
      - downwardAPI:
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

spec.volumes[].projected.sources以下に、各Volumeの情報を記述していく。

それぞれのVolume情報は、Volumeで各プラグインを定義する時に書く内容と同じである。

 

■volumeMountsのオプション

◎ReadOnlyオプション

名前の通り、Volumeをマウントした領域のファイルの読み込みしかできないようにするオプション。

とくにhostPathプラグインで、コンテナに対してホスト(Worker Node)内の領域を見せなければならない等など、誤った書き込みや削除等による事故防止・セキュリティ向上のために、

つけておいたほうが無難。

 

オプション利用時は、spec.containers.volumeMounts以下に、

readOnly: true 

と記述すればよい。

spec:

  containers:

    volumeMounts:

    - name: test-volume

      mountPath: /cache

    readOnly: true

 

■参考文献

・公式

 https://kubernetes.io/docs/concepts/storage/volumes/

  https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/

・青山真也著『Kubernetes完全ガイド