วิธีที่ดีที่สุดในการแชร์ / ต่อเชื่อมไฟล์หนึ่งไฟล์ลงในพ็อดคืออะไร?


118

ฉันกำลังพิจารณาใช้ความลับในการเมานต์ไฟล์เดียว แต่ดูเหมือนว่าคุณสามารถเมานต์ไดเร็กทอรีที่จะเขียนทับเนื้อหาอื่น ๆ ทั้งหมดเท่านั้น ฉันจะแชร์ไฟล์ config ไฟล์เดียวโดยไม่ต้องติดตั้งไดเร็กทอรีได้อย่างไร

คำตอบ:


170

ตัวอย่างเช่นคุณมี configmap ซึ่งมีไฟล์ config 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"
---

ตัวอย่างเต็มที่นี่


6
สับสนว่าทำไมสิ่งนี้แสดงตัวอย่างสำหรับ 2 ไฟล์เมื่อ OP ต้องการเพียง 1 ฉันถือว่าใช้เหมือนกันแม้ว่าในกรณีของไฟล์เดียว
Randy L

8
@ the0ther ใช่เพื่อให้ชัดเจนว่ามันทำงานกับไฟล์หลายไฟล์อย่างไร
Tommy Nguyen

@TommyNguyen มีวิธีใดบ้างถ้าฉันต้องการเมานต์พา ธ หลักของฉันเท่านั้นไม่ใช่พา ธ ย่อยเช่น. / abc.txt โดยที่ abc.txt อยู่ภายในคอนเทนเนอร์ที่โฟลเดอร์หลักไม่ใช่โฟลเดอร์ย่อย
PrinceT

3
จะเกิดอะไรขึ้นถ้าไฟล์ไม่ใช่ ConfigMap หรือไม่อยู่ใน ConfigMap เป็นไปได้ไหมที่จะเมานต์ไฟล์โดยพลการจากดิสก์ในเครื่องของคุณ?
LondonRob

3
@LondonRob ในกรณีของคุณคุณควรใช้ hostPath ดูที่kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami

49

ผมขอเริ่มต้นด้วยตัวอย่างการทำงานนี้จากที่นี่ ตรวจสอบให้แน่ใจว่าคุณใช้ 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

5
ฉันไม่เห็นด้วย ทดสอบวิธีการนี้รวมถึง "เส้นทางย่อย" และมีเพียงไฟล์เท่านั้นที่เมาท์ไม่ใช่ทั้งไดเร็กทอรี ทดสอบกับ Kubernetes 1.5
dmorlock

@dmorlock คำถามมีคำคลุมเครือ สิ่งนี้จะเป็นชื่อระบุว่า "share / mount one file into a pod" และเช่นเดียวกับคำถามที่ถามว่า "share a config file without mount a directory"
Joel B

1
ฉันเคยที่จะมาถึงคำถามนี้สามครั้งในขณะนี้เพราะคำว่า "subpath" ไม่ได้กล่าวถึงที่ใดก็ได้ในเอกสารที่kubernetes.io/docs/tasks/configure-pod-container/... ฉันเดาว่าเป็นเอกสารประชาสัมพันธ์ที่เป็นมิตรที่ต้องสร้างและส่ง
Todd Lyons

@JoelB มีวิธีใดบ้างถ้าฉันต้องการเมานต์พา ธ หลักของฉันเท่านั้นไม่ใช่พา ธ ย่อยเช่น. / abc.txt โดยที่ abc.txt อยู่ภายในคอนเทนเนอร์ที่โฟลเดอร์หลักไม่ใช่โฟลเดอร์ย่อย
PrinceT

7

ขณะนี้มี (v1.0, v1.1) ไม่มีวิธีในการเมานต์โวลุ่มไฟล์กำหนดค่าเดียว โครงสร้างความลับนั้นสามารถแสดงความลับได้หลายแบบโดยธรรมชาติซึ่งหมายความว่าจะต้องเป็นไดเร็กทอรี

เมื่อเราได้รับวัตถุกำหนดค่าควรสนับสนุนไฟล์เดียว

ในเวลานั้นคุณสามารถเมานต์ไดเร็กทอรีและ symlink จากรูปภาพของคุณได้หรือไม่?


1
ยังมีอยู่จริงไหม
neu242

7
คุณสามารถใช้คุณสมบัติ subPath ของ volumeMounts เพื่อรับไฟล์เดียวได้แล้ว
Tim Hockin

1
เป็นไปได้ในขณะนี้ ตรวจสอบคำตอบด้านบน: stackoverflow.com/a/43404857/5091346
Andrii Abramov

1

ข้อมูลเพิ่มเติมที่เป็นประโยชน์สำหรับคำตอบที่ยอมรับ:

สมมติว่าไฟล์ต้นทางของคุณเรียกว่า environment.js และคุณต้องการให้ไฟล์ปลายทางเรียกว่า destination_environment.js ดังนั้นไฟล์ yaml ของคุณควรมีลักษณะดังนี้:

---
        volumeMounts:
        - name: "config"
          mountPath: "/<existing folder>/destination_environment.js"
          subPath: "environment.js"
      volumes:
        - name: "config"
          configMap:
            name: "config"
---

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.