본문 바로가기
Amazon AWS/EKS

Configmap, Secret 사용하기

by 홍띠 2022. 10. 16.

대부분의 어플리케이션은 동작하기 위해서 몇가지 설정값이 필요 하다. Pod 배포 후에도 계속해서 수정 가능성이 있는 설정 값들은 Pod 외부에서 관리하도록 하는것이 효율적이다. Pod를 구성하는 Docker image는 한번 build되고 나면 변경이 불가능하므로, Image 내부에 설정파일을 두면 설정이 변경 될 때마다 다시 Build해야 하기 때문이다.쿠버네티스에서는 이렇게 설정값을 따로 관리하도록 Configmap과 Secret 기능을 제공한다.


Configmap 설정

Configmap에 환경변수를 직접 설정해서 사용할 수도 있지만, 특정 설정파일을 Configmap으로 사용 할 수도 있다. server.xml, fluentd.conf와 같이 설정 파일 자체를 관리 해야 할때에는 환경변수로 지정하는것 보다, 설정파일 자체를 컨테이너 외부에서 관리하는것이 효율 적이라고 생각 되어 파일 자체를 configmap 으로 설정하였다.

 

1. 파일을 이용하여 컨피그맵 생성

<file name>에 컨피그맵으로 설정할 파일의 로컬 경로를 입력한다.

kubectl create configmap <configmap name> --from-file <file name> -n <namespace>

2. 생성한 컨피그맵 확인

kubectl describe configmap <configmap name>

3. deployment.yml 에 생성한 컨피그맵을 파드 내 원하는 위치에 마운트 설정을 해준다.

⚠️ mountPath와 함께 subPath를 사용하였다.
만약에 subPath를 지정하지 않고 마운트 하게 되면… 기존 톰캣의 ./tomcat/conf 안의 파일이 모두 삭제 되고 마운트되는 server.xml 파일만 생기게 된다..!
apiVersion: apps/v1
kind: Deployment
...
    spec:
      containers:
        volumeMounts:
          - name: configmap-server-config
      		mountPath: /usr/local/tomcat/conf
            subPath: server.xml
      volumes:
        - name: configmap-server-config
          configMap: 
            name: <configmap name>
...

Secret 설정

secret은 configmap과 거의 동일한 기능이나, 비밀번호, 토큰과 같은 민감한 데이터를 암호화하여 저장한다. 따라서, 일반 텍스트로 된 Configmap보다 안전하게 데이터를 보관할 수 있다. secret은 configmap과 동일하게 환경변수로, 파일로 모두 설정 할 수 있다.

이번에는 .env파일을 이용해서 각 변수들을 키(파일)-값(내용) 형태로 파드에 저장하도록 한다.

 

1. .env 파일 생성

#rds-config.env
url=jdbc:postgresql://xxxxxxxx.ap-northeast-2.rds.amazonaws.com:5432/database
username=xxxxxx
password=xxxxxxxx

2. secret 생성

#kubectl create secret <secret Type> <Secret Name> <DATA> -n <namespace>
kubectl create secret generic rds-secret --from-env-file demo/config/config-file/rds-config.env -n namespace

3. 생성한 secret 확인

$ kubectl describe secret <secret name> -n <namespace>
Name:         rds-secret
Namespace:    namespace
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  9 bytes
url:       95 bytes
username:  8 bytes

4. deployment.yml 설정은 configmap과 동일하게 해주면 된다.

apiVersion: apps/v1
kind: Deployment
...
    spec:
      containers:
        volumeMounts:
          - name: rds-secret
      		mountPath: /usr/local/config
      volumes:
        - name: rds-secret
          secret: 
            secretName: rds-secret
...