새소식

Recent Study/Kubernetes 학습과정

6. ConfigMap, Secret & 실습

  • -

 ConfigMap, Secret의 사용 시기에 대해 알아봐요. 만약 개발 환경과 상용 환경이 있습니다. A라는 서비스가 있는데 이 서비스는 일반 접근과 보안 접근이 가능합니다. 그래서 개발 환경에서는 이 보안 접근을 해제할 수 있는 옵션이 있습니다. 보안 접근을 한다면 접근 User와 Key를 세팅할 수 있습니다. 이처럼 설정하고 있는데, 상용 환경으로 배포를 해야한다면 이 값이 바뀌어야 합니다

 

 다시 보안 접속으로 설정을 해야하고, User와 Key값도 변경해야 합니다. 근데 이 값은 컨테이너 안에 있는 서비스 이미지에 들어있는 값이기 때문에 이 내용을 바꾼다는 것은 개발 환경과 상용 환경에 컨테이너 이미지를 각각 관리하겠다는 의미가 됩니다. 이미지를 별도로 관리한다는 것은 부담되는 일이에요. 그래서 이렇게 환경에 따라 변하는 값들은 외부에서 결정할 수 있게 하는데 이것을 도와주는게 ConfigMap, Secret 이라는 Object 입니다.

 

 분리해야 하는 일반적인 상수들을 모아서 ConfigMap을 만들고, Key와 같이 보안적인 관리가 필요한 값을 모아서 Secret을 만듭니다. 그러면 Pod 생성시에 이 2개의 Object들을 연결할 수 있는데, 연결하면 컨테이너의 환경변수에 데이터가 들어가게 됩니다. A서비스 입장에서는 Env 값을 읽어서 로직을 처리하게 되면 위와 똑같은 역할을 할 수 있습니다.

 

 사용방법은 ConfigMap과 Secret을 만들 때 데이터로 상수를 넣을 수가 있고, 파일을 넣을 수 가 있습니다. 파일을 넣을때는 환경변수로 세팅하는게 아닌 볼륨으로 마운트해서 사용할 수 있습니다. 이렇게 3가지 방법이 있습니다.

 

 

1. Env (Literal)

: ConfigMap은 Key와 Value로 고정되어 있습니다. 필요한 상수들을 정의 해 놓으면 Pod를 생성할 때 이 ConfigMap을 가져와서 컨테이너 안에 환경 변수에 세팅할 수 있습니다. Secret은 같은 역할을 하는데 보안적인 값들을 저장하는데 사용됩니다. PW, 인증키들은 Secret에 담습니다. 사용상 ConfigMap과 다른 점은 이 Value를 넣을 때 Base64 Encoding을 해서 만들어야 된다는 건데, 이게 Secret 보완적인 요소는 아니고 단순히 secret의 value를 만들어야 된다는 규칙이고 이게 Pod로 주입이 될 때는 자동으로 decoding 되어서 환경 변수에서는 원래의 값이 보이게 됩니다. 

 

 secret의 보완적인 요소는 일반적인 오브젝트 값들은 k8s DB에 저장이 되는데 이 secret은 Memory에 저장이 됩니다. 그리고 ConfigMap의 경우 Key, value를 무한히 넣을 수 있지만 secret은 1MB만 넣을 수 있습니다. 그리고 Memory에 저장이 되기 때문에 secret을 너무 많이 만들면 시스템 자원에 영향을 주게 됩니다.

 

 

2. Env (File)

: file을 통으로 ConfigMap에 담을 수 있는데, 이럴 때 파일 이름이 Key가 되고, file 안의 내용은 Value가 돼서 ConfigMap이 만들어집니다. 이것을 Pod 환경변수에 넣을 때 그대로 넣으면 Key가 file 이름이 될 수 있으니까 Key를 새로 정의를 해서 Content만 넣어 보겠습니다.

 

 만드는 방법을 보면 file을 ConfigMap으로 만드는 것은 DashBoard에서 지원해주지 않기 때문에 직접 master의 console로 들어가서 kubectl 명령을 실행할 것 입니다. cm 파일이라는 ConfigMap을 만들거고, 이 파일을 넣을 것이라는 명령입니다. secret은 위와 같이 명령을 날리면 되는데, 주의할 점은 위 명령으로 file.txt 내용이 Base64로 변경되기 때문에 2번 인코딩 될 수 있습니다.

 

 

3. Volume Mount (File)

: file을 ConfigMap에 담는 과정은 2) 와 같습니다. Pod를 생성시 Container 안에 mount Path를 정의하고, Path 안에 파일을 마운트 할 수 있습니다.

 

 참고로 위 2,3 방법에는 큰 차이가 있습니다. 위처럼 Pod를 생성한 다음 각각의 ConfigMap에 내용을 변경한다면 어떻게 될까요? 환경 변수 방식은 한번 주입을 하면 끝이기 때문에 ConfigMap의 데이터가 변해도 Pod의 환경 변수값에는 영향이 없습니다. Pod가 재생성되어 죽어야지만 변경된 값을 다시 받아서 수정할 수 있습니다. 반면에 (3)file Mount는 Mount라는 것이 원본과 연결시켜준다는 개념이기 때문에 내용이 변하게 되면 Pod에 Mount 된 내용이 반영됩니다.

 

 

실습

1. Env (Literal)

 아래 처럼 잘 만들어진 것을 확인할 수 있습니다. 이제 Pod를 생성해보겠습니다. Pod 컨테이너 안에 환경 변수로 ConfigMap과 Secret에 방금 만든 이름들을 가져오겠습니다. 생성 후 접속해 본 후 env를 확인해보면 아래와 같이 볼 수 있는데, 해당 환경 변수들이 적용 된것을 확인할 수 있습니다.

 

 

2. Env (File)

 추후 이렇게 Master에서 해당 ConfigMap, Secret을 만들어줍니다. 그러면 해당 Pod의 env에 저장된 내용이 잘 있는 것을 확인할 수 있습니다. 

 

 

3. Volume Mount (File)

 /mount 라는 Path에 파일을 넣을 것이고, 이 volume으로 되어있는 내용 안에 ConfigMap이 연결되어 있습니다. 해당 Pod로 접속해 확인해보면 아래와 같이 file-c.txt가 있는 것을 확인할 수 있습니다.

 

 

 

4. ConfigMap이 변했을 때 환경 변수로 넣은 값과 마운트로 넣은 값이 틀린지 확인

 해당 Dashboard에서 Content값을 -> Content1234로 수정한 후 원래 만들었던 Pod인 pod-file의 환경 변수 값을 확인해보면 변하지 않은 것을 확인할 수 있습니다. 

 

 

추후 pod-file을 삭제 후 pod-file1을 다시 만들어서 확인해보면 아래와 같이 변경된 사항이 있는 것을 알 수 있습니다. 추가로

 

 

아래는 pod-mount 입니다. 여기서는 바로 변환된 값이 보이는 것을 확인할 수 있습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.