Search

[스터디] Docker & Kubernetes Study #7

7장. ConfigMap과 Secret: Application 설정

설정할 옵션 목록이 커지면 설정 내용을 파일에 보관하는 것이 좋음
컨테이너화 된 어플리케이션에서는 환경변수도 일종의 config 로 사용한다
왜? 설정 파일을 이미지 안에 포함하거나 볼륨을 마운트 해야 하기 때문에
설정 파일을 이미지 안에 넣으면 하드 코딩하는 것과 흡사 (secretkey 등은 보안 문제 야기)
볼륨을 사용하는 것도 방법이지만, 해당 볼륨에 config 객체가 있는지 확인해야 함
쿠버네티스에서 컨테이너 정의시 ENTRYPOINT 와 CMD 를 모두 재정의 가능함
command = ENTRYPOINT, args = CMD
파드 생성 이후에는 환경변수나 인자를 변경할 수 없음
이런 식으로 POD 정의에 넣는 방법은 바람직 하지 않음 → 외부로 Config 를 이동시켜야 함!
설정 데이터를 저장하는 쿠버네티스 리소스를 ConfigMap 이라고 함
동일한 POD 여도 ConfigMap 를 다르게 가져갈 수 있음 (Dev, Production 환경)
ConfigMap 은 여러 가지 방법으로 생성 가능함 (단일 json, yaml, directory, literal)
ConfigMap 을 볼륨에 붙이는 방식으로 컨테이너 내에서 config 를 파일 단위로 접근 가능함
볼륨에 붙이는 방식으로 사용하면 동적으로 config 를 변경할 수 있음 (위 방법들은 불가능)
단 subpath 를 이용해서 ConfigMap을 직접 mount 하는 경우는 동적 변경 불가능
근데 사실 동적으로 변경하는게 좋은 방법은 아님.. (당연히 안전하지 않겠찌?)
보안 정보(secret key 등)를 처리할 수 있는 Secret 이라는 오브젝트를 제공함
Secret 이 필요로 하는 파드가 돌고 있는 노드에만 시크릿을 제한적으로 배포 할 수 있음
Secret 를 노드의 메모리 상에서만 저장하고 있고, 물리적 저장공간에 기록되지 않음 (tmpfs)
Config 와 Secret 의 차이점: 매번 암복호화를 해야 하는 불편함이 있냐 없냐!
Private Image Registry 를 이용하는 경우에도 Secret 을 이용한다
imagePullSecret 에 관련된 Secret 을 참조하면 됨

요약

컨테이너 이미지에 정의된 기본 명령어를 파드 정의 안에 재정의
주 컨테이너 프로세스에 명령줄 인자 전달
컨테이너에서 사용할 환경 변수 설정
파드 사양에서 설정을 분리해 ConfigMap 안에 넣기
민감한 데이터를 시크릿 안에 넣고 컨테이너 안에 안전하게 전달
docker-registry 시크릿을 만들고 private image registry 에서 이미지 가져올 때 사용

Question

Q. 바로 main process 로 실행되는 것과 shell 위에서 실행되는 것은 어떤 차이가 있는가?
(답변) shell process가 하나 더 떠있냐 아니냐의 차이? + shell 위에서 실행되고 있으면 shell을 죽이면 process가 같이 죽겠죠? 근데 쉘을 일부러 따로 죽이거나 하지 않는 한 그런 일은 없을테니 실제 상황에서는 별 차이 없는 경우가 많을 거 같습니다.
Q. default-token Secret 은 어떤 역할을 수행하는가?
(답변) 파드 내부에서 쿠버네티스 API와 통신하기 위한 인증 로직이 담겨있는걸로 이해했습니다. (평소에는 파드에서 k8s API에 직접 접근할 일이 없지만..)
Q. Secret Key 가 외부에서는 암호화 되어 있다고 했는데, 그럼 container 내부에서는 자동으로 decrypt 되는 것인지?
(답변) 외부에서 암호화가 뭐지...? 어느 문맥애서 나온 문장인지 모르겠어요! base64 말씀하시는건가?
(답변) Base64 맞는 것 같아요. 이건 암호화라고 부르지 않고 "인코딩"이라고 부릅니다. 그리고 말씀하신 것이 맞습니다.
Q. Secret Key 는 tmpfs 로 in-memory loading 이 된다고 했는데, 언제 노드에 allocation 되고 deallocation 되는지? (pod가 참조 또는 참조하는 pod 이 없을 때?)
(답변) 시크릿을 마운트하는 건 파드 yaml에 정의되니까 파드를 만들 때 할 것 같아요. 그러면 파드가 종료될 때 deallocation되겠죠...?
Q. Secret 은 GCP 의 클러스터 내에서만 공유 되는 것인지 프로젝트 단위에서도 공유 가능한지?
(답변) 클러스터 단위입니다!!!!!! 다른 클러스터의 secret에 접근이 가능하다면 위험할 수 있을 듯!
Q. gcr 에서 image pull 할 때는 Secret 을 어떻게 활용되면 되는지? GKE 를 사용하면 자동으로 해 주는지?
(답변) AWS(EKS)의 경우 생성하는 노드에 적절한 IAM 권한을 붙여줬을 때 자동으로 pull 받습니다
(답변) GKE에서는.. 대충 인증 서버가 있어서 알아서 잘 딱 깔끔하게 센스있게 크레덴셜을 받아와 인증한다..?
(답변) Google 인프라 안에는 Metadata Server라는 것이 떠있어요. 인프라 내부 IP (VPC) 에서 실행되는 모든 워크로드는 이 서버에 접근할 수 있고, 인증이 필요한 API가 있을 경우 실행 전에 gcloud 가 이 서버에 연결하여 현재 적합한 권한이 부여되었는지 확인하고 키를 받아오는 과정을 수행합니다. 그래서 사용자 입장에서는 인증에 신경쓰지 않고 GCR Pull이나 GCS Get 등의 작업을 수행할 수 있어요.