Kubernetes Pod에서 특정 UID로 볼륨을 마운트하는 방법은 무엇입니까?


14

따라서 Kubernetes 에서이 이미지를 기반으로 Nexus를 실행하려고 하지만 실패합니다.

mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory

문서에서 프로세스는 UID 200으로 실행되며 볼륨은 해당 권한으로 마운트되어야합니다.

A persistent directory, /nexus-data, is used for configuration,
logs, and storage. This directory needs to be writable by the Nexus
process, which runs as UID 200.

해당 권한으로 볼륨을 마운트하는 방법을 찾기 위해 설명서를 검색했지만 시도 할 방법이 없었습니다.

누구든지 PVC / PV 구성에서 배치에서 볼륨을 마운트 할 UID를 지정할 수 있는지 여부를 알고 있습니까? 그렇다면 어떻게?

답변:


31

UID의 정의를 사용하여 설정하는 방법은 Pod없지만 Kubernetes는 UID소스 볼륨을 저장합니다 .

그래서, 당신은 설정할 수 있습니다 UID에 의해 InitContainer주요 컨테이너 전에 출시가, 단지에 추가 containers의 경로를 Deployment:

initContainers:
- name: volume-mount-hack
  image: busybox
  command: ["sh", "-c", "chown -R 200:200 /nexus"]
  volumeMounts:
  - name: <your nexus volume>
    mountPath: /nexus

잘 작동합니다. 이 해킹에 감사드립니다. Oracle DB 이미지와 함께 사용합니다.
Thomas Hofmann

그러나 ConfigMaps 및 Secrets에는 도움이되지 않습니다.
Torsten Bronger

이것은 나를 위해 일했습니다 (chmod와 함께). 누군가 (또는 Kubernetes)가 덜 해킹 된 방법을 구현하기를 바랍니다.
leeman24

command: ["sh", "-c", "chmod 777 /nexus && chown 200:200 /nexus"]폴더를 쓸 수 있는지 확인하는 것과 같은 것을 사용하고 있습니다.
Martin Tapp

그러나 문제는 메인 컨테이너에서 프로세스의 UID를 어떻게 알 수 있습니까? 200 이외의 다른 것도있을 수 있습니다.
Nawaz

7

Anton이 말했듯이 포드 정의를 사용하여 UID를 설정할 수는 없지만. 이 주제에 대한 또 다른 해결 방법이 있습니다.

Kubernetes 공식 문서 포드 또는 컨테이너에 대한 보안 컨텍스트 구성을 참조하십시오.

내가 사용한 포드 정의 :

apiVersion: v1
kind: Pod
metadata:
  name: nexus3
  labels:
    app: nexus3
spec:
  securityContext:
    fsGroup: 200
  volumes:
  - name: nexus-data-vol
    emptyDir: {}
  containers:
  - name: nexus3-container
    image: sonatype/nexus3
    volumeMounts:
    - name: nexus-data-vol
      mountPath: /nexus-data

서비스 정의 :

apiVersion: v1
kind: Service
metadata:
  name: nexus3-service
spec:
  type: NodePort
  ports:
  - port: 8081
    nodePort: 30390
    protocol: TCP
    targetPort: 8081
  selector:
    app: nexus3

그런 다음 권한 거부 또는 기타 오류없이 포드 및 서비스를 만듭니다.

# kubectl create -f nexus3.yaml
# kubectl create -f nexus3-svc.yaml

Nexus3 컨테이너에 로그인하여 / nexus-data의 소유자 / 권한을 확인하십시오.

# kubectl exec -it nexus3 -- sh
sh-4.2$ ls -ld /nexus-data/
drwxrwsrwx 16 root nexus 4096 Mar 13 09:00 /nexus-data/
sh-4.2$

보다시피, 디렉토리는 root : nexus에 속하며 디렉토리에서 파일을 확인할 수도 있습니다.

sh-4.2$ cd /nexus-data/
sh-4.2$ ls -l
total 72
drwxr-sr-x   3 nexus nexus  4096 Mar 13 09:00 blobs
drwxr-sr-x 269 nexus nexus 12288 Mar 13 08:59 cache
drwxr-sr-x   8 nexus nexus  4096 Mar 13 09:00 db
drwxr-sr-x   3 nexus nexus  4096 Mar 13 09:00 elasticsearch
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 etc
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 generated-bundles
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 instances
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 javaprefs
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 kar
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 keystores
-rw-r--r--   1 nexus nexus     8 Mar 13 08:59 lock
drwxr-sr-x   2 nexus nexus  4096 Mar 13 09:00 log
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 orient
-rw-r--r--   1 nexus nexus     5 Mar 13 08:59 port
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 restore-from-backup
drwxr-sr-x   7 nexus nexus  4096 Mar 13 09:00 tmp
sh-4.2$ touch test-file
sh-4.2$ ls -l test-file
-rw-r--r-- 1 nexus nexus 0 Mar 13 09:13 test-file
sh-4.2$ mkdir test-dir
sh-4.2$ ls -l test-dir
total 0
sh-4.2$ ls -ld test-dir
drwxr-sr-x 2 nexus nexus 4096 Mar 13 09:13 test-dir

이것이 SetGID의 힘입니다. :)

이제 서비스가 작동하는지 확인하십시오. minikube를 사용하여 kubernetes 클러스터를 실행합니다.

chris@XPS-13-9350 ~ $ minikube service nexus3-service --url
http://192.168.39.95:30390
chris@XPS-13-9350 ~ $ curl -u admin:admin123 http://192.168.39.95:30390/service/metrics/ping
pong

서비스가 예상대로 작동합니다.


0

Torsten Bronger의견 과 관련 하여 포드 사양의 볼륨 배열에서 ConfigMaps 및 Secrets를 구성 할 때 defaultMode속성을 사용하여 원하는 액세스를 허용하는 권한을 지정할 수 있으므로 그룹 및 사용자 소유권을 설정할 수는 없습니다. 포드의 프로세스가 해당 마운트의 파일을 읽을 수 있도록합니다. 비밀 또는 구성 맵에 쓰는 것은 실제로 의미가 없으며 기본 권한 모드는 755이므로 읽기는 어떤 사용자에게도 문제가되지 않습니다.

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