1. 概要場合によっては、単一の Pod 内で複数のパーティがボリュームを共有して使用すると便利なことがあります。 volumeMounts.subPath プロパティを使用すると、参照されるボリューム内のルート パスではなくサブパスを指定できます。 公式ドキュメント: https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#using-subpath 2. 使用シナリオ- 複数のパスを使用してマウントされた 1 つの共有ボリューム。
- ConfigMap または Secret は特定のディレクトリ内の特定のパスにマウントされており、そのディレクトリ内に上書きしたくない他のファイルがあります。
3. 共有ボリュームで複数のパスをマウントするために使用する configmap/secret として使用される場合、subPath は configmap/secret のサブパスを表します。
[例1] マウントディレクトリ、hostPath APIバージョン: v1 種類:ポッド メタデータ: 名前:私のランプサイト 仕様: nodeName : local - 168 - 182 - 110 # テストの便宜上、スケジューリングマシンを指定します コンテナ: -名前: mysql 画像: mysql 環境: -名前: MYSQL_ROOT_PASSWORD 値: "rootpasswd" ボリュームマウント: - mountPath : / var / lib / mysql #コンテナ内のパスにマウント name : site - data #マウントされたデバイスの名前。ボリュームに対応している必要があります[ * ] .name subPath : mysql # ボリューム パス内のサブパス (ボリューム パス ディレクトリの下に空の mysql ディレクトリが自動的に作成されます) -名前: php 画像: PHP : 7.0 - Apache ボリュームマウント: - mountPath : / var / www / html #コンテナ内のパスにマウント name : site - data # ボリューム パス内のサブパス (site - data [空のディレクトリ] はボリューム パス ディレクトリに自動的に作成されます) サブパス: html 巻数: - name : nginx #上記と同じです。これはローカル ファイル パスです。上記はコンテナ内のパスです。 ホストパス: パス: / opt / k8s / subPath / lamp #このパスを作成する必要があります [例2] ディレクトリpvcをマウントする # ストレージクラス 種類:ストレージクラス apiバージョン:ストレージ.k8s .io / v1 メタデータ: 名前:ローカルストレージ プロビジョナー: kubernetes .io / no -プロビジョナー ボリュームバインディングモード: WaitForFirstConsumer --- #PVC APIバージョン: v1 種類:永続ボリューム メタデータ: 名前:ローカルランプPV ラベル: 名前:ローカルランプPV 仕様: 容量: ストレージ: 1 Gi アクセスモード: -一度だけ読み書き可能 persistentVolumeReclaimPolicy :保持 storageClassName :ローカル-ストレージ 地元: パス: / opt / k8s / subPath / lamp - pvc ノードアフィニティ: 必須: ノードセレクタ用語: -一致する表現: -キー: kubernetes.io/ホスト名 演算子: 値: -ローカル- 168 - 182 - 110
--- #PVC 種類: PersistentVolumeClaim APIバージョン: v1 メタデータ: 名前:私のランプサイトデータ 仕様: アクセスモード: -一度だけ読み書き可能 リソース: リクエスト: ストレージ: 1 Gi storageClassName :ローカル-ストレージ セレクター: マッチラベル: 名前:ローカルランプPV --- APIバージョン: v1 種類:ポッド メタデータ: 名前:私のランプサイトPVC 仕様: コンテナ: -名前: mysql 画像: mysql 環境: -名前: MYSQL_ROOT_PASSWORD 値: "rootpasswd" ボリュームマウント: -マウントパス: / var / lib / mysql 名前:サイト-データ サブパス: mysql -名前: php 画像: PHP : 7.0 - Apache ボリュームマウント: -マウントパス: / var / www / html 名前:サイト-データ サブパス: html 巻数: -名前:サイト-データ 永続ボリュームクレーム: クレーム名:私のランプサイトデータ PVC テンプレートを使用する場合は、PVC を手動で作成する必要はありません。次に例を示します。 volumeClaimTemplates : #PVCテンプレートとして考えることができます -メタデータ: 名前: nginx - pvc 仕様: アクセスモード: [ "ReadWriteOnce" ] storageClassName : "local-storage" #ストレージクラス名。これは上記の nginx - sc.yamlのメタデータ.nameです。 リソース: リクエスト: ストレージ: 1 Gi [例3] 1つのファイルを共有する subPath がフォルダーではなくファイルの場合はどうなるでしょうか?同様に、subPath を通じてファイルを指定するだけです。 subPath では相対ディレクトリを使用する必要があることに注意してください。詳細は以下の通りです。 apiバージョン:アプリ/ v1 種類:デプロイメント メタデータ: 名前:デプロイメント-テスト 仕様: レプリカ: 1 セレクター: マッチラベル: アプリ: nginx - pod テンプレート: メタデータ: ラベル: アプリ: nginx - pod 仕様: nodeName : local - 168 - 182 - 110 # テストの便宜上、スケジューリングマシンを指定します コンテナ: -名前: nginx イメージ: docker .io / library / nginx :最新 ボリュームマウント: -マウントパス: /etc/nginx/nginx.conf 名前: nginx - conf サブパス: nginx - conf 巻数: - name : nginx - conf #上記と同じです。これはローカル ファイル パスです。上記はコンテナ内のパスです。 ホストパス: パス: / opt / k8s / subPath / nginx #このパスを作成する必要があります [結論] ホストマシン上のファイルが優先され、ポッド内の元のデフォルトファイルの内容が上書きされます。 4. ConfigMapとSecretでsubPathを使用するconfigmap/secret として使用される場合、subPath は configmap/secret のサブパスを表します。 subPath を使用しない場合、コンテナー内の元のファイル (volumeMounts.mountPath に対応するディレクトリ) はクリアされ、ConfigMap ファイルと Secret ファイルは volumeMounts.mountPath に対応するディレクトリに配置されます。 [例1] ConfigMap APIバージョン: v1 種類: ConfigMap メタデータ: 名前: nginx - conf データ: nginx.conf : |+ ワーカープロセス1 ; イベント{ ワーカー接続1024 ; } http { mime .typesをインクルードします。 default_type アプリケーション/オクテットストリーム; ファイル送信オン; キープアライブタイムアウト65 ; サーバー{ 聞く80 ; サーバー名 ローカルホスト; 位置/ { ルートhtml ; インデックス インデックス.htmlインデックス.htm ; } エラーページ500 502 503 504 / 50 x .html ; 場所= / 50 x .html { ルートhtml ; } } } --- apiバージョン:アプリ/ v1 種類:デプロイメント メタデータ: 名前:デプロイメント- test2 仕様: レプリカ: 1 セレクター: マッチラベル: アプリ: nginx - pod テンプレート: メタデータ: ラベル: アプリ: nginx - pod 仕様: nodeName : local - 168 - 182 - 110 # テストの便宜上、スケジューリングマシンを指定します コンテナ: -名前: nginx イメージ: docker .io / library / nginx :最新 ボリュームマウント: - name : nginx - cm # volumes.nameと同じ マウントパス: /etc/nginx/nginx.conf サブパス: nginx.conf 巻数: -名前: nginx - cm 構成マップ: 名前: nginx - conf # configMap 名 [例1] 秘密 APIバージョン: v1 種類:秘密 メタデータ: 名前: mysecret タイプ:不透明 データ: ユーザー名: admin パスワード: MWYyZDFlMmU2N2Rm
---
vim myapp -デモ.yaml apiバージョン:アプリ/ v1 種類:デプロイメント メタデータ: 名前: mysql -デモ 名前空間:デフォルト 仕様: レプリカ: 1 セレクター: マッチラベル: アプリ: myapp テンプレート: メタデータ: ラベル: アプリ: myapp 仕様: コンテナ: -名前: myapp 画像: mysql imagePullPolicy : IfNotPresent ポート: -名前: http コンテナポート: 80 ボリュームマウント: -名前: mysql マウントパス: / tmp / data サブパス:データ 巻数: -名前: mysql 秘密: secretName :私の秘密 [結論] データファイル情報は /tmp ディレクトリに保存され、存在する場合は上書きされます。存在しない場合は自動的に作成されます。
最後に、volumeMounts.subPath についてまとめます。 - SubPath は、実際にはボリュームによってマウントされたサブディレクトリまたは単一のファイルです。ディレクトリか単一ファイルかは、ボリュームでマウントされたディレクトリ内に、subPath で定義されたファイル (ファイルまたはディレクトリ) があるかどうかによって決まります。そうでない場合は、ボリュームに対応するディレクトリにサブパス ディレクトリが作成されます。
- ConfigMap および Secret で subPath が使用されている場合、subPath が指定されていないと、volumeMounts.mountPath に対応するディレクトリ内のすべてのファイルがクリアされ、ConfigMap または Secret で定義されたファイルのみが保存されます。
volumeMounts.subPath の使い方は以上です。ご質問がございましたら、メッセージを残してください。次回の記事はさらに面白いものになる予定です。しばらくお待ちください〜 |