ConfigMap & Secret

일반적으로 배포 환경은 1~N개의 환경을 가진다. 개인이 운영하는 서비스에서도 최소한 개발 환경과 운영 환경으로 나눌 필요가 있고 회사에서 담담하는 서비스도 파트에서만 개발계와 검증계 2 가지 환경으로 운영하며 협력하는 파트와 개발계 / 검증계 / 유지보수계 / 운영계 총 4개의 환경으로 운영한다. 각 환경마다 환경 변수나 설정 값들이 다 다를 것인데 이때 쿠버네티스에서 환경 별로 값들을 다르게 할 수 있는 용도로 ConfigMap과 Secret을 제공한다.

1. ConfigMap

ConfigMap은 Key-Value 쌍의 형태로 데이터를 저장하는 데 사용하는 쿠버네티스 오브젝트이다. 보통 컨피그맵을 생성하고 파드에 해당 컨피그맵을 주입하는 방식으로 파드에서 컨피그맵을 사용한다. 파다의 환경변수에 컨피그맵의 값을 바인딩하거나 파드 볼륨을 생성해서 볼륨 마운팅을 통해 파일 형태로 컨피그맵을 사용할 수 있다.

2. Secret

컨피그맵은 평문을 사용하기 때문에 암호, 토큰, 키 등 중요한 정보를 직접 적는 것은 바람직하지 않다. 컨피그맵과 유사하지만 특히 기밀 데이터를 보관하기 위해서 사용된다. 인코딩은 base64를 이용해서 하게 되는데 base64는 누구나 디코딩 할 수 있기 때문에 완벽하게 안전다고 할 수는 없다. 하지만 평문보다는 안전한 것은 맞으며 추가적인 플러그인을 통해서 암호화를 하는 것이 좋다. 기본 데이터 저장소 etcd에 암호화되지 않은 상태로 저장되기 때문에 etcd에 접근을 제한하는 것 역시 중요하다. 특히, 외부에서는 접속하는 것을 제한하는 것 좋다.

ConfigMap & Secret 사용하는 3가지 방법

1. Literal

ConfigMap을 yml파일에 정의하거나 커맨드라인 입력을 통해 생성하는 방법이다.

kubectl create configmap hello-cm --from-literal=language=java

apiVersion: v1
kind: ConfigMap
metadata:
  name: literal-cm
data:
  today: monday
  month: october

2. File

각각의 환경 변수들을 공유할 수 있지만 파일 형태로 만들어서 Pod에 공유하는 방법도 있다.
pod1이 참조하고 있는 file-c.txt의 내용이 바뀌어도 Pod의 환경변수는 변하지 않는다. Pod가 재성성 되어야만 바뀐 ConfigMap이 적용된다.

kubectl create configmap cm-file --from-file=./properties/profile.properties

key는 파일명이며 value는 파일 내용이다.

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: container
    image: example/test
    env:
    - name: config-env
      valueFrom:
        configMapKeyRef:
          name: file-cm
          key: config.txt

3. VolumeMount

Pod생성 시 mount경로를 정의하고, 해당 경로 안에 ConfigMap파일을 연결시켜 주는 방식이다. File을 ConfigMap으로 설정하는 것과 마찬가지로 ConfigMap을 정의해둔다. 생성하고자 하는 Pod의 volumes에 volume의 이름과 사용하고자 하는 configMap의 이름을 적어준다. containers 부분에 마운트할 볼륨과 마운트 경로를 적어주면 된다. 위의 File을 ConfigMap으로 설정하는 것과 달리 파일을 내용이 변하게 되면 Pod의 재생성 없이도 변경된 데이터를 즉시 반영할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
  - name: container
    image: example/test
    volumeMounts:
    - name: volume1
      mountPath: /mount
  volumes:
  - name: volume1
    configMap:
      name: file-cm

Leave a Comment