ฉันกำลังพิจารณาใช้ความลับในการเมานต์ไฟล์เดียว แต่ดูเหมือนว่าคุณสามารถเมานต์ไดเร็กทอรีที่จะเขียนทับเนื้อหาอื่น ๆ ทั้งหมดเท่านั้น ฉันจะแชร์ไฟล์ config ไฟล์เดียวโดยไม่ต้องติดตั้งไดเร็กทอรีได้อย่างไร
ฉันกำลังพิจารณาใช้ความลับในการเมานต์ไฟล์เดียว แต่ดูเหมือนว่าคุณสามารถเมานต์ไดเร็กทอรีที่จะเขียนทับเนื้อหาอื่น ๆ ทั้งหมดเท่านั้น ฉันจะแชร์ไฟล์ config ไฟล์เดียวโดยไม่ต้องติดตั้งไดเร็กทอรีได้อย่างไร
คำตอบ:
ตัวอย่างเช่นคุณมี 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"
---
ตัวอย่างเต็มที่นี่
ผมขอเริ่มต้นด้วยตัวอย่างการทำงานนี้จากที่นี่ ตรวจสอบให้แน่ใจว่าคุณใช้ 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
ขณะนี้มี (v1.0, v1.1) ไม่มีวิธีในการเมานต์โวลุ่มไฟล์กำหนดค่าเดียว โครงสร้างความลับนั้นสามารถแสดงความลับได้หลายแบบโดยธรรมชาติซึ่งหมายความว่าจะต้องเป็นไดเร็กทอรี
เมื่อเราได้รับวัตถุกำหนดค่าควรสนับสนุนไฟล์เดียว
ในเวลานั้นคุณสามารถเมานต์ไดเร็กทอรีและ symlink จากรูปภาพของคุณได้หรือไม่?
ข้อมูลเพิ่มเติมที่เป็นประโยชน์สำหรับคำตอบที่ยอมรับ:
สมมติว่าไฟล์ต้นทางของคุณเรียกว่า environment.js และคุณต้องการให้ไฟล์ปลายทางเรียกว่า destination_environment.js ดังนั้นไฟล์ yaml ของคุณควรมีลักษณะดังนี้:
---
volumeMounts:
- name: "config"
mountPath: "/<existing folder>/destination_environment.js"
subPath: "environment.js"
volumes:
- name: "config"
configMap:
name: "config"
---
สมมติว่าคุณต้องการเมานต์ 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"}]}]}}}}'