1つのファイルをポッドに共有/マウントする最良の方法は何ですか?


102

シークレットを使用して1つのファイルをマウントすることを検討していましたが、他のすべてのコンテンツを上書きするディレクトリのみをマウントできるようです。ディレクトリをマウントせずに単一の構成ファイルを共有するにはどうすればよいですか?

回答:


154

たとえば、2つの構成ファイルを含む構成マップがあるとします。

kubectl create configmap config --from-file <file1> --from-file <file2>

次のようなsubPathを使用して、単一のファイルを既存のディレクトリにマウントできます。

---
        volumeMounts:
        - name: "config"
          mountPath: "/<existing folder>/<file1>"
          subPath: "<file1>"
        - name: "config"
          mountPath: "/<existing folder>/<file2>"
          subPath: "<file2>"
      restartPolicy: Always
      volumes:
        - name: "config"
          configMap:
            name: "config"
---

ここに完全な例


5
OPが1のみを必要とするときに、これが2つのファイルの例を示す理由を混乱させたので、単一のファイルの場合にも同じことが当てはまると思います。
Randy L

6
@ the0therはい、複数のファイルでどのように機能するかを明確にするためです
Tommy Nguyen

@TommyNguyen、。/ abc.txtのようなサブパスではなくメインパスのみをマウントしたい場合は、abc.txtがサブフォルダーではなくメインフォルダーのコンテナー内にあります。
PrinceT

2
ファイルがConfigMapでない場合、またはConfigMapにない場合はどうなりますか?ローカルディスクから任意のファイルをマウントすることは可能ですか?
LondonRob

3
@LondonRobの場合、hostPathを使用する必要があります。kubernetes.io/ docs
concepts /

46

私はここからこの作業例から始めます。少なくともKubernetes 1.3を使用していることを確認してください。

次のようなConfigMapを作成するだけです。

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-pd-plus-cfgmap
data:
  file-from-cfgmap: file data

次に、次のようなポッドを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: test-pd-plus-cfgmap
spec:
  containers:
  - image: ubuntu
    name: bash
    stdin: true
    stdinOnce: true
    tty: true
    volumeMounts:
    - mountPath: /mnt
      name: pd
    - mountPath: /mnt/file-from-cfgmap
      name: cfgmap
      subPath: file-from-cfgmap
  volumes:
  - name: pd
    gcePersistentDisk:
      pdName: testdisk
  - name: cfgmap
    configMap:
      name: test-pd-plus-cfgmap

1
これにより、すでに述べたOPのようにディレクトリ全体が上書きされてしまいます。
davegallant 2017年

5
同意しません。「subPath」を含むアプローチをテストし、ディレクトリ全体ではなくファイルのみがマウントされました。Kubernetes 1.5でテスト済み。
dmorlock 2017年

@dmorlock質問はあいまいに書かれました。これは、タイトルに「1つのファイルをポッドに共有/マウントする」とあり、「ディレクトリをマウントせずに構成ファイルを共有する」という質問のように
Joel B

1
kubernetes.io/docs/tasks/configure-pod-container/…にあるドキュメントのどこにも「サブパス」という単語が記載されていないため、この質問に3回答える必要がありました。これは、作成して送信する必要があるわかりやすいドキュメントPRだと思います。
トッドライオンズ2018

@JoelB、。/ abc.txtのようなサブパスではなく、メインパスのみをマウントしたい場合、方法はありますか。abc.txtは、メインフォルダのコンテナ内にあり、サブフォルダではありません。
PrinceT

7

現在(v1.0、v1.1)は、単一の構成ファイルをボリュームマウントする方法はありません。シークレット構造は、当然ながら複数のシークレットを表すことができます。つまり、ディレクトリでなければなりません。

設定オブジェクトを取得する場合、単一のファイルがサポートされている必要があります。

その間、ディレクトリをマウントして、イメージからシンボリックリンクを作成できますか?


1
これはまだ本当ですか?
neu242

7
volumeMountsのsubPath機能を使用して、単一のファイルを取得できます
Tim Hockin

1
これは現時点では可能です。上記の答えを確認してください:stackoverflow.com/a/43404857/5091346
Andrii Abramov '23 / 03/19

0

ロギングを拡張するために、実行中のデプロイメントに新しいlog4j2.xmlをマウントするとします。

# Variables
k8s_namespace=xcs
deployment_name=orders-service
container_name=orders-service
container_working_dir=/opt/orders-service

# Create config map and patch deployment
kubectl -n ${k8s_namespace} create cm log4j \
 --from-file=log4j2.xml=./log4j2.xml

kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
 -p '{"spec":{"template":{"spec":{"volumes":[{"configMap":{"defaultMode": 420,"name": "log4j"},"name": "log4j"}]}}}}'

kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
 -p '{"spec":{"template":{"spec":{"containers":[{"name": "'${container_name}'","volumeMounts": [{  "mountPath": "'${container_working_dir}'/log4j2.xml","name": "log4j","subPath": "log4j2.xml"}]}]}}}}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.