공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/클라우드

[IBM Cloud 강의번역 프로젝트] - ch3-4. ConfigMaps and Secrets

inspirit941 2020. 9. 11. 15:48
반응형

IBM Cloud 1기 활동 - 강의번역 프로젝트.

원본 강의

cognitiveclass.ai/courses/kubernetes-course

 

Kubernetes and containers on IBM Cloud - Free Kubernetes course by IBM Cognitive Class

About this course Containers and Cloud Native are the most significant invention in IT since the introduction of virtualization. Everyone from a small startup to a large multinational corporation is transitioning to this technology and they are looking for

cognitiveclass.ai

강의의 한글자막 제공을 위해 srt 파일로 번역하는 프로젝트를 진행 중입니다.

문맥이 어색하거나 내용이 잘못되었다고 느껴지시면 댓글로 남겨주세요.


 

스크린샷 2020-09-08 오전 11 51 48

이 강의는 configuration의 저장에 관련된 내용입니다.

 

개발자라면, configuration 변수를 코드 안에 하드코딩하는 방법이 좋지 않다는 점을 알고 있을 것입니다. 보통 이 변수들은 따로 분리해서, configuration를 변경할 때 코드가 영향을 받지 않도록 하죠. 이런 종류의 변수로는 크게 민감하지 않은 환경변수 (예컨대 dev, test, prod) 도 있고, API 키값이나 계정 id같은 중요한 정보도 포함됩니다.

 

스크린샷 2020-09-08 오전 11 52 38

 

이전 강의에서 다뤘던 예시를 다시 보겠습니다. 이 코드에는 기본값으로 설정된 변수가 두 개 있습니다. 각각 하드코딩된 값 8080과 "Hello world!"입니다. 이 값들은 만약 환경변수가 있다면, process.env.PORT와 process.env.MESSAGE라는 값으로 덮어씌워질 것입니다.

 

MESSAGE 변수 값을 ConfigMap에 입력하고, Hello world 문자열에 덮어씌우겠습니다. 이제, 이 문자열은 스크린샷에서 볼 수 있듯 index 페이지에 표시됩니다. 여러 가지 방법으로 이렇게 적용할 수 있습니다.

어떻게 ConfigMap을 Deployment에 생성하고 적용하는지 배우기에 앞서, ConfigMap이 무엇이며 어떤 값을 사용할 수 있는지 보겠습니다.

 

 

스크린샷 2020-09-08 오후 12 01 48

 

 

ConfigMap은 pod나 Deployment에 configuration 설정값을 제공합니다. 따라서 애플리케이션에 필요한 데이터를 하드코딩하는 걸 방지해 줍니다. ConfigMap과 Secrets을 여러 Deployment에 재활용하는 방식으로 여러 개의 배포파일과 배포환경 간 낮은 결합력을 유지할 수 있습니다. Secrets는 ConfigMap과 비슷하지만, 보다 중요한 정보를 저장하는 용도입니다.

 

ConfigMap을 생성하는 방법에는 여러 가지가 있습니다.

  • 문자열 사용
  • 기존 속성값을 활용하거나 key - value 형태의 파일 사용하기
  • ConfigMap yaml 파일 활용하기;

첫 번째와 두 번째 방법은 yaml 파일을 생성하는 방법들이며 다음 세션에서 구체적으로 다룰 예정입니다. Deployment나 pod은 "configMapKeyRef"라는 환경변수 값을 토대로, 또는 볼륨 플러그인을 활용해 파일을 마운트하는 식으로 configMap을 읽어들입니다.

ConfigMap과 Secret는 pod이나 Deployment가 실행되기 직전에 값을 읽어들여 적용합니다.

 

스크린샷 2020-09-08 오후 12 05 12

 

화면에 표시된 것처럼, 환경변수는 yaml파일에 직접 적용할 수도 있습니다. MESSAGE 변수는 자바스크립트 파일에서 process.env.MESSAGE 의 형태로 호출됩니다. 이렇게 Descriptor 파일을 Deployment에 적용하고 애플리케이션을 실행하면 표시된 것처럼, 새로운 메시지가 나타납니다.

 

스크린샷 2020-09-08 오후 12 08 39

 

좋네요. 하지만 이 경우 "hello world from the config file"이 yaml 파일에 하드코딩된 형태와 똑같습니다. ConfigMap을 사용해서 바꿔 보겠습니다.

 

스크린샷 2020-09-08 오후 12 13 34

 

ConfigMap을 활용하는 가장 쉬운 방법은 "create configmap" 명령어로 key-value 쌍을 제공하는 것입니다. 그리고, 이 새 변수를 어디에 적용할지 Deployment에 정의하면 됩니다. Deployment descriptor에 'env' 섹션을 추가하고 "valueFrom" 속성이 아까 만들었던 ConfigMap을 가리키게 하면 됩니다. 이 경우, deployment는 MESSAGE라는 키값을 my-config로 명명된 ConfigMap 파일에서 찾아냅니다.

 

"kubectl get configmaps" 명령어로, 클러스터에 있는 모든 configmaps파일을 나열할 수 있습니다.

스크린샷 2020-09-08 오후 12 13 48

 

"describe configmap" 명령어로 해당 configmap의 자세한 내용을 확인할 수 있습니다. 슬라이드 오른쪽에 있는 Deployment Descriptor에서 'env' 섹션을 확인할 수 있습니다.

스크린샷 2020-09-08 오후 1 32 43

 

MESSAGE 변수를 ConfigMap에 추가하는 다른 방법으로는 파일을 사용하는 것입니다. 파일에 모든 환경변수를 key-value 형태로 포함시키는 것입니다. 파일을 활용하면, 아주 많은 양의 변수를 등록해야 하는 경우 명령어를 사용하는 방식보다 편리합니다. 예시는 다음과 같습니다. MESSAGE 키의 값으로 "hello from my.property file" 이라는 문자열을 등록했습니다. 이제 "--from-file" 옵션으로 ConfigMap을 생성하면 됩니다.

스크린샷 2020-09-08 오후 1 42 32

 

확인해야 할 점은, deployment descriptor도 미묘하게 달라졌다는 점입니다. 이제 key값은 my.properties가 되고, 파일에 있는 모든 키값은 환경변수에서 하위 키로 등재됩니다.

 

server.js 파일에서 사용할 경우 process.env.MESSAGE.MESSAGE 형태로 호출해야 합니다. --from-file 옵션에 디렉토리를 입력할 경우, 디렉토리 안의 모든 파일이 Secret ConfigMap에 등록됩니다. 특정 키값을 토대로 파일을 등록하려면 "--from-file=key=filename" 형태를 사용할 수 있습니다. 첫 번째 방법과 마찬가지로, deployment descriptor의 정보를 yaml파일 형식으로 확인할 수 있습니다. 화면 오른쪽에 표시된 것과 같이, deployment descriptor의 "env" 섹션 항목을 확인할 수 있습니다.

스크린샷 2020-09-08 오후 1 51 58

 

마지막으로, ConfigMap을 구성하는 yaml 파일이 있을 경우 그 파일을 사용할 수 있습니다. 예시에서는, kubectl get configmap 명령어로 my-config.yaml에 설정을 저장했습니다. 첫 번째 명령어에서 볼 수 있듯, 현재 configmap이 없는 상황입니다.

 

스크린샷 2020-09-08 오후 1 48 53

 

yaml 파일을 클러스터에 등록하면, configmap을 생성하는 걸 볼 수 있습니다. 애플리케이션은 지금까지의 예시와 같이 정상 작동합니다.

스크린샷 2020-09-08 오후 1 53 35

 

Secret의 사용방법은 ConfigMap 사용방법과 유사합니다. 먼저, 문자열 리터럴로 Secret을 생성합니다. 다음으로, get 명령어로 secret이 생성되었는지 확인합니다. 마지막으로, secret이 정말 비밀파일인지 보기 위해 describe 명령어를 사용해 CLI에서 평문으로 표시되는지를 확인합니다.

스크린샷 2020-09-08 오후 1 55 50

 

kubectl 명령어로 Secret을 yaml 파일 형태로 출력한다면, 인코딩된 값이 콘솔에 출력됩니다.

 

스크린샷 2020-09-08 오후 1 58 44

 

Secret을 사용하기 위해 다른 "env" 섹션을 Deployment Descriptor에 추가하겠습니다. 추가하고 나면, "process.env.API_CREDS"와 같은 방식으로 key를 활용할 수 있습니다. Node.js 파일에서 모든 환경변수를 출력하도록 코드를 변경한 결과물입니다. Secret 값이 출력된 걸 볼 수 있습니다.

 

스크린샷 2020-09-08 오후 2 00 17

 

Secret key를 활용하는 다른 방법으로는 volumn mount를 사용하는 것입니다. 이전까지의 방식대로 동일한 Secret을 생성합니다. 이후 descriptor yaml 파일에서 volumn mount가 적용된, secret를 위한 volumn값을 설정합니다. 각각의 컨테이너는 자신의 volumn mount를 갖게 되지만, volumn 자체는 공유할 수 있습니다. 이 경우 "api-creds" Secret는 "/etc/api/api-creds" 경로의 파일로 마운트됩니다. Secret이 필요한 프로그램은 이 경로의 파일을 읽어내고 실행해서 원하는 값을 사용할 수 있습니다.

 

스크린샷 2020-09-08 오후 2 42 21

 

축하합니다! 이제 어떻게 configuration 변수를 사용하고, 중요한 정보를 secret에 담아 Deployment에서 사용하는지 배웠습니다. 환경변수나 API 키, 사용자 이름과 비밀번호 같은 정보를 하드코딩하지 않아도 되므로 코드를 더 깨끗한 상태로 유지할 수 있게 되었습니다. 이번 모듈의 마지막 강의에서는 애플리케이션이 외부 서비스를 사용하는 방법, configmap과 secrets를 사용하는 법을 보겠습니다.

반응형