[Kubernetes] ConfigMap과 Secret?

Dev StoryTeller·2025년 1월 17일

인프라 알아보기

목록 보기
8/12

해당 글은 쿠버네티스 교과서 책과 공식 홈페이지(https://kubernetes.io/ko/)를 참조하여 작성되었습니다

필요한 이유?

언제든지 바뀔 수 있는 설정값들이나 환경별(개발, 테스트, 운영 등)로 다른 값들은 직접 설정해줘야 하는 값 이기에 애플리케이션이 자체적으로 가지고있기 어렵다
때문에 그러한 값들은 외부에서 주입해주는 방식으로 사용하게 되는데, 이를 위한 리소스가 바로 컨피그맵과 비밀값이다
해당 리소스는 클러스터 내에서 독립적인 위치에 보관되기 때문에, 파드에서 얼마든지 참조하여 읽어올 수 있다


사용방법?

적합한 용도의 오브젝트가 있는데 굳이 다른 방법을 찾을 필요가 없다. 우선 컨피그맵과 시크릿 오브젝트를 만드는 것을 추천한다

컨피그맵과 시크릿 오브젝트를 생성했다면, 이제 파드는 이를 참조하여 자유롭게 사용할 수 있다
애플리케이션 필요에 따라 컨테이너 환경변수로 설정하든, 그대로 파일을 가져오든 마음대로 구현하면 된다
(환경변수란 모든 운영체제가 가지고 있는 핵심 기능으로, 모든 애플리케이션이 이를 읽을 수 있다. 애플리케이션이 외부로부터 값을 주입받을 수 있는 가장 기본적이고 간편한 방법이라고 할 수 있다)

요약하자면 사용방법은 다음 2단계 절차로 나뉜다고 할 수 있다

어떻게 리소스를 생성할 것인지?
어떻게 애플리케이션이 사용할 것인지?

그럼 컨피그맵과 시크릿에 대해 알아보도록 하자


컨피그맵 이란?

특별한 무언가가 있는 것은 아니고, 단순히 특정 값들(위에서 말한 설정값 등)을 저장하기 위한 리소스이다
Key-value, plain text, binary 등 다양한 포맷을 지원하며, 읽기 전용이기 때문에 여러 파드에서 사용할 수 있다


생성방법

  • ConfigMap 오브젝트 생성

사용방법

  • 컨테이너 환경 변수로 설정
  • ConfigMap 오브젝트 참조(envFrom.configMapRef)
  • 파일 자체를 가져옴
  • 환경변수는 컨피그맵을 key-value로 변환하여 가져오는 방식이라면, 이건 파일을 통째로 가져오는 방식이다 (application.yml, babel.config.ts 등)
  • 독립 리소스인 컨피그맵을 파드 내에 볼륨으로 마운트하는 방식을 사용한다
    (파드 내에 볼륨 생성 —> 컨테이너에 마운트 —> 애플리케이션은 마운트된 경로에서 파일을 읽음)

비밀값(Secret)

컨피그맵과 비슷한 리소스이나, 민감한 정보를 다루기에 클러스터 내부에서 별도로 관리된다
해당 오브젝트를 생성하면 사용할 노드에만 전달되며, 디스크에 저장하는 것이 아닌 메모리에만 담긴다
그리고 전달 및 저장할 때 모두 암호화된 값이지만 객체에 접근 권한이 있다면 Base64 인코딩된 값을 볼 수 있다
즉 비밀값이지만 기본적으로 난독화 평문으로 존재하고 사용할 때 암호화로 주고받는다


생성방법

  • Secret 오브젝트 생성

사용방법

  • 컨테이너 환경 변수로 설정
  • 가장 간단한 방법이긴 하나, 환경변수는 파드에 접속 가능하면 누구나 볼 수 있기 때문에 추천하지 않는다. 그리고 시크릿 값은 평문으로 저장되기에 더더욱 위험하다
  • 오브젝트를 그대로 가져옴 - envFrom.secretRef
  • 특정 값들만 가져옴 - env.valueFrom.secretKeyRef
  • 파일 자체를 가져옴
  • 컨피그맵과 동일하다. crt, pem 등 인증서 파일을 가져올 수도 있고, ID/PW 등 인증정보를 가져와 환경변수로 활용할 수도 있다
  • 또한 시크릿 볼륨은 임시 볼륨과 같이 휘발성 메모리에 저장되기에 좀 더 안전성이 보장된다
    (파드 내에 볼륨 생성 —> 컨테이너에 마운트 —> 애플리케이션은 마운트된 경로에서 파일을 읽음)

시크릿 안전하게 사용하기?

역시 항상 문제는 민감정보를 어떻게 다루느냐이다
시크릿 오브젝트는 기본적으로 Base64 평문으로 저장되고 누구나 확인할 수 있기에 비밀의 의미가 없다
그리고 파드는 결국 해당 값을 가져다 쓸텐데, 이 과정에서 노출이 없는지도 고민해봐야 한다
이 문제는 내 입장이 무엇인지에 따라 다르다

클라우드 관리자

  • 순수 시크릿만을 사용한다면 당연히 안전하지 않다
  • 시크릿 오브젝트를 안전하게 보관할 수 있는 방법을 고민해봐야 한다
  • 시크릿 값이 평문이 아닌 암호화로 저장되도록 처리한다던지 등

개발자

  • 잘 저장되어 있는 시크릿을 보안을 지켜 사용할 수 있는 방법을 고민해봐야 한다
  • Secret 오브젝트를 파일로 작성하지 않는다던지,
  • 파드 내에 시크릿 볼륨을 생성했다면 접근 권한을 제한한다던지
  • Yaml 파일로 오브젝트를 구성했다면 해당 파일의 공유를 제한한다던지 등
profile
개발을 이야기하는 개발자입니다

0개의 댓글