컨테이너화된 애플리케이션 환경에서 불변성은 중요한 개념입니다. 컨테이너는 본질적으로 불변성을 갖도록 설계되었지만, 실제 운영에서는 컨테이너를 직접 수정할 수 있는 여러 방법이 존재합니다. 이번 글에서는 쿠버네티스(Kubernetes) 파드가 불변성을 유지하도록 하는 다양한 방법을 다루겠습니다.
컨테이너는 기본적으로 불변성을 갖고 있지만, 실제로는 컨테이너 내부를 수정할 수 있습니다. 예를 들어, 파일을 파드에 직접 복사하거나, 컨테이너 내부에 셀을 열어 변경할 수 있습니다. 이러한 변경을 방지하기 위해서는 어떻게 해야 할까요? 한 가지 방법은 파드가 시작된 후 파일 시스템에 쓰기 작업을 할 수 없도록 하는 것입니다.
파드의 불변성을 유지하기 위해 쿠버네티스의 시큐리티 컨텍스트(security context)를 사용할 수 있습니다. Nginx 파드 정의 파일을 예로 들어 설명하겠습니다. 컨테이너 레벨에서 시큐리티 컨텍스트를 사용하여 루트 파일 시스템을 읽기 전용으로 설정할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
securityContext:
readOnlyRootFilesystem: true
위 설정을 적용하면 Nginx 컨테이너는 읽기 전용 루트 파일 시스템으로 시작되어, 컨테이너 내부에 파일을 복사하거나 쓰는 것이 불가능해집니다.
루트 파일 시스템을 읽기 전용으로 설정하면 애플리케이션이 정상적으로 작동하지 않을 수 있습니다. 예를 들어, Nginx /var/run
디렉토리와 /var/cache/nginx
디렉토리에 쓰기를 해야 합니다. 이를 해결하기 위해 emptyDir 타입의 볼륨을 해당 디렉토리로 마운트할 수 잇습니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
securityContext:
readOnlyRootFilesystem: true
volumeMounts:
- mountPath: /var/run
name: run
- mountPath: /var/cache/nginx
name: cache
volumes:
- name: run
emptyDir: {}
- name: cache
emptyDir: {}
이렇게 하면 /var/run
과 /var/cache/nginx
디렉토리에 쓰기가 가능해지며, 나머지 루트 파일 시스템은 여전히 읽기 전용 상태로 유지됩니다.
'privileged' 플래그를 사용하면 컨테이너가 호스트 시스템에 광범위한 권한을 가지게 되어, 컨테이너의 불변성이 깨질 수 있습니다. 예를 들어, 다음과 같이 설정하면 루트 파일 시스템이 읽기 전용임에도 불구하고 호스트 머신에 변경을 가할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
securityContext:
readOnlyRootFilesystem: true
privileged: true
이 설정 파일을 사용하여 Nginx 컨테이너를 생성하면, 루트 파일 시스템은 여전히 읽기 전용이지만, /proc
파일 시스템을 통해 호스트의 설정을 변경할 수 있습니다. 이는 보안상의 큰 위험을 초래할 수 있습니다.
쿠버네티스 환경에서 파드의 불변성을 유지하는 것은 보안과 안정성을 위한 필수 요소입니다. 이번 글을 통해 불변성을 유지하는 다양한 방법을 이해하고 적용해 보시길 바랍니다.