एक फाइल को पॉड में साझा / माउंट करने का सबसे अच्छा तरीका क्या है?


102

मैं एक फ़ाइल को माउंट करने के लिए रहस्यों का उपयोग करने पर विचार कर रहा था, लेकिन ऐसा लगता है कि आप केवल निर्देशिका को माउंट कर सकते हैं जो अन्य सभी सामग्री को अधिलेखित कर देगा। निर्देशिका को बढ़ते बिना मैं एक भी कॉन्फ़िगर फ़ाइल कैसे साझा कर सकता हूं?

जवाबों:


154

उदाहरण के लिए आपके पास एक विन्यास है जिसमें 2 विन्यास फाइल हैं:

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

आप मौजूदा निर्देशिका में एकल फ़ाइल माउंट करने के लिए इस तरह से सबपैथ का उपयोग कर सकते हैं:

---
        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
भ्रमित क्यों यह 2 फाइलों के लिए उदाहरण दिखाता है जब ओपी को केवल 1 की आवश्यकता होती है, मुझे लगता है कि एक ही फाइल के मामले के लिए समान लागू होता है।
रैंडी एल

6
@ the0ther सिर्फ यह स्पष्ट करने के लिए कि यह कई फाइलों के साथ कैसे काम करता है
टॉमी गुयेन

@TommyNguyen, क्या कोई तरीका है अगर मैं केवल अपने मुख्य पथ को माउंट करना चाहता हूं और उप पथ की तरह नहीं है ।/abc.txt जहां abc.txt मुख्य फ़ोल्डर में कंटेनर के अंदर स्थित है और उप फ़ोल्डर नहीं है।
प्रिंस जू

2
क्या होगा अगर फाइल एक कॉन्फिगरेशन नहीं है, या एक कॉन्फिगरेशन नहीं है? क्या आपकी स्थानीय डिस्क से मनमानी फ़ाइल माउंट करना संभव है?
लंदनरॉब

3
@LondonRob आपके मामले में आपको hostPath का उपयोग करना चाहिए, kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami

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
यह पहले से उल्लिखित ओपी की तरह पूरी निर्देशिका को अनिच्छापूर्वक अधिलेखित कर देगा।
davegallant

5
मैं सहमत नहीं हूँ। "सबपाथ" सहित दृष्टिकोण का परीक्षण किया और केवल फाइलें ही नहीं पूरी निर्देशिका को माउंट किया गया था। कुबेरनेट्स 1.5 के साथ परीक्षण किया गया।
dmorlock

@ मार्कोरलॉक प्रश्न अस्पष्ट रूप से कहा गया था। यह शीर्षक के अनुसार "एक फ़ाइल को फली में साझा / माउंट" करेगा और जैसे सवाल पूछता है "एक निर्देशिका बढ़ते बिना एक कॉन्फ़िगर फ़ाइल साझा करें"
जोएल बी

1
मुझे अब तीन बार इस प्रश्न पर आना पड़ा क्योंकि "सबपाथ" शब्द का उल्लेख कहीं भी डॉक्स में kubernetes.io/docs/tasks/configure-pod-container/… पर नहीं किया गया है । मुझे लगता है कि यह एक अनुकूल प्रलेखन पीआर है जिसे बनाने और प्रस्तुत करने की आवश्यकता है।
टोड लियोन

@JoelB, क्या कोई रास्ता है अगर मैं केवल अपने मुख्य पथ को माउंट करना चाहता हूं और जैसे उप पथ नहीं ।/abc.txt जहां abc.txt मुख्य फ़ोल्डर में कंटेनर के अंदर स्थित है और उप फ़ोल्डर नहीं है।
प्रिंस जू

7

वर्तमान में (v1.0, v1.1) वॉल्यूम के लिए कोई तरीका नहीं है जो एक सिंगल फाइल को माउंट करता है। गुप्त संरचना स्वाभाविक रूप से कई रहस्यों का प्रतिनिधित्व करने में सक्षम है, जिसका अर्थ है कि यह एक निर्देशिका होना चाहिए।

जब हमें कॉन्फ़िगर ऑब्जेक्ट्स मिलते हैं, तो एकल फ़ाइलों का समर्थन किया जाना चाहिए।

इस समय के दौरान आप अपनी छवि से एक निर्देशिका और सिमलिंक को माउंट कर सकते हैं, हो सकता है?


1
क्या यह अभी भी सच है?
neu242

7
अब आप सिंगल फाइल प्राप्त करने के लिए वॉल्यूममैट्स के सबपाथ फीचर का उपयोग कर सकते हैं
टिम हॉकिन

1
फिलहाल यह संभव है। उपरोक्त उत्तर की जाँच करें: stackoverflow.com/a/43404857/5091346
Andrii Abramov

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"}]}]}}}}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.