デフォルトでは、コンテナストレージは一時的です。コンテナ内に書き込まれたデータは、コンテナが再起動すると失われます。ディスクボリュームをマウントすることで、再起動後もデータを永続化できます。本トピックでは、CreateContainerGroup API を使用して Elastic Container Instance (ECI) を作成する際に、ディスクをボリュームとしてマウントする方法について説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
対象の可用性ゾーンで実行中の Elastic Container Instance (ECI)
インスタンスと同じ可用性ゾーンに存在する従量課金ディスク(静的プロビジョニング用)
制限事項
マウント可能なのは従量課金ディスクのみです。詳細については、「ブロックストレージの課金」をご参照ください。
1 つのディスクは、同時に 1 つの Elastic Container Instance (ECI) のみにマウント可能です。ディスクの共有はサポートされていません。
各 Elastic Container Instance (ECI) は、最大 6 個のディスクボリュームをサポートします。
ディスクは、Elastic Container Instance (ECI) と同じ可用性ゾーンに存在する必要があります。クロスゾーンでのマウントはサポートされていません。マウント前に、対象のゾーンでディスクを作成してください。
マルチマウント機能が有効化された NVMe ディスク(NVMe 共有ディスク)はマウントできません。
パーティションが設定されたディスクはマウントできません。スナップショットからディスクを作成する場合、そのスナップショットに基づくディスクにパーティションが含まれていると、マウントできません。
仕組み
ディスクボリュームは、alicloud/disk ドライバーを備えた FlexVolume プラグインを使用します。CreateContainerGroup を呼び出す際には、以下の手順を実行します。
Volume.N.*パラメーターを使用してボリュームを宣言します。このとき、ディスクのソース(既存のディスクまたは新規作成ディスク)を指定します。Container.N.VolumeMount.N.*パラメーターを使用して、宣言済みのボリュームをコンテナにマウントします。このとき、マウントパスおよび動作を指定します。
2 種類のプロビジョニングモードでは、ディスクの取得方法が異なります。
| モード | 使用タイミング | 主要パラメーター |
|---|---|---|
| 静的プロビジョニング | アタッチする既存のディスクがすでに存在する場合 | volumeId(FlexVolume.Options |
| 動的プロビジョニング | ECI 起動時に新規ディスクを作成する場合 | volumeSize の FlexVolume.Options |
ボリュームの宣言
ディスクボリュームを宣言するには、以下の Volume.N.* パラメーターを設定します。
| パラメーター | 型 | 例 | 説明 |
|---|---|---|---|
Volume.N.Name | 文字列 | disk-demo | ボリュームの名前です。マウント時に Container.N.VolumeMount.N.Name で参照されます。 |
Volume.N.Type | 文字列 | FlexVolume | FlexVolume を指定し、FlexVolume プラグインを使用します。 |
Volume.N.FlexVolume.Driver | 文字列 | alicloud/disk | Alibaba Cloud ディスクをマウントする場合は、alicloud/disk を指定します。 |
Volume.N.FlexVolume.FsType | 文字列 | ext4 | ファイルシステムの種類です。有効な値: ext4、ext3、xfs、vfat。デフォルト値:ext4。 |
Volume.N.FlexVolume.Options | 文字列 | {"volumeId":"d-bp1****"} | ディスク構成を含む JSON 文字列です。利用可能なキーについては、以降のセクションをご参照ください。 |
静的プロビジョニング — 既存のディスクを使用
既存のディスクをアタッチするには、FlexVolume.Options 内に volumeId を指定します。ディスクは Pending 状態であり、かつインスタンスと同じ可用性ゾーンに存在する必要があります。volumeId を指定した場合、他のディスク属性パラメーター(volumeSize、performanceLevel など)は無視されます。また、volumeId を指定しない場合は、必ず volumeSize を指定してください。
| オプションキー | 説明 |
|---|---|
volumeId | アタッチするディスクの ID です。 |
動的プロビジョニング — 新規ディスクを作成
volumeId を省略し、代わりに volumeSize を指定することで、ECI 起動時に新規ディスクが自動的に作成されます。システムは自動的にエンハンスト SSD (ESSD) を使用します。ディスクカテゴリは指定できません。
| オプションキー | 必須 | 説明 |
|---|---|---|
volumeSize | はい | ディスクサイズ(GiB)。有効な値:20~32768。また、snapshotId も指定した場合、実際のディスクサイズは volumeSize とスナップショットベースのディスクサイズのうち大きい方になります。 |
performanceLevel | いいえ | ESSD のパフォーマンスレベル (PL) です。詳細については、「ESSD」をご参照ください。 |
deleteWithInstance | いいえ | インスタンスがリリースされたときにディスクもリリースするかどうかを指定します。デフォルト値:true。 |
encrypted | いいえ | ディスクを暗号化するかどうかを指定します。デフォルト値:false。詳細については、「暗号化の概要」をご参照ください。 |
kmsKeyId | いいえ | ディスク暗号化に使用する Key Management Service (KMS) キーの ID です。 |
snapshotId | いいえ | ディスク作成時に使用するスナップショットの ID です。詳細については、「概要」をご参照ください。 |
tags | いいえ | ディスクにアタッチするタグです。最大 20 個まで指定可能です。形式:"tagkey1:tagvalue1,tagkey2:tagvalue2"。 |
コンテナへのボリュームのマウント
ボリュームを宣言した後は、Container.N.VolumeMount.N.* パラメーターを使用して、コンテナにマウントします。
| パラメーター | 型 | 例 | 説明 |
|---|---|---|---|
Container.N.VolumeMount.N.Name | 文字列 | disk-demo | マウント対象のボリューム名です。Volume.N.Name の値と一致する必要があります。 |
Container.N.VolumeMount.N.MountPath | 文字列 | /data | コンテナ内のボリュームマウント先パスです。このパスに既存のデータがある場合、ボリュームによって隠蔽されます。 |
Container.N.VolumeMount.N.SubPath | 文字列 | /logs | マウント対象のボリューム内のサブディレクトリです。同一ボリュームの異なるサブディレクトリを、複数のコンテナにそれぞれマウントする場合に使用します。 |
Container.N.VolumeMount.N.ReadOnly | ブール値 | false | マウントパスを読み取り専用にするかどうかを指定します。デフォルト値:false。 |
Container.N.VolumeMount.N.MountPropagation | 文字列 | None | コンテナとホスト間でマウントが共有されるかどうかを制御します。デフォルト値:None。以下の表をご参照ください。 |
マウント伝搬モード
| 値 | コンテナが認識する内容 | ホストが認識する内容 |
|---|---|---|
None | アタッチ時のマウントのみ可視です。このボリュームまたはそのサブディレクトリに対するその後のマウントは、コンテナ内では可視になりません。 | コンテナ内で作成されたマウントは、ホスト上では可視になりません。 |
HostToContainer | ホスト上でこのボリュームまたはそのサブディレクトリに対して行われたその後のすべてのマウントが、コンテナ内で可視になります。 | コンテナ内で作成されたマウントは、ホスト上では可視になりません。 |
Bidirectional | ホスト上でこのボリュームまたはそのサブディレクトリに対して行われたその後のすべてのマウントが、コンテナ内で可視になります。 | コンテナ内で作成されたすべてのマウントが、ホストおよび同一ボリュームを使用するすべての Elastic Container Instance (ECI) のすべてのコンテナに伝搬されます。 |
init コンテナにボリュームをマウントする場合は、Containerの代わりにInitContainerを使用して、同様のパラメーターを指定します。
サンプル
以下のサンプルでは、CreateContainerGroup に渡す主要なパラメーターを示します。
サンプル 1:静的プロビジョニング(既存のディスク)
ContainerGroupName=test-disk1
SecurityGroupId=sg-bp1daxpbz9lzpvvc****
VSwitchId=vsw-bp1gds63lmlm7ib05****
# ボリュームの宣言
Volume.1.Name=disk-demo
Volume.1.Type=FlexVolume
Volume.1.FlexVolume.Driver=alicloud/disk
Volume.1.FlexVolume.FsType=ext4
Volume.1.FlexVolume.Options={"volumeId":"d-2zebuamrpar7xnj****"}
# コンテナへのボリュームのマウント
Container.1.Name=nginx
Container.1.Image=registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2
Container.1.VolumeMount.1.Name=disk-demo
Container.1.VolumeMount.1.MountPath=/dataこの操作を実行する前に、ディスクが Pending 状態であり、かつインスタンスと同じ可用性ゾーンに存在することを確認してください。
サンプル 2:動的プロビジョニング(新規ディスク)
ContainerGroupName=test-disk2
# ボリュームの宣言
Volume.1.Name=disk-demo
Volume.1.Type=FlexVolume
Volume.1.FlexVolume.Driver=alicloud/disk
Volume.1.FlexVolume.FsType=ext4
Volume.1.FlexVolume.Options={"volumeSize":"50","tags":"test:eci"}
# コンテナへのボリュームのマウント
Container.1.Name=nginx
Container.1.Image=registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2
Container.1.VolumeMount.1.Name=disk-demo
Container.1.VolumeMount.1.MountPath=/dataインスタンス起動時に、50 GiB の ESSD が自動的に作成されます。デフォルトでは、インスタンスと共にディスクがリリースされます(deleteWithInstance: true)。