본문 바로가기
CICD

[Kubernetes] ConfigMap, Secret(기본 오브젝트)

by 장중앙 2022. 1. 5.

ConfigMap이란

일반적으로 컨테이너를 사용할 때, 개발과 서비스 사이의 차이로 발생하는 문제점을 방지하기 위해 Dev용, Production용 컨테이너는 같아야함

하지만, 각각의 컨테이너가 서로 다른 설정이 필요한 경우가 있음 - ex) 개발용의 Test용 DB

이처럼 서비스마다 다른 설정이 필요할 때 사용하는 것이 ConfigMap이며 환경 설정을 컨테이너와 분리해서 제공하는 방식으로 개발/서비스와 같은 다양한 방식으로 사용가능

  • Key, Value로 구성된 탬플릿을 할당하는 것으로 사용
    • Value값은 기본적으로 String
      • Boolean값을 사용하기 위해서는 'true'와 같이 ''로 묶어줘야함

 

 

Secret이란

Password, OAuth Token, SSH KEY와 같은 민감한 정보를 저장하는 용도로 사용

이러한 정보들을 컨테이너 안에 저장하지 않고 별도로 보관, 실제 Pod를 실행할때 Key, Value로 구성된 탬플릿으로 컨테이너에 제공

ConfigMap을 포함한 일반적인 오브젝트의 값은 쿠버네티스 DB에 저장되는 반면, Secret은 메모리에 저장되며 1Mbyte의 제한을 가짐 -> 너무 많은 Secret은 시스템 환경에 영향을 줌

 

 

ConfigMap, Secret이 필요한 이유

Service에는 일반 접근, 보안 접근을 지원

  • 개발 환경에서는 보안 접근을 해제 가능
  • 보안 접근을 한다면 접근 유저와 키를 설정 가능 

상황에 맞는 값 몇가지 때문에 이미지를 보관하기에는 비효율적

하나의 이미지로 모든 환경에 사용가능

 

 

ConfigMap, Secret의 3가지 사용방법

1. 상수를 환경변수로 사용

Secret에서는 바이너리 파일을 value로 구성하기도 하므로 Base64변환을 이용함

Secret은 dashboard환경에서 생성할 때 value값을 Base64로 변환해서 기입해야함

               kubernetes 커맨드의 경우에는 자동으로 변환(원본 값만 가압하면 됨)

2. 파일을 환경변수로 사용

* Pod 생성 후, ~.txt파일을 수정해도 수정된 값이 Pod에 반영되지 않음 - Pod가 재생성되어야지만 수정된 값 반영

3. Pod내부의 파일로 마운트해 사용

* 마운트는 원본과 연결되있기 때문에 원본 파일인 ~.txt가 수정되면 Pod에도 반영됨

 


ConfigMap, Secret의 3가지 실습

1. 상수를 환경변수로 사용

ConfigMap yaml 파일 작성 및 생성

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-dev
data:
  SSH: 'false'
  User: dev

생성된 ConfigMap 확인

 

Secret yaml 파일 작성 및 생성

apiVersion: v1
kind: Secret
metadata:
  name: sec-dev
data:
  Key: MTIzNA==

생성된 Secret 확인

  - "1234"를 Base64로 변환하여 "MTIzNA=="로 입력했기 때문에 데이터에는 "1234"로 표기됨

 

 

ConfigMap과 Secret을 적용한 Pod 생성 yaml 파일 작성

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container
    image: kubetm/init
    envFrom:
    - configMapRef:
        name: cm-dev
    - secretRef:
        name: sec-dev

생성된 Pod

Pod내에서 환경설정 값 확인


2. 파일을 환경변수로 사용

Master node에서 ConfigMap, Secret 파일 생성(대쉬보드에서는 지원 X) 

 

ConfigMap 파일 생성 및 확인

Secret 파일 생성 및 확인

ConfigMap, Secret 파일을 매칭하여 Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-file
spec:
  containers:
  - name: container
    image: kubetm/init
    env:
    - name: file-c
      valueFrom:
        configMapKeyRef:
          name: cm-file
          key: file-c.txt
    - name: file-s
      valueFrom:
        secretKeyRef:
          name: sec-file
          key: file-s.txt

Pod 확인 및 Pod 내에서 매칭된 ConfigMap, Secret의 환경설정값 확인

 

변경된 ConfigMap 반역 여부 확인

ConfigMap 데이터 변경 Content -> Content1234

Pod내에서 환경설정 값을 확인

  - "Content"로 이전의 ConfigMap의 데이터를 유지 -> Pod를 재생성해야만 반영되어 업데이트됨


3. Pod내부의 파일로 마운트해 사용

2에서 만들어진 ConfigMap을 Volume로 마운팅

apiVersion: v1
kind: Pod
metadata:
  name: pod-mount
spec:
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: file-volume
      mountPath: /mount
  volumes:
  - name: file-volume
    configMap:
      name: cm-file

생성된 Pod 확인 

Pod내에서 마운트된 ConfigMap 확인

 

 

변경된 ConfigMap 반역 여부 확인

ConfigMap 데이터 변경 Content -> Content1234

Pod내에서 환경설정 값을 확인

  - "Content123"로 변경된 ConfigMap의 데이터를 반영 -> 마운트했기 때문에 원본의 변화를 반영함

댓글