거의 모든 애플리케이션은 빌드된 애플리케이션 자체에 포함되지 말아야 하는 설정(배포된 인스턴스별로 다른 세팅, 외부 시스템 액세스를 위한 자격증명 등)이 필요하다. K8s에서 이런 설정 옵션을 어떻게 전달하는지 알아보자.
1. 컨테이너화된 애플리케이션 설정
- ConfigMap을 사용해 설정 데이터를 저장할지 여부에 관계없이 다음 방법을 통해 애플리케이션을 구성할 수 있다.
- 컨테이너에 명령줄 인수 전달
- 각 컨테이너를 위한 사용자 정의 환경변수 지정
- 특수한 유형의 볼륨을 통해 설정 파일을 컨테이너에 마운트
- 이 중 어떤 것에는 보안이 필요한 정보가 있을 수 있다. Secret이 필요한 이유다.
2. 컨테이너에 명령줄 인자 전달
1) 도커에서 명령어와 인자 정의
- ENTRYPOINT와 CMD
- ENTRYPOINT는 컨테어너가 시작될 때 호출될 명령어를 정의하고, CMD는 ENTRYPOINT에 전달되는 인자를 정의한다.
2) 쿠버네티스에서 명령과 인자 재정의
- ENTRYPOINT -> command / CMD -> args
3. 컨테이너의 환경변수 설정
- 환경변수는 파드 레벨이 아닌 컨테이너 정의 안에 설정해야 한다.
- 하드코딩된 환경변수는 여러 파드 정의가 필요하다는 것을 의미한다. value 필드 대신 valueFrom을 쓰면 환경변숫값의 원본 소스로 사용할 수 있다.
4. 컨피그맵으로 설정 분리
1) ConfigMap 소개
- K8s에서는 설정 옵션을 ConfigMap으로 분리할 수 있다. Key-Value 쌍으로 구성되어 있다.
- 서로 다른 환경에서 동일한 이름을 가진 두 개의 다른 ConfigMap을 사용할 수 있다.
2) ConfigMap 생성
3) ConfigMap 항목을 환경변수로 컨테이너에 전달
4) ConfigMap의 모든 항목을 한 번에 환경변수로 전달
5) ConfigMap 항목을 명령줄 인자로 전달
5. 시크릿으로 민감한 데이터를 컨테이너에 전달
1) Secret 소개
- 컨피그맵과 매우 비슷하다. K8s는 시크릿에 접근해야 하는 파드가 실행되고 있는 노드에만 개별 시크릿을 배포해 안전하게 유지한다.
- 또한 노드 자체적으로 시크릿을 항상 메모리에만 저장되게 하고 물리 저장소에 기록되지 않도록 한다.
2) 기본 토큰 시크릿 소개
- 모든 파드에는 secret 볼륨이 자동으로 연결되어 있다.