컨피그맵이나 시크릿의 데이터를 파드에서 사용할 때 볼륨 마운트 방식으로 사용할 수 있다.
이때 마운트된 볼륨 내의 파일들에 대해서 permission 을 설정해 줄 수 있다. 컨피그맵과 시크릿 모두 기본 퍼미션은 0644(rw-r--r--)이다. 퍼미션은 매니페스트 파일로 작성할 때 8진수 퍼미션 값을 10진수로 변환하여 기입하여야 한다.
| 8진수(Octal Mode) | 10진수 | rwx 표기(Symbolic Mode) |
| 0400 | 256 | r-------- |
| 0600 | 384 | rw------- |
| 0644 | 420 | rw-r--r-- |
| 0700 | 448 | rwx------ |
| 0755 | 493 | rwxr-xr-x |
| 0777 | 511 | rwxrwxrwx |
1. ConfiMap 예시
아래의 매니페스트는 컨피그맵의 쉘 스크립트 파일을 0755 권한으로 마운트한다.
apiVersion: v1
kind: Pod
metadata:
name: sample-configmap-scripts
spec:
containers:
- name: configmap-container
image: nginx:1.27
command: ["/config/test.sh"]
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: sample-configmap
items:
- key: test.sh
path: test.sh
mode: 493 # 0755
아래 커맨드로 쉘 스크립트 실행을 확인해본다.
$ kubectl apply -f sample-configmap-scripts.yaml
# 권한 확인
$ kubectl exec -it sample-configmap-scripts -- ls -l /config/test.sh
lrwxrwxrwx 1 root root 14 Jan 17 08:01 /config/test.sh -> ..data/test.sh
# 실행됨 확인
$ kubectl logs sample-configmap-scripts
Hello, kubernetes
그런데, 권한 확인을 해보니 0755 권한은 rwxr-xr-x 이어야 하는데 rwxrwxrwx 로 출력된다. 쿠버네티스에서 Secret 이나 ConfigMap 을 볼륨으로 마운트하면 Atomic Reference Updates 라는 메커니즘에 의해 파일들이 복잡한 심볼릭 링크 구조를 가지기 때문이다. 심볼릭 링크가 걸린 경로인 "..data/test.sh" 는 실제 데이터 경로가 아니라 쿠버네티스가 데이터 업데이트시 원자성을 보장하기 위해 만든 중간 경로이다. 예를 들어 하나의 시크릿에 10개의 key-value 가 존재하고, 각각의 key-value 를 파일로 만들어서 파드에 볼륨 마운트 한다고 치자. 어느순간 시크릿이 수정되어 10개의 마운트된 파일들이 모두 수정되어야 하는데, 그 중 5개만 수정된 상태에서 애플리케이션에서 마운트된 경로에 접근했을 경우 5개의 파일은 이전버전의 시크릿을, 5개의 파일은 현재버전의 시크릿을 읽게 되어 일관성이 무너지게 된다. 따라서 10개의 파일을 모두 업데이트 한 후, 어느 시점에 한번에 마운트 링크를 변경시키는 방식을 사용하는 것이다. 실제로 마운트 경로의 파일을 모두 출력해보면 "..data" 라는 심볼릭 링크가 있고, 다시 타임스탬프 형식으로 이루어진 디렉토리를 참조하는 형태임을 알 수 있다. 복잡한 심볼릭 링크를 따라가서 실제 파일의 경로를 보려면 -L 옵션(dereference)을 사용한다.
# 심볼릭 링크가 가리키는 중간 심볼릭 링크와 실제 데이터가 저장된 디렉토리를 볼 수 있다.
$ kubectl exec -it sample-configmap-scripts -- ls -alF /config
total 12
drwxrwxrwx 3 root root 4096 Jan 17 08:01 ./
drwxr-xr-x 1 root root 4096 Jan 17 08:01 ../
drwxr-xr-x 2 root root 4096 Jan 17 08:01 ..2026_01_17_08_01_01.3453801296/
lrwxrwxrwx 1 root root 32 Jan 17 08:01 ..data -> ..2026_01_17_08_01_01.3453801296/
lrwxrwxrwx 1 root root 14 Jan 17 08:01 test.sh -> ..data/test.sh*
# -L 옵션으로 심볼릭 링크를 쭉 따라가서 원본 파일 정보를 출력할 수 있다.
$ kubectl exec -it sample-configmap-scripts -- ls -lL /config/test.sh
-rwxr-xr-x 1 root root 52 Jan 17 08:01 /config/test.sh
2. Secret 예시
아래의 매니페스트는 시크릿의 모든 key-value 를 0400 권한으로 마운트한다.
apiVersion: v1
kind: Pod
metadata:
name: sample-secret-secure
spec:
containers:
- name: secret-container
image: nginx:1.27
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
secret:
secretName: sample-db-auth
defaultMode: 256
아래 커맨드로 권한을 확인해본다.
$ kubectl exec -it sample-secret-secure -- ls -l /config/..data/
total 8
-r-------- 1 root root 12 Jan 25 07:39 password
-r-------- 1 root root 4 Jan 25 07:39 username
3. 동적 업데이트
위의 컨피그맵 예시에서 사용한 sample-configmap 의 모든 키를 파드에 볼륨 마운트 한 후, 컨피그맵의 thread 값만 "16" -> "32" 로 변경한 후 파드 재시작 없이도 변경된 값이 마운트 경로에서도 변경되는지 확인해보자.
먼저 아래 매니페스트를 적용하여 sample-configmap 컨피그맵의 모든 key-value 를 마운트한다.
apiVersion: v1
kind: Pod
metadata:
name: sample-configmap-multi-volume
spec:
containers:
- name: configmap-container
image: nginx:1.27
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: sample-configmap
$ kubectl exec -it sample-configmap-multi-volume -- cat /config/thread
16
이 상태에서 sample-configmap 매니페스트의 thread 값을 32로 변경 후 apply 한다.
기본 업데이트 간격은 60초로 설정되어 있기 때문에 바로 변경되지 않더라도 최대 60초 후에는 변경된 것을 확인할 수 있다.
$ kubectl exec -it sample-configmap-multi-volume -- cat /config/thread
32
4. 변경 불가능한 컨피그맵/시크릿 만들기
아래처럼 매니페스트에 immutable: true 항목을 추가하면 컨피그맵이나 시크릿을 한번 생성하면 도중에 절대 변경 불가능하도록 만들 수 있다.
apiVersion: v1
kind: Secret
metadata:
name: my-secure-config
type: Opaque
immutable: true # <--- 이 항목을 추가합니다.
data:
api-key: AAA
kubectl apply, patch, edit 같은 명령어는 물론 어떤 방법으로도 data 를 변경할 수 없다. 데이터를 변경하려면 리소스를 삭제 후 변경된 data 를 포함하여 재생성하여야만 한다. 또한, immutable 항목 자체도 한번 생성하면 변경 불가능하다. 아래와 같은 이점이 있다.
- Kubelet 부하 감소: 쿠버네티스의 워커 노드(Kubelet)는 Secret이 변경되었는지 주기적으로 API Server를 호출하여 감시(Watch)한다. immutable: true로 설정된 리소스는 변경되지 않음을 보장받으므로, Kubelet이 감시를 중단하여 클러스터 전체의 부하를 줄일 수 있다.
'Kubernetes' 카테고리의 다른 글
| [Kubernetes] Volume 이해와 종류 (0) | 2026.01.31 |
|---|---|
| [Kubernetes] ConfigMap 사용법 2가지(환경 변수로 설정, 볼륨으로 마운트) (0) | 2026.01.11 |
| [Kubernets] ConfigMap 을 생성하는 3가지 방법 (0) | 2026.01.11 |
| [Kubernetes] 운영중에 Secret 을 업데이트하기 (0) | 2026.01.11 |
| [Kubernets] Secret 사용법 2가지(환경 변수로 설정, 볼륨으로 마운트) (0) | 2026.01.10 |
