반응형

목차

  1. 컨피그맵(Configmap)
  2. 컨피그맵 생성
    • kubectl create configmap으로 생성
    • 파일 내용으로 컨피그맵 생성
    • 디렉터리에 있는 파일로 컨피그맵 생성
    • 다양한 옵션 결합
  3. 컨피그맵 항목을 환경변수로 컨테이너에 전달
  4. 파드에 존재하지 않는 컨피그맵 참조한다면?
  5. 컨피그맵의 모든 항목을 한 번에 환경변수로 전달
  6. 컨피그맵 항목을 명령줄 인자로 전달

컨피그맵(Configmap)

ConfigMap은 Kubernetes에서 사용되는 리소스로, key-value 쌍으로 비민감성 구성 데이터를 저장하는 데 사용됩니다. 이를 사용하면 구성 정보를 컨테이너 이미지에서 분리하여 응용 프로그램을 더 이식성이 좋고 유지 관리가 용이하며 관리가 쉬워집니다. ConfigMap은 응용 프로그램에서 필요한 구성 파일, 환경 변수 또는 다른 구성 데이터를 저장하는 데 사용할 수 있습니다.

ConfigMap을 사용하면 컨테이너 이미지를 다시 빌드하거나 재배포하지 않고도 구성 데이터를 쉽게 업데이트하고 수정할 수 있습니다. 즉, 애플리케이션은 컨피그맵을 직접 읽거나 심지어 존재하는 것을 몰라도 됩니다. 대신 맵 의 내용은 컨테이너의 환경변수 또는 볼륨 파일로 전달됩니다. 또한 환경변수는 $(ENV_VAR) 구문을 사용해 명령줄 인수에서 참조할 수 있기 때문에, 컨피그맵 항목을 프로세스의 명령 줄 인자로 전달할 수도 있습니다.

 

애플리케이션은 필요한 경우 쿠버네티스 REST API 엔드포인트를 통해 컨피그맵의 내 용을 직접 읽을 수 있지만, 반드시 필요한 경우가 아니라면 애플리케이션은 쿠버네티스와는 무관하도록 유지해야 합니다.

 

애플리케이션이 컨피그맵을 사용하는 방법에 관계없이, 별도의 독립적인 오브젝트에 설정을 포함하면 각각 다른 환경(개발, 테스트, QA, 프로덕션 등)에 관해 동일한 이름으로 컨 피그맵에 관한 여러 매니페스트를 유지할 수 있습니다. 파드는 컨피그맵을 이름으로 참조하기 때문에, 모든 환경에서 동일한 파드 정의를 사용해 각 환경에서 서로 다른 설정을 사용할 수 있습니다.


컨피그맵 생성

앞에서 만든 파드에 컨피그맵을 사용하는 방법을 알아봅시다. 가장 간단한 예제로, 단일 키를 가진 맵을 생성하고 이를 사용해 이전 예제의 INTERVAL 환경변수를 채워 넣는 것입니다. kubectl create -f 명령어로 YAML 파일을 게시하는 대신에 kubectl create configmap 명령으로 컨피그맵을 생성할 수 있습니다.


1. kubectl create configmap으로 생성

문자열 literal 값을 kubectl 명령에 전달하거나 디스크에 저장된 파일에서 컨피그맵을 정의할 수 있습니다. 이 때 컨피그맵 키는 유효한 DNS 서브도메인(subdomain)이어야 합니다(영숫자, 대시, 밑줄, 점만 포함 가능). 필요한 경우 점이 먼저 나올 수 있습니다. 이제 간단한 문자열을 이용해봅시다.

$ kubectl create configmap fortune-config --from-literal=sleep-interval=25
configmap "fortune-config" created

 

위 명령을 통해 sleep-interval=25라는 단일 항목을 가진 fortune-config 컨피그맵 을 생성합니다. 컨피그맵은 일반적으로 두 개 이상의 항목을 포함합니다. 여러 문자열 항목을 가진 컨피 그맵을 생성하려면 여러 개의 --from-literal 인자를 추가합니다.

 

$ kubectl create configmap myconfigmap --from-literal=foo=bar --from-literal=bar=baz --from-literal=one=two

 

앞에서 생성한 컨피그맵을 kubectl get 명령으로 YAML 정의를 출력해 살펴봅시다.

$ kubectl get configmap fortune-config -o yaml

apiVersion: v1
data:
  sleep-interval: "25"               <  이 맵의 단일 항목
kind: ConfigMap                     <  이 디스크립터는 컨피그맵을 설명합니다.
metadata:
  creationTimestamp: 2016-08-11T20:31:08Z3000ging steans d
  name: fortune-config             <  이 맵의 이름(해당 이름으로 참조)
  namespace: default
  resourceVersion: "910025"
  selfLink: /api/v1/namespaces/default/configmaps/fortune-config
  uid: 88c4167e-6002-11e6-a50d-42010af00237

특별한 것 없으므로 이 YAML 파일을 쉽게 작성할 수 있을 것입니다. 여기서 메타데이터(metadata) 섹션에 name을 뺀 나머지를 지정할 필요는 없습니다. 그리고 이 파일을 쿠버네티스 API에 게시합니다.

 

$ kubectl create -f fortune-config.yaml


2. 파일 내용으로 컨피그맵 생성

 

컨피그맵에는 전체 설정 파일 같은 데이터를 통째로 저장하는 것도 가능합니다. kubectl create configmap 명령을 이용해 파일을 디스크에서 읽어 개별 항목으로 저장할 수 있습니다.

 

$ kubectl create configmap my-config --from-file=config-file.conf

 

앞의 명령을 실행하면, kubectl을 실행한 디렉터리에서 config-file.conf 파일을 찾습니다. 그리고 파일 내용을 컨피그맵의 config-file.conf 키 값으로 저장합니다. 물론 키 이름을 직접 지정할 수도 있습니다.

 

$ kubectl create configmap my-config --from-file=customkey=config-file.conf

 

이 명령은 파일 내용을 customkey라는 키 값으로 저장합니다. --from-file 인수를 여러 번 사용해 여러 파일을 추가할 수 있습니다.


3. 디렉터리에 있는 파일로 컨피그맵 생성

각 파일을 개별적으로 추가하는 대신, 디렉터리 안에 있는 모든 파일을 가져올 수도 있습니다.

 

$ kubectl create configmap my-config --from-file=/path/to/dir :qm6329mino1690

 

이 명령에서 kubectl은 지정한 디렉터리 안에 있는 각 파일을 개별 항목으로 작성한 다. 이때 파일 이름이 컨피그맵 키로 사용하기에 유효한 파일만 추가합니다.


4. 다양한 옵션 결합

컨피그맵을 생성할 때 여기에서 언급한 모든 옵션을 조합해 사용할 수 있습니다(이 파일들은 책 코드 저장소에 포함돼 있지 않습니다. 명령어를 시도해보려면 직접 작성해야 합니다).

 

$ kubectl create configmap my-config

  • --from-file=foo.json: 단일 파일
  • --from-file=bar=foobar.conf: 사용자 정의 키 밑에 파일 저장 
  • --from-file=config-opts/: 전체 디렉터리
  • --from-literal-some=thing: 문자열 값

컨피그맵 항목을 환경변수로 컨테이너에 전달

이렇게 생성한 맵의 값을 어떻게 파드 안의 컨테이너로 전달할 수 있을까? 여기에는 세 가지 옵션이 있습니다. 가장 간단한 환경변수를 설정하는 것부터 시작하자. 이를 위해서 valueFrom 필드를 사용합니다. 파드 정의는 다음 예제와 비슷할 것입니다.

apiVersion: v1
kind: Pod
metadata:
  name: fortune-env-from-configmap
spec:
  containers:
  - image: luksa/fortune:env
    env:                                   <     INTERVAL 환경변수를 설정하는 중
    - name: INTERVAL
      valueFrom:                         <  고정 값을 설정하는 대신 컨피그맵 키에서 값을 가져와 초기화합니다.
        configMapKeyRef:
          name: fortune-config      <  참조하는 컨피그맵 이름
          key: sleep-interval               < 컨피그맵에서 해당 키 아래에 저장된 값으로 변수 설정

INTERVAL 환경변수를 선언하고 fortune-config 컨피그맵에 안에 있는 sleep-interval 키를 이용해 가져온 값으로 설정했습니다. html-generator 컨테이너 안에서 실행 중 인 프로세스는 INTERVAL 환경변수를 읽을 때 25를 가져옵니다.


파드에 존재하지 않는 컨피그맵 참조한다면?

파드를 생성할 때 존재하지 않는 컨피그맵을 지정하면 어떻게 되는지 궁금할 것입니다. 쿠버 네티스는 파드를 스케줄링하고 그 안에 있는 컨테이너를 실행하려고 시도합니다. 컨테이너가 존재하지 않는 컨피그맵을 참조하려고 하면 컨테이너는 시작하는 데 실패합니다. 하지만 참조하지 않는 다른 컨테이너는 정상적으로 시작됩니다. 그런 다음 누락된 컨피그맵을 생성 하면 실패했던 컨테이너는 파드를 다시 만들지 않아도 시작됩니다.

 

매니페스트에 config MapKeyRef.optional: true로 지정하면 컨피그맵 참조를 옵션으로 표시할 수도 있습니다. 이런 경우에는 컨피그맵이 존재하지 않아도 컨테이너는 시작합니다. 


컨피그맵의 모든 항목을 한 번에 환경변수로 전달

컨피그맵에 여러 항목이 포함돼 있을 때 각 항목을 일일이 환경변수로 생성하는 일은 지루하고 오류가 발생하기 쉽습니다. 다행히 쿠버네티스 버전 1.6부터는 컨피그맵의 모든 항목을 환경변수로 노출하는 방법을 제공합니다.

 

FOO, BAR, FOO-BAR라는 세 개의 키를 갖고 있는 컨피그맵을 생각해봅시다. 이전 예제에 서 사용한 env 속성 대신 envFrom 속성을 사용해 환경변수로 모두 노출할 수 있습니다. 다음 예제에서 그 내용을 보여줍니다.

spec:
  containers:
  - image: some-image
    envFrom:                                >   env대신 envFrom 사용
    - prefix: CONFIG_                >  모든 환경변수는 CONFIG_ 접두사를 가짐
      configMapRef:                        >  my-config-map이란 이름의 컨피그맵 참조
        name: my-config-map

위와 같이 환경변수 앞에 붙을 접두사를 지정할 수 있습니다(여기에서는 CONFIG). 이 때 접두사는 선택 사항이고 이를 생략하면 환경변수의 이름은 키와 동일한 이름을 갖게 됩니다. 결과적으로 이 컨테이너 안에는 두 개의 환경변수가 존재하게 됩니다. 바로 CONFIG_FOO와 CONFIG_BAR입니다. 

 

앞에서 두 개의 변수가 있습니다고 얘기했지만, 이 컨피그맵은 세 개의 항목(FOO, BAR, FOO- BAR)을 가지고 있다고도 말했습니다. 컨피그맵에 있는 FOO-BAR 항목은 왜 환경변수로 존재하지 않을까요?

 

CONFIG_FOO-BAR는 대시dash를 가지고 있어 올바른 환경변수 이름이 아니기 때문입니다. 이런 경우에 쿠버네티스는 어떤 형태로든 임의로 키로 변환하지 않습니다(예를 들자면 대시를 밑 줄로 변환하지 않습니다). 컨피그맵의 키가 올바른 형식이 아닌 경우 항목을 건너뜁니다(단, 건너뛰 었다는 것을 알려주는 이벤트가 기록됩니다).


컨피그맵 항목을 명령줄 인자로 전달

이제 컨피그맵 값을 컨테이너 안에서 실행되는 프로세스의 인자로 전달하는 방법을 살펴 봅시다. pod.spec.containers.args 필드에서 직접 컨피그맵 항목을 참조할 수는 없지만 컨피그맵 항목을 환경변수로 먼저 초기화하고 이 변수를 인자로 참조하도록 지정할 수 있습니다.

 

다음 예제는 YAML 안에서 이 작업을 수행하는 예를 보여줍니다.

apiVersion: v1
kind: Pod
metadata:
  name: fortune-args-from-configmap
spec:
  containers:
  - image: luksa/fortune:args    > 환경변수가 아닌 첫 번째 인자에서 간격(interval)을 가져오는 이미지 사용
    env:                                                  >  컨피그맵에서 환경변수 정의
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: fortune-config
          key: sleep-interval
    args: ["$(INTERVAL)"]          >  인자에 앞에서 정의한 환경변수 지정

앞에서 한 것과 동일하게 환경변수를 정의했지만 $(ENVARIABLENAME) 문법을 사용해 쿠버네티스가 해당 변수의 값을 인자에 주입합니다.


configmap 내용이 많아서 나머지는 다음 포스팅에 마저 올리도록 하겠습니다!

 

 

반응형