🙌

kubernetesでAWS EBSをダイナミックプロビジョニングする

2021/03/13に公開

はじめに

くーばねてすを倒すために今回はAmazon Linux 2さんでkubernetesのコンテナからボリュームをマウントする方法を調べた!(^^)/

概要

■ダイナミックプロビジョニングとは
■ ストレージサービスを利用する為の流れ
■利用したいストレージクラスの確認OR作成
■クラウドストレージを指定するPVC(永続ボリュームの要求)を作成。
■PVC(永続ボリュームの要求オブジェクト)を指定するpodテンプレートを作成。

をまとめた(^^)/
今回はAmazon Linux 2さんでAWS EBS ボリュームをマウントする。

■ダイナミックプロビジョニングとは

https://kubernetes.io/ja/docs/concepts/storage/dynamic-provisioning/
パブリッククラウド環境下で永続ボリュームとしてクラウドストレージを利用したいと思ったときは、管理者はクラウドプロバイダーに対して新規のストレージ用のボリュームとPersistentVolumeオブジェクトを作成するように手動で指示しなければならないが、ダイナミックプロビジョニングを利用することで、管理者がストレージを事前にプロビジョンする必要がなくなり、ユーザーによってリクエストされたときにクラウドストレージの作成・削除の自動化をすることができる。

CSI(Container Storage Interface )とはボリュームプラグインシステムで
・オンデマンドにストレージを割り当てる
・コンテナがデプロイされるところから使用可能とする
・不要になったときに自動削除
などの機能がある。

ダイナミックプロビジョニングを使用する際にはStorageClass のProvisionerにCSI(Container Storage Interface )に対応したCSI Volume Pluginを指定することでボリュームの作成・削除の自動化ができる。

■ストレージサービスを利用する為の流れ

ストレージサービスを利用する為の流れは次のようになる。

①利用したいストレージクラスの確認OR作成
②クラウドストレージを指定するPVC(永続ボリュームの要求)を作成。
③PVC(永続ボリュームの要求オブジェクト)とPV(永続ボリューム)を指定するpod(もしくはdeployment)テンプレートを作成。

■利用したいストレージクラスの確認OR作成

クラスターにすでにあるストレージクラスを確認

$ kubectl get storageclass

出力

$ kubectl get storageclass
NAME                 PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
standard (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  23d

デフォルトのストレージクラスが確認できた。

新たにデフォルトのストレージクラスを作成したいときは、ストレージクラスのマニフェストを作成する。
↓参考にした↓
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/storage-classes.html
https://kubernetes.io/docs/concepts/storage/storage-classes/
↓ストレージクラス例↓

awsStorageClass.yml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp2
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ext4 

※metadata/annotations/storageclass.kubernetes.io/is-default-class: "true"
と設定することでデフォルトのストレージクラスとして設定することができる。

ストレージクラスをデフォルトとして設定する。
metadata:
  name: gp2
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"

StorageClass設定項目
|設定項目|意味|
| --- | --- | --- |
|kind|StorageClass|
|apiVersion|storage.k8s.io/v1|
|metadata|名前、ラベル、ストレージクラスの扱いを設定する|
|provisioner|ボリュームプラグインのこと。kubernetes.io/gce-pd,kubernetes.io/aws-ebs,kubernetes.io/glusterfsなど。自前のものを実装して組み込むことも可能|
|parameters|ストレージクラスに属するボリュームを設定する。パラメータを省略すると、デフォルトが使用される。最大512個のパラメーターを設定できる|
|reclaimPolicy|PVCが削除された際にPVを削除( Delete )するか残すか( Retain )を指定する。デフォルトは Delete だ。|
|volumeBindingMode|PVCが作成された際に、即時にPVを紐付けるか( Immediate )、実際使用される際に紐付けるか( WaitForFirstConsumer )を指定する。WaitForFirstConsumer だとPVCが作成された際にはまだPVが作成されたりしない。PVCが実際にPodで利用される際にPVが作成される。デフォルトは Immediate だ|
|mountOptions|StorageClassによって動的に作成される際のマウントオプションを指定する。このオプションはチェックされず、無効なオプションの場合単に処理が失敗する。|
|allowVolumeExpansion|ボリュームの拡張を許可するかを指定する。デフォルトはFalseだ。ユーザーは対応するPVCオブジェクトを編集してボリュームをリサイズできる|
|allowedTopologies|動的にプロビジョニングする際の対象Nodeを制限することが出来る。 matchLabelExpressions でNodeを指定をする。|

parameters(AWS EBSの場合)設定項目
|設定項目|意味|
| --- | --- | --- |
|type※1|AWS EBSボリュームタイプio1、gp2、sc1、st1。デフォルト:gp2。|
|iopsPerGB|ボリュームがサポート可能な 1 秒間あたりの I/O 操作回数の指定値""で囲う|
|fsType※2|kubernetesでサポートされているfsType。デフォルト:ext4|
|encrypted|EBSボリュームを暗号化する必要があるかどうかを示す。有効な値はtrueまたはfalse|
|kmsKeyId※3|ボリュームを暗号化するときに使用するキーの完全なAmazonリソース名。何も提供されていないencryptedがtrueの場合、キーはAWSによって生成される。|

AWS EBSについて
↓※1 AWSEBSのボリュームタイプ↓
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html
↓※2 Linuxファイルシステムのタイプ↓
https://eng-entrance.com/linux-make-filesystem
↓※3 Amazon EBS 暗号化キー
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSEncryption.html

■クラウドストレージを指定するPVC(永続ボリュームの要求)を作成する

ユーザーはPersistentVolumeClaimでStorageClassを含むことで、ダイナミックプロビジョニングをリクエストすることができる。
そのためには一意のストレージクラスオブジェクトで指定したstorageClassNameを設定する。このフィールドの値は、管理者によって設定されたStorageClassの名前と一致する必要がある。

↓"gp2"というStorageClassを選択するために、PersistentVolumeClaimを作成↓

persistentVolumeClaim.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-claim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  storageClassName: gp2
  resources:
    requests:
      storage: 5Gi

PersistentVolumeClaim設定項目
|設定項目|意味|
| --- | --- | --- |
|apiVersion| v1|
|kind|PersistentVolumeClaim|
|metadata|名前、ラベル、ストレージに渡すパラメータを設定する。ストレージクラスを記述することもある|
|spec|永続ボリュームの要求を記述する。|

metadata設定項目
|設定項目|意味|
| --- | --- | --- |
|annotations|ストレージに渡すパラメータを設定する。またはストレージクラスを記述する|
|name|必須項目|

spec(永続ボリュームの要求)の設定項目
|設定項目|意味|
| --- | --- | --- |
|accessModes|PVのアクセスモードを指定する。アクセスモードは現在以下の3種ReadWriteOnce : 単一Nodeで読み書きが可能,ReadOnlyMany : 複数Nodeで読み込みが可能,ReadWriteMany : 複数Nodeから読み書きが可能|
|storageClassName|PVのStorageClassを指定する。省略時はデフォルトのストレージクラスが使用される。$ kubectl get storageclassで確認。$ kubectl describe storageclassで詳細確認できる|
|volumeMode|PVをファイルシステム( Filesystem )としてマウントさせるか、ブロックデバイス( Block )としてマウントさせるかを指定する。デフォルトは Filesystem だ。|
|resources|最低限必要なボリュームの容量を指定する。指定方法はResourceRequirementsとほど同様だ|
|selector|PVのLabel Selectorを利用できる。 Deploymentなどでも使用した matchLabels や matchLabelExpressions も指定できる。|

↓ボリュームの容量を指定spec/resources/requests/storageにて設定する。

resources:
  requests:
    storage: 5Gi

PVC(永続ボリュームの要求オブジェクト)を指定するpod(もしくはdeployment)テンプレートを作成

作成したPVCを指定するpodを作成する。

test-pod.yml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:  #podの仕様
  containers:
  - name: test-pod
    image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
  volumeMounts: 
  - mountPath: /mnt   #podのボリュームを置くところ
      name: volume
  volumes:     #podの永続ボリュームの設定
    - name: volume
      persistentVolumeClaim:
        claimName: test-claim   #PVCで指定した一意の名前

これで AWS EBS ストレージクラスが /mnt ディレクトリにマウントされる。

必要ならストレージクラスの作成をしてPVCとpodテンプレートを起動する。

$ kubectl apply -f awsStorageClass.yml
$ kubectl apply -f persistentVolumeClaim.yml
$ kubectl apply -f test-pod.yml

ポッドを検査する。

$ kubectl describe pod testpod
Name:         test-pod2
Namespace:    default
略
    Mounts:
      /data from claim-volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-fn4nb (ro)
Volumes:
  claim-volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  test-claim
    ReadOnly:   false
略

まとめ

(^^)/間違ってたらごめん

Discussion