하나의 파일을 포드에 공유 / 마운트하는 가장 좋은 방법은 무엇입니까?


109

비밀을 사용하여 단일 파일을 마운트하는 것을 고려하고 있었지만 다른 모든 콘텐츠를 덮어 쓰는 디렉토리 만 마운트 할 수있는 것 같습니다. 디렉토리를 마운트하지 않고 단일 구성 파일을 공유하려면 어떻게해야합니까?

답변:


161

예를 들어 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"
---

여기에 전체 예


5
OP가 1 만 필요할 때 이것이 2 개의 파일에 대한 예제를 보여주는 이유를 혼란스럽게했지만 단일 파일의 경우에도 동일하게 적용된다고 가정합니다.
Randy L

7
그것은 여러 파일을 작동하는 방법 @ the0ther 참으로 그냥 명확하게하기
토미 응우 엔

@TommyNguyen, abc.txt가 하위 폴더가 아닌 기본 폴더의 컨테이너 내부에있는 ./abc.txt와 같은 하위 경로가 아닌 기본 경로 만 마운트하려는 경우 방법이 있습니까?
PrinceT 19.07.05

3
파일이 ConfigMap이 아니거나 ConfigMap에 없으면 어떻게됩니까? 로컬 디스크에서 임의의 파일을 마운트 할 수 있습니까?
LondonRob

3
@LondonRob 귀하의 경우에는 hostPath를 사용해야합니다. kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami

48

여기서 부터이 작업 예제로 시작 하겠습니다 . 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
동의하지 않습니다. "subPath"를 포함한 접근 방식을 테스트했으며 전체 디렉토리가 아닌 파일 만 마운트되었습니다. Kubernetes 1.5로 테스트되었습니다.
dmorlock

@dmorlock 질문이 모호하게 표현되었습니다. 제목에 "하나의 파일을 pod에 공유 / 마운트"라고 표시되고 질문과 같이 "디렉토리를 마운트하지 않고 구성 파일 공유"라는 질문처럼
Joel B

1
kubernetes.io/docs/tasks/configure-pod-container/… 의 문서 어디에도 "subpath"라는 단어가 언급되지 않았기 때문에 저는이 질문에 세 번이나 와야했습니다 . 작성하고 제출해야하는 친숙한 문서 PR 인 것 같습니다.
Todd Lyons

@JoelB, abc.txt가 하위 폴더가 아닌 기본 폴더의 컨테이너 내부에있는 ./abc.txt와 같은 하위 경로가 아닌 기본 경로 만 마운트하려는 경우 방법이 있습니까?
PrinceT 19.07.05

7

현재 (v1.0, v1.1) 단일 구성 파일을 볼륨 마운트하는 방법이 없습니다. 비밀 구조는 자연스럽게 여러 비밀을 나타낼 수 있습니다. 즉, 디렉터리 여야합니다.

구성 개체를 얻을 때 단일 파일이 지원되어야합니다.

그동안 디렉토리를 마운트하고 이미지에서 심볼릭 링크를 만들 수 있습니까?


1
여전히 사실입니까?
neu242

7
이제 하나의 파일을 얻을 수 volumeMounts의 서브 패스 기능을 사용할 수 있습니다
팀 호킨에게

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.