Bir dosyayı bir bölmeye paylaşmanın / bağlamanın en iyi yolu nedir?


110

Tek bir dosyayı bağlamak için sır kullanmayı düşünüyordum, ancak görünen o ki, yalnızca diğer tüm içeriğin üzerine yazacak bir dizini bağlayabilirsiniz. Bir dizini bağlamadan tek bir yapılandırma dosyasını nasıl paylaşabilirim?

Yanıtlar:


163

Örneğin, 2 yapılandırma dosyası içeren bir yapılandırma haritanız var:

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

Tek bir dosyayı mevcut dizine bağlamak için subPath'i şu şekilde kullanabilirsiniz:

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

Tam örnek burada


5
OP sadece 1'e ihtiyaç duyduğunda bunun neden 2 dosya için örnek gösterdiğini karıştırdı, aynısının tek bir dosya için de geçerli olduğunu varsayıyorum.
Randy L

7
@ the0ther evet, birden fazla dosyayla nasıl çalıştığını netleştirmek için
Tommy Nguyen

@TommyNguyen, abc.txt'nin alt klasörde değil, ana klasörde konteynerin içinde bulunduğu ./abc.txt gibi bir alt yolu değil, yalnızca ana yolumu bağlamak istersem herhangi bir yol var mı?
PrinceT

3
Dosya bir ConfigMap değilse veya bir ConfigMap içinde değilse ne olur? Yerel diskinizden rastgele bir dosya monte etmek mümkün mü?
LondonRob

3
@LondonRob sizin durumunuzda hostPath kullanmalısınız, bkz. Kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami

48

Bu çalışma örneğiyle buradan başlayacağım . En az Kubernetes 1.3 kullandığınızdan emin olun.

Bunun gibi bir ConfigMap oluşturun:

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

Ve sonra bunun gibi bir bölme oluşturun:

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
Bu, daha önce bahsedilen OP gibi istenmeyen bir şekilde tüm dizinin üzerine yazacaktır.
davegallant

5
Ben katılmıyorum "SubPath" dahil yaklaşımı test etti ve dizinin tamamı değil sadece dosyalar bağlandı. Kubernetes 1.5 ile test edilmiştir.
dmorlock

@dmorlock Soru belirsiz bir şekilde ifade edildi. Bu, başlıkta "bir dosyayı bir bölmeye paylaş / bağla" ifadesini belirttiği ve sorunun "bir dizini
Joel B

1
Bu soruya şimdi üç kez gelmek zorunda kaldım çünkü "alt yol" kelimesi kubernetes.io/docs/tasks/configure-pod-container/… adresindeki belgelerde hiçbir yerde geçmiyor . Sanırım bu, oluşturulması ve sunulması gereken dostane bir belge PR.
Todd Lyons

@JoelB, sadece ana yolumu bağlamak istiyorsam ve abc.txt'nin alt klasörde değil, ana klasörde kapsayıcıda bulunduğu ./abc.txt gibi bir alt yolu bağlamak istemiyorsam herhangi bir yol var mı?
PrinceT

7

Şu anda (v1.0, v1.1) tek bir yapılandırma dosyasını birim bağlamanın bir yolu yoktur. Gizli yapı, doğal olarak birden çok sırrı temsil edebilir, bu da onun bir dizin olması gerektiği anlamına gelir.

Yapılandırma nesneleri aldığımızda, tek dosyalar desteklenmelidir.

Bu arada görüntünüzden bir dizin bağlayabilir ve ona sembolik bağlantı kurabilirsiniz, belki?


1
Bu hala doğru mu?
neu242

7
Şimdi tek bir dosya almak için volumeMounts'un subPath özelliğini kullanabilirsiniz
Tim Hockin

1
Bu şu anda mümkün. Yukarıdaki yanıtı kontrol edin: stackoverflow.com/a/43404857/5091346
Andrii Abramov

0

Günlük kaydını geliştirmek için çalışan bir dağıtıma yeni bir log4j2.xml eklemek istediğinizi varsayalım

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.