본문 바로가기

쿠버네티스

3. 쿠버네티스에서 애플리케이션을 동작시키는 구조 - 4

3.4 설정 정보 등을 안전하게 저장하는 구조

3.4.1 환경 변숫값 전달

모던 애플리케이션을 개발하기 위한 방법론으로 The Twelve-Factor App이 있다. 그 중에 ‘애플리케이션 설정 정보는 환경 병수에 저장한다.’ 라는 정의가 있다. 이러한 정의를 두는 이유는 개발 환경, 스테이징 환경, 서비스 환경 등에서 취급하는 설정 정보가 달라 다시 빌드하는 일이 없도록 하기 위함이다. 쿠버테이스에서는 이와 같은 설정 정보를 파드의 환경 변수로 안전하게 전달하는 구조가 있다.

The Twelve-Factor App

 

The Twelve-Factor App

Background The contributors to this document have been directly involved in the development and deployment of hundreds of apps, and indirectly witnessed the development, operation, and scaling of hundreds of thousands of apps via our work on the Heroku pla

12factor.net

 

3.4.2 시크릿을 이용한 비밀 정보 전달

쿠버네티스에서는 시크릿(Secret) 리소스를 이용해, 정보를 저장하고 참조할 수 있게 한다. 예제 애플리케이션은 데이터 접속 문자열, 사용자 이름, 비밀번호의 시크릿과 AWS CLI 액세스 키 ID, 비밀 액세스 키의 시크릿 총 두 개의 시크릿을 사용했다. 이 정보는 시크릿에 저장되어 있다가 필요할 때 참조되서 사용되었다. 그리고 파드의 매니페스트에서는 해당 시크릿에서 값을 읽어 들여 파드 내부의 환경 변수에 설정하도록 정의한다.

 

예제 애플리케이션에서 사용한 시크릿 매니페스트인 21_db_config_k8s.yaml.template는 다음과 같다.

apiVersion: v1
kind: Secret # 시크릿 리소스를 사용한다고 정의한다.
type: Opaque # key-value 형식으로 등록하고 싶은 경우 Opaque라 정으이한다.
metadata:
  name: db-config # 시크릿 리소스 이름이다.
stringData: # 실제 등록할 문자열 데이터를 key-value 형식으로 설정한다.
  db-url: ${DB_URL}
  db-username: mywork
  db-password: ${DB_PASSWORD}

💡 문자열을 등록할 경우 base64로 인코딩되어 등록된다.

 

위를 통해 등록된 시크릿은 디플로이먼트를 배포할 때 사용되었다. 아래는 디플로이먼트의 매니페스트 파일 22_deployment_backend-app_k8s.yaml.template의 일부다.

...
        env:
        - name: DB_URL # 파드에서 설정할 환경변수 이름이다.
          valueFrom:
            secretKeyRef: # 시크릿에서 값을 참조할 것을 선언한다.
              key: db-url # 시크릿 데이터 키 이름이다.
              name: db-config # 시크릿 리소스 이름이다.
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              key: db-username
              name: db-config
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              key: db-password
               name: db-config

파드의 환경 변수를 환인해 보면 매핑된 값이 들어가 있다.

 

3.4.3 시크릿을 사용할 때 주의할 점

쿠버네트시스에 등록된 시크릿은 값을 직접 참조할 수 없게 되어 있다. 그러나, Base64로 인코딩 되어 있는 경우 해독할 수도 있다. 때문에, 시크릿에 저장해 두는 것만으로는 보안이라 할 수 없다.

 

시크릿 값은 해독의 위험이 있을 수 잇기 때문에 공개하지 않도록 한다.

 

3.4.4 컨피그맵을 이용한 설정 정보 전달

설정값을 전달하는 방법으로 시크릿만 있는 것이 아니다. 비밀 정보가 아니라면 시크릿을 이용해 암호화할 필요가 없기 때문에 평문으로 등록해도 된다. 이런 용도로 컨피그맵(ConfigMap)을 이용한다.

 

예제 애플리케이션에서 사용한 은 다음과 같다.

apiVersion: v1
kind: ConfigMap # 컨피그맵 리소스 정의를 의미한다.
metadata:
  name: batch-app-config # 컨피그맵 리소스 이름이다.
data: # 실제 등록할 데이터를 key-value 형식으로 설정한다.
  bucket-name: eks-work-batch-${BUCKET_SUFFIX}
  folder-name: locationData
  batch-run: "true"
  aws-region: ap-northeast-2

 

아래는 컨피그맵을 사용하는 의 일부 이다.

...
            env:
            ...
              valueFrom:
                configMapKeyRef: # 컨피그 맵을 참조한다.
                  key: aws-region
                  name: batch-app-config
            - name: SAMPLE_APP_BATCH_BUCKET_NAME

 

컨피그맵은 시크릿과 달리 kubectl 명령어로 참조할 수 있다.