컨테이너 내부에 파일이 있는 기존 디렉터리에 Kubernetes 마운트 볼륨
저는 k8s 버전 1.11과 CephFS를 스토리지로 사용하고 있습니다.
나는 CephFS에 생성된 디렉토리를 포드에 탑재하려고 합니다. 동일한 목표를 달성하기 위해 배포 구성에 다음과 같은 볼륨 및 볼륨 마운트 구성을 작성했습니다
용량
{
"name": "cephfs-0",
"cephfs": {
"monitors": [
"10.0.1.165:6789",
"10.0.1.103:6789",
"10.0.1.222:6789"
],
"user": "cfs",
"secretRef": {
"name": "ceph-secret"
},
"readOnly": false,
"path": "/cfs/data/conf"
}
}
볼륨 마운트
{
"mountPath": "/opt/myapplication/conf",
"name": "cephfs-0",
"readOnly": false
}
마운트가 제대로 작동하고 있습니다. /opt/myapplication/conf에 /cfs/data/conf와 같은 ceph 디렉토리가 마운트되어 있는 것을 볼 수 있지만 다음과 같은 문제가 있습니다.
/opt/myapplication/conf 위치에 이미 도커 이미지의 일부로 구성 파일이 있습니다. 배포에서 ceph 볼륨을 마운트하려고 하면 /opt/myapplication/conf 위치에 있는 모든 파일이 사라집니다. 마운트 작업의 동작이라는 것은 알지만 동일한 볼륨을 마운트하고 있는 다른 포드가 구성 파일에 액세스할 수 있도록 내가 마운트 중인 볼륨의 컨테이너에 이미 존재하는 파일을 유지할 수 있는 방법이 있습니까. /opt/myapplication/conf 위치의 포드 내부에 이미 있는 파일은 /cfs/data/conf 위치의 CephFS에서 액세스할 수 있어야 합니다.
가능합니까?
도커 문서를 검토해보니 다음과 같이 나와 있다
컨테이너를 사용하여 볼륨 채우기 위와 같이 새 볼륨을 생성하는 컨테이너를 시작하고 컨테이너에 마운트할 디렉터리(예: /app/ 위)에 파일 또는 디렉터리가 있으면 디렉터리의 내용이 볼륨에 복사됩니다. 그러면 컨테이너가 볼륨을 마운트하고 사용하며, 볼륨을 사용하는 다른 컨테이너도 미리 채워진 콘텐츠에 액세스할 수 있습니다.
이것은 내 요구 사항과 일치하지만 k8s 볼륨으로 어떻게 달성할 수 있습니까?
불행히도 쿠베르네테스의 볼륨 시스템은 도커의 볼륨 시스템과 다르기 때문에 이것은 직접적으로 불가능하다.
그러나 단일 파일의 경우 다음을 사용할 수 있습니다:
- 이 파일 이름의 끝과
- 다음과 같은 파일 이름을 포함하는 A:
volumeMounts:
- name: cephfs-0
mountPath: /opt/myapplication/conf/foo.conf
subPath: foo.conf
각 파일에 대해 이 작업을 반복합니다. 그러나 만약 당신이 그것들을 많이 가지고 있거나 그것들의 이름이 다를 수 있다면, 당신은 런타임에 이것을 처리하거나 템플릿 도구를 사용해야 한다. 일반적으로 이는 메인 프로세스가 시작되기 전에 다른 곳에 마운트하고 심볼릭 링크를 설정하는 것을 의미합니다.
또한 빌드된 이미지의 콘텐츠로 특정 경로에 폴더를 마운트할 수 없는 틈새 문제에 직면했습니다. 이것은 결국 비워집니다.
그러나 DB를 초기화하는 명령을 실행하는 셸 스크립트를 참조하거나 마운트된 대상 폴더에 영향을 주는 파일을 사용하여 디도커 파일에서 ENTRYPOINT를 사용하는 것이 제 해결 방법입니다.
따라서 큐버넷에 의해 볼륨이 마운트된 후에 진입점이 실행되는 것으로 보입니다.
진입점 스크립트에서 경로를 연결하려고 했지만 잘 되지 않았습니다.
내가 원하는 구성 파일이 올바른 위치에 마운트된 내 beabash 스크립트를 사용하여 이 문제를 해결할 수 있었습니다. 파일이 아직 마운트되지 않아서 오류가 발생한 것 같습니다.
아주 쉬워요! 여기서 init 용기를 사용해야 해요. init 컨테이너와 함께 애플리케이션의 동일한 배포 이미지를 사용합니다. 컨테이너 경로가 /opt/myapplication/conf라고 가정하면 init 컨테이너가 cephfs PVC를 공유합니다
- init 컨테이너를 사용하여 /opt/data에서 볼륨 마운트 정의
- in init container config 명령어 mv를 실행하여 기존 데이터를 마운트된 볼륨 경로 /opt/data로 이동합니다.
메인 애플리케이션 컨테이너를 사용하여 볼륨을 올바른 위치(예: /opt/myapplication/conf)에 마운트합니다
이제 애플리케이션을 배포할 때,
- init 컨테이너는 cephfs pv를 마운트하고 컨테이너 경로 데이터를 볼륨으로 이동합니다.
- 이제 기본 애플리케이션이 시작되고 올바른 경로로 볼륨을 마운트합니다. 여기에 마운트할 때 볼륨에도 데이터가 있습니다.
'개발하자' 카테고리의 다른 글
TypeScript에서 중첩된 클래스를 만들 수 있습니까? (0) | 2023.05.29 |
---|---|
주피터 노트북: 쿠키 만료 및 토큰 재설정 강제 (0) | 2023.05.28 |
Sapper/Svelte - 주기적으로 가져오는 방법 (0) | 2023.05.27 |
주피터 노트북을 자동으로 실행하는 스크립트 (0) | 2023.05.27 |
파이썬 주피터 노트북 SHAP force_plot, 어두운 테마에서 배경색 또는 텍스트 색을 변경하는 방법은 무엇입니까? (0) | 2023.05.26 |