Kubernetes - ConfigMap, Secret
by youngjun._.기본 Object - ConfigMap, Secret
언제 사용해야될까?
개발환경과 상용환경이 있다고 해보자.
A라는 Service에는 일반접근과 보안접근을 지원하고 있다.
개발환경에서는 보안접근을 해제할 수 있는 옵션이 있고(SSH)
보안접근을 한다면 접근 User와 Key를 Setting할 수 있다.
상용환경에 배포해야한다면 값을 바꿔야한다!
보안접속으로 설정(SSH : True)하고 User와 Key 값도 변해야한다.
그런데 이 값은 Container안에 있는 Service 이미지에 들어있는 값이기 때문에
이 내용을 바꾼다는건 개발환경과 상용환경에 Container 이미지를 각각 관리해야겠다는 의미가 된다.
값 몇개때문에 큰 용량의 이미지를 관리하는 것은 부담되는 일이다.
따라서 환경에 따라 변하는 값들은 외부에서 결정할 수 있도록 한다.
이걸 도와주는 Object가 ConfigMap과 Secret이다.
분리해야하는 일반적인 상수를 모아서 ConfigMap을 만들고
Key와 같이 보안적인 관리가 필요한 것을 모아서 Secret을 만든다.
Pod 생성시 두 Object를 연결할 수 있는데 연결하면
Container의 환경변수에 데이터들이 들어가게된다!
A Service 입장에서는 환경변수의 값을 읽어서 로직을 처리하면 같은 역할을 할 수 있다!
Container에 아래와 같은 이미지를 만들어 놓으면 개발/상용환경에서 원하는 값을 설정할 수 있다.
같은 Container에 Image를 사용해 원하는 기능을 사용할 수 있게 된다.
사용방법을 공부해보자!
ConfigMap과 Secret을 만들때 Data로 상수 또는 File을 넣을 수 있다.
File을 넣을때는 환경변수로 setting하거나 Volume을 mount해서 사용할 수 있다.
각각 1, 2, 3번으로 설명하겠다.
1. Env (Literal)
2. Env (File)
3. Volume Mount (File)
1. Env (Literal)
가장 기본적인 상수(Literal)을 넣는 방법을 알아보자.
ConfigMap은 Key와 Value로 구성되어있다.
필요한 상수를 정의해 놓으면 Pod를 생성할 때 ConfigMap을 가져와서
Container안에 환경변수(env)에 Setting 할 수 있다.
Secret도 같은 역할을 하지만 보안적인 값을 저장할 때 사용된다.
(password, 인증키 등)
사용할 때 다른 점은 value를 넣을 때 Base64 인코딩을 해야된다는 점인데
이게 보안적인 요소는 아니고 단순히 Secret에 Value를 만들어야한다는 규칙이다.
이게 Pod로 주입될 때는 자동으로 Decoding이 된다.
환경 변수에서는 원래의 값이 보이게 된다.
그럼 Secret의 보안적인 요소는 뭘까?
일반적인 Object값은 Kubernetes DB에 저장이 되는데 Secret은 Memory에 저장이 된다.
file에 저장되어 있는경우보다 보안이 좋다.
또 ConfigMap에 경우 Key-Value 리스트를 무한히 넣을 수 있는 것에 반해
Secret은 1Mbyte만 넣을 수 있다.
Memory를 사용하기 때문에 Secret을 너무 많이 만들게 되면 시스템 자원에 영향을 끼친다.
yaml 파일 내용을 확인해보자.
ConfigMap을 만드는데 이름(cm-dev)을 지정하고 data에 Key-value형태의 상수를 넣으면 된다.
마찬가지로 Secret로 이름(sec-dev)와 Key를 넣고 value에는 Base64로 변환해서 넣으면 된다.
Pod를 만들 때 containers 안에 envFrom 속성으로 configMap을 Reference하는데 이름이 cm-dev
secret도 Reference하는데 이름이 sec-dev라는 것의 내용이다.
2. Env (File)
file을 환경변수에 넣는 방법을 알아보자.
file을 전체 ConfigMap에 담을 수 있는데
Key : file 이름
Value : file 안에 내용(Content)
다음과 같은 Key-Value 쌍의 ConfigMap이 만들어진다.
그대로 Pod의 환경변수로 넣으면 Key가 file이름이 된다.
File이름을 그대로 Key로 사용하고 싶지 않다. 어떻게 하면 될까?
File을 ConfigMap으로 만드는 것은 대쉬보드에서 지원해주지 않는다.
그래서 직접 마스터 콘솔로 들어가 다음 명령어를 입력한다.
cm-file이라는 configmap을 만들것이고 file.txt라는 file을 넣을 것이라는 뜻이다.
Secret의 경우도 다음과 같은 명령어를 입력하면 된다.
주의할 점
이 명령을 통해 file text안에 내용이 Base64로 변경되기 때문에
file안에 내용이 이미 Base64였다면 두 번 인코딩된다.
Pod를 만드는 yaml을 확인해보자.
container에 환경변수(env)를 넣을 것이고
이름은 file이다.
값을 가져올 것인데(valueFrom)
값은 configMap의 Key를 참조한다(configMapKeyRef)
configMap이름은 cm-file이고
cm-file 안에 있는 file.txt라는 key에 대한 Value를 넣는다.
3. Volume Mount (File)
마지막으로 File을 mounting하는 방법을 살펴보자.
file.txt를 ConfigMap에 담는 것까지는 똑같다.
Pod를 만들 때 Container안에 mount path를 정의하고 path 안에 file을 mounting할 수 있다.
내용은 간단하다. 바로 yaml을 확인해보자.
container안에
volume을 mount할 것인데
mount path는 /mount이고
이 mount할 volume의 내용을 보면
volume안에는 configMap을 담았고
configMap의 이름은 cm-file이다.
이렇게 yaml 파일을 만들 수 있다.
2번 Env(File) - file을 그대로 환경변수에 사용하는 경우와 3번 mount사이의 가장 큰 차이점은
각각의 방식대로 Pod를 생성한 후 각각의 ConfigMap에 내용을 변경하면 어떻게 될까?
환경변수 방식은
한번 주입하면 끝이기 때문에 ConfigMap에 data가 변해도 Pod의 환경변수 값은 영향이 없다.
(Pod가 죽어서 재생성이 될 경우만 변경된 값을 다시 받아와서 수정된다)
반면 file Mount 방식은
mount 자체가 원본과 연결을 시켜둔다는 뜻이기 때문에 ConfigMap 원본을 그대로 연결해
Pod의 내용도 동기화되어 변하게 된다.
이런 특성을 고려해 필요한 방식을 사용하면 된다.
'Infra > Kubernetes' 카테고리의 다른 글
Kubernetes - Controller (0) | 2020.04.07 |
---|---|
Kubernetes - Namespace, ResourceQuota, LimitRange란? (0) | 2020.03.13 |
Kubernetes - Volume (0) | 2020.03.12 |
Kubernetes - Service (3) | 2020.03.12 |
Kubernetes - Pod의 특징 3가지 (0) | 2020.03.12 |
블로그의 정보
개발하는만두
youngjun._.