kubernetesでAWS EBSをダイナミックプロビジョニングする
はじめに
くーばねてすを倒すために今回はAmazon Linux 2さんでkubernetesのコンテナからボリュームをマウントする方法を調べた!(^^)/
概要
■ダイナミックプロビジョニングとは
■ ストレージサービスを利用する為の流れ
■利用したいストレージクラスの確認OR作成
■クラウドストレージを指定するPVC(永続ボリュームの要求)を作成。
■PVC(永続ボリュームの要求オブジェクト)を指定するpodテンプレートを作成。
をまとめた(^^)/
今回はAmazon Linux 2さんでAWS EBS ボリュームをマウントする。
■ダイナミックプロビジョニングとは
パブリッククラウド環境下で永続ボリュームとしてクラウドストレージを利用したいと思ったときは、管理者はクラウドプロバイダーに対して新規のストレージ用のボリュームと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
デフォルトのストレージクラスが確認できた。
新たにデフォルトのストレージクラスを作成したいときは、ストレージクラスのマニフェストを作成する。
↓参考にした↓
↓ストレージクラス例↓
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のボリュームタイプ↓
↓※2 Linuxファイルシステムのタイプ↓
↓※3 Amazon EBS 暗号化キー
■クラウドストレージを指定するPVC(永続ボリュームの要求)を作成する
ユーザーはPersistentVolumeClaimでStorageClassを含むことで、ダイナミックプロビジョニングをリクエストすることができる。
そのためには一意のストレージクラスオブジェクトで指定したstorageClassNameを設定する。このフィールドの値は、管理者によって設定されたStorageClassの名前と一致する必要がある。
↓"gp2"というStorageClassを選択するために、PersistentVolumeClaimを作成↓
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を作成する。
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