Apa cara terbaik untuk membagikan / memasang satu file ke dalam pod?

110

Saya sedang mempertimbangkan untuk menggunakan rahasia untuk memasang satu file tetapi tampaknya Anda hanya dapat memasang direktori yang akan menimpa semua konten lainnya. Bagaimana saya bisa berbagi satu file konfigurasi tanpa memasang direktori?

Smana
sumber

Jawaban:

163

Misalnya Anda memiliki configmap yang berisi 2 file konfigurasi:

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

Anda dapat menggunakan subPath seperti ini untuk memasang file tunggal ke direktori yang ada:

---
        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"
---

Contoh lengkapnya di sini

Tommy Nguyen
sumber
5
bingung mengapa ini menunjukkan contoh untuk 2 file ketika OP hanya membutuhkan 1, saya anggap hal yang sama berlaku meskipun untuk kasus file tunggal.
Randy L
7
@ the0ther ya hanya untuk memperjelas cara kerjanya dengan banyak file
Tommy Nguyen
@TommyNguyen, apakah ada cara jika saya hanya ingin me-mount path utama saya dan bukan sub path seperti ./abc.txt di mana abc.txt terletak di dalam container di folder utama dan bukan di sub folder.
PrinceT
3
Bagaimana jika file tersebut bukan ConfigMap, atau tidak dalam ConfigMap? Apakah mungkin untuk memasang file arbitrer dari disk lokal Anda?
LondonRob
3
@LondonRob dalam kasus Anda, Anda harus menggunakan hostPath, lihat kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami
48

Saya akan mulai dengan contoh kerja ini dari sini . Pastikan Anda menggunakan setidaknya Kubernetes 1.3.

Cukup buat ConfigMap seperti ini:

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

Dan kemudian buat pod seperti ini:

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
Joel B
sumber
1
Ini secara tidak diinginkan akan menimpa seluruh direktori seperti yang sudah disebutkan oleh OP.
davegallant
5
Saya tidak setuju. Menguji pendekatan termasuk "subPath" dan hanya file yang dipasang bukan seluruh direktori. Diuji dengan Kubernetes 1.5.
dmorlock
@dmorlock Pertanyaan itu diucapkan secara ambigu. Ini akan sebagai judul menyatakan "bagikan / pasang satu file ke dalam pod" dan seperti pertanyaan yang menanyakan "berbagi file konfigurasi tanpa memasang direktori"
Joel B
1
Saya harus sampai pada pertanyaan ini tiga kali sekarang karena kata "subpath" tidak disebutkan di manapun dalam dokumen di kubernetes.io/docs/tasks/configure-pod-container/… . Saya kira itu PR dokumentasi ramah yang perlu dibuat dan dikirimkan.
Todd Lyons
@JoelB, apakah ada cara jika saya hanya ingin me-mount path utama saya dan bukan sub path seperti ./abc.txt di mana abc.txt terletak di dalam container di folder utama dan bukan di sub folder.
PrinceT
7

Saat ini (v1.0, v1.1) tidak ada cara untuk memasang volume satu file konfigurasi. Struktur Rahasia secara alami mampu merepresentasikan banyak rahasia, yang artinya harus berupa direktori.

Ketika kita mendapatkan objek config, file tunggal harus didukung.

Sementara itu, Anda dapat memasang direktori dan menghubungkannya dengan gambar Anda, mungkin?

Tim Hockin
sumber
1
Apakah ini masih benar?
neu242
7
Anda dapat menggunakan fitur subPath volumeMounts untuk mendapatkan satu file sekarang
Tim Hockin
1
Ini mungkin saat ini. Periksa jawaban di atas: stackoverflow.com/a/43404857/5091346
Andrii Abramov
0

Katakanlah Anda ingin memasang log4j2.xml baru ke dalam penerapan yang sedang berjalan untuk meningkatkan logging

# 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"}]}]}}}}'

Terbuka sedikit
sumber