2.5. 구성 맵 생성 및 사용
다음 섹션에서는 구성 맵과 이를 생성하고 사용하는 방법을 정의합니다.
2.5.1. 구성 맵 이해
많은 애플리케이션에는 구성 파일, 명령줄 인수 및 환경 변수 조합을 사용하여 구성이 필요합니다. AWS의 Red Hat OpenShift Service에서 이러한 구성 아티팩트는 컨테이너화된 애플리케이션을 이식하기 위해 이미지 콘텐츠와 분리됩니다.
ConfigMap
오브젝트는 컨테이너를 AWS에서 Red Hat OpenShift Service와 무관하게 유지하면서 구성 데이터를 사용하여 컨테이너를 삽입하는 메커니즘을 제공합니다. 구성 맵은 개별 속성 또는 전체 구성 파일 또는 JSON Blob과 같은 세분화된 정보를 저장하는 데 사용할 수 있습니다.
ConfigMap
오브젝트에는 Pod에서 사용하거나 컨트롤러와 같은 시스템 구성 요소의 구성 데이터를 저장하는 데 사용할 수 있는 구성 데이터의 키-값 쌍이 있습니다. 예를 들면 다음과 같습니다.
ConfigMap
오브젝트 정의
kind: ConfigMap apiVersion: v1 metadata: creationTimestamp: 2016-02-18T19:14:38Z name: example-config namespace: my-namespace data: 1 example.property.1: hello example.property.2: world example.property.file: |- property.1=value-1 property.2=value-2 property.3=value-3 binaryData: bar: L3Jvb3QvMTAw 2
이미지와 같은 바이너리 파일에서 구성 맵을 생성할 때 binaryData
필드를 사용할 수 있습니다.
다양한 방법으로 Pod에서 구성 데이터를 사용할 수 있습니다. 구성 맵을 다음과 같이 사용할 수 있습니다.
- 컨테이너에서 환경 변수 값 채우기
- 컨테이너에서 명령줄 인수 설정
- 볼륨에 구성 파일 채우기
사용자 및 시스템 구성 요소는 구성 데이터를 구성 맵에 저장할 수 있습니다.
구성 맵은 보안과 유사하지만 민감한 정보가 포함되지 않은 문자열 작업을 더 편리하게 지원하도록 설계되었습니다.
구성 맵 제한 사항
Pod에서 콘텐츠를 사용하기 전에 구성 맵을 생성해야 합니다.
컨트롤러는 누락된 구성 데이터를 허용하도록 작성할 수 있습니다. 상황에 따라 구성 맵을 사용하여 구성된 개별 구성 요소를 참조하십시오.
ConfigMap
오브젝트는 프로젝트에 있습니다.
동일한 프로젝트의 Pod에서만 참조할 수 있습니다.
Kubelet은 API 서버에서 가져오는 Pod에 대한 구성 맵만 지원합니다.
여기에는 CLI를 사용하거나 복제 컨트롤러에서 간접적으로 생성되는 모든 Pod가 포함됩니다. 이는 Pod를 생성하는 일반적인 방법이 아니므로 AWS 노드의 --manifest-url
플래그, --config
플래그 또는 REST API에서 Red Hat OpenShift Service를 사용하여 생성한 Pod는 포함하지 않습니다.
2.5.2. AWS 웹 콘솔의 Red Hat OpenShift Service에 구성 맵 생성
AWS 웹 콘솔의 Red Hat OpenShift Service에서 구성 맵을 생성할 수 있습니다.
프로세스
클러스터 관리자로 구성 맵을 생성하려면 다음을 수행합니다.
-
관리자 관점에서
Workloads
Config Maps
을 선택합니다. - 페이지 오른쪽 상단에서 구성 맵 생성을 선택합니다.
- 구성 맵의 콘텐츠를 입력합니다.
- 생성을 선택합니다.
-
관리자 관점에서
개발자로 구성 맵을 생성하려면 다음을 수행합니다.
-
개발자 관점에서
Config Maps
을 선택합니다. - 페이지 오른쪽 상단에서 구성 맵 생성을 선택합니다.
- 구성 맵의 콘텐츠를 입력합니다.
- 생성을 선택합니다.
-
개발자 관점에서
2.5.3. CLI를 사용하여 구성 맵 생성
다음 명령을 사용하여 디렉토리, 특정 파일 또는 리터럴 값에서 구성 맵을 생성할 수 있습니다.
절차
구성 맵 생성:
$ oc create configmap <configmap_name> [options]
2.5.3.1. 디렉토리에서 구성 맵 생성
--from-file
플래그를 사용하여 디렉터리에서 구성 맵을 생성할 수 있습니다. 이 방법을 사용하면 디렉토리 내 여러 파일을 사용하여 구성 맵을 생성할 수 있습니다.
디렉터리의 각 파일은 구성 맵에서 키를 채우는 데 사용됩니다. 여기서 키 이름은 파일 이름이며 키 값은 파일의 내용입니다.
예를 들어 다음 명령은 example-files
디렉터리의 콘텐츠를 사용하여 구성 맵을 생성합니다.
$ oc create configmap game-config --from-file=example-files/
구성 맵에서 키를 표시합니다.
$ oc describe configmaps game-config
출력 예
Name: game-config Namespace: default Labels: <none> Annotations: <none> Data game.properties: 158 bytes ui.properties: 83 bytes
맵의 두 키가 명령에 지정된 디렉토리의 파일 이름에서 생성되는 것을 확인할 수 있습니다. 해당 키의 내용은 커질 수 있으므로 oc describe
의 출력은 키와 크기의 이름만 표시합니다.
사전 요구 사항
구성 맵을 채우려는 데이터가 포함된 파일이 있는 디렉터리가 있어야 합니다.
다음 절차에서는 다음 예제 파일을 사용합니다.
game.properties
및ui.properties
:$ cat example-files/game.properties
출력 예
enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30
$ cat example-files/ui.properties
출력 예
color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
프로세스
다음 명령을 입력하여 이 디렉터리에 있는 각 파일의 콘텐츠를 포함하는 구성 맵을 생성합니다.
$ oc create configmap game-config \ --from-file=example-files/
검증
키 값을 보려면
-o
옵션을 사용하여 오브젝트에 대한oc get
명령을 입력합니다.$ oc get configmaps game-config -o yaml
출력 예
apiVersion: v1 data: game.properties: |- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:34:05Z name: game-config namespace: default resourceVersion: "407" selflink: /api/v1/namespaces/default/configmaps/game-config uid: 30944725-d66e-11e5-8cd0-68f728db1985
2.5.3.2. 파일에서 구성 맵 생성
--from-file
플래그를 사용하여 파일에서 구성 맵을 생성할 수 있습니다. --from-file
옵션을 CLI에 여러 번 전달할 수 있습니다.
key=value
표현식을 --from-file
옵션에 전달하여 파일에서 가져온 콘텐츠의 구성 맵에 설정할 키를 지정할 수도 있습니다. 예를 들면 다음과 같습니다.
$ oc create configmap game-config-3 --from-file=game-special-key=example-files/game.properties
파일에서 구성 맵을 생성하는 경우 UTF8이 아닌 데이터를 손상시키지 않고 이 필드에 배치된 UTF8이 아닌 데이터가 포함된 파일을 포함할 수 있습니다. AWS의 Red Hat OpenShift Service는 바이너리 파일을 감지하고 파일을 MIME
로 투명하게 인코딩합니다. 서버에서 MIME
페이로드는 데이터 손상 없이 디코딩되어 저장됩니다.
사전 요구 사항
구성 맵을 채우려는 데이터가 포함된 파일이 있는 디렉터리가 있어야 합니다.
다음 절차에서는 다음 예제 파일을 사용합니다.
game.properties
및ui.properties
:$ cat example-files/game.properties
출력 예
enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30
$ cat example-files/ui.properties
출력 예
color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
프로세스
특정 파일을 지정하여 구성 맵을 생성합니다.
$ oc create configmap game-config-2 \ --from-file=example-files/game.properties \ --from-file=example-files/ui.properties
키-값 쌍을 지정하여 구성 맵을 생성합니다.
$ oc create configmap game-config-3 \ --from-file=game-special-key=example-files/game.properties
검증
파일에서 키 값을 확인하려면
-o
옵션을 사용하여 오브젝트에 대한oc get
명령을 입력합니다.$ oc get configmaps game-config-2 -o yaml
출력 예
apiVersion: v1 data: game.properties: |- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:52:05Z name: game-config-2 namespace: default resourceVersion: "516" selflink: /api/v1/namespaces/default/configmaps/game-config-2 uid: b4952dc3-d670-11e5-8cd0-68f728db1985
키-값 쌍의 키 값을 확인하려면
-o
옵션을 사용하여 오브젝트에 대한oc get
명령을 입력합니다.$ oc get configmaps game-config-3 -o yaml
출력 예
apiVersion: v1 data: game-special-key: |- 1 enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:54:22Z name: game-config-3 namespace: default resourceVersion: "530" selflink: /api/v1/namespaces/default/configmaps/game-config-3 uid: 05f8da22-d671-11e5-8cd0-68f728db1985
- 1
- 이전 단계에서 설정한 키입니다.
2.5.3.3. 리터럴 값에서 구성 맵 생성
구성 맵에 리터럴 값을 제공할 수 있습니다.
--from-literal
옵션은 key=value
구문을 사용하므로 명령줄에서 직접 리터럴 값을 제공할 수 있습니다.
프로세스
리터럴 값을 지정하여 구성 맵을 생성합니다.
$ oc create configmap special-config \ --from-literal=special.how=very \ --from-literal=special.type=charm
검증
키 값을 보려면
-o
옵션을 사용하여 오브젝트에 대한oc get
명령을 입력합니다.$ oc get configmaps special-config -o yaml
출력 예
apiVersion: v1 data: special.how: very special.type: charm kind: ConfigMap metadata: creationTimestamp: 2016-02-18T19:14:38Z name: special-config namespace: default resourceVersion: "651" selflink: /api/v1/namespaces/default/configmaps/special-config uid: dadce046-d673-11e5-8cd0-68f728db1985
2.5.4. 사용 사례: Pod에서 구성 맵 사용
다음 섹션에서는 Pod에서 ConfigMap
오브젝트를 사용할 때 몇 가지 사용 사례에 대해 설명합니다.
2.5.4.1. 구성 맵을 사용하여 컨테이너에서 환경 변수 채우기
구성 맵을 사용하여 컨테이너에서 개별 환경 변수를 채우거나 유효한 환경 변수 이름을 형성하는 모든 키에서 컨테이너의 환경 변수를 채울 수 있습니다.
예를 들어 다음 구성 맵을 고려하십시오.
두 개의 환경 변수가 있는 ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: special-config 1 namespace: default 2 data: special.how: very 3 special.type: charm 4
하나의 환경 변수가 있는 ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: env-config 1 namespace: default data: log_level: INFO 2
절차
configMapKeyRef
섹션을 사용하여 Pod에서 이ConfigMap
의 키를 사용할 수 있습니다.특정 환경 변수를 삽입하도록 구성된 샘플
Pod
사양apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: 1 - name: SPECIAL_LEVEL_KEY 2 valueFrom: configMapKeyRef: name: special-config 3 key: special.how 4 - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config 5 key: special.type 6 optional: true 7 envFrom: 8 - configMapRef: name: env-config 9 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never
이 Pod가 실행되면 Pod 로그에 다음 출력이 포함됩니다.
SPECIAL_LEVEL_KEY=very log_level=INFO
SPECIAL_TYPE_KEY=charm
은 예제 출력에 나열되지 않습니다. optional: true
가 설정되어 있기 때문입니다.
2.5.4.2. 구성 맵을 사용하여 컨테이너 명령의 명령줄 인수 설정
구성 맵을 사용하여 Kubernetes 대체 구문 $(VAR_NAME)
을 사용하여 컨테이너에서 명령 또는 인수 값을 설정할 수 있습니다.
예를 들어 다음 구성 맵을 고려하십시오.
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: special.how: very special.type: charm
프로세스
컨테이너의 명령에 값을 삽입하려면 환경 변수로 사용할 키를 사용해야 합니다. 그런 다음
$(VAR_NAME)
구문을 사용하여 컨테이너의 명령에서 참조할 수 있습니다.특정 환경 변수를 삽입하도록 구성된 샘플 Pod 사양
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] 1 env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never
- 1
- 환경 변수로 사용할 키를 사용하여 컨테이너의 명령에 값을 삽입합니다.
이 Pod가 실행되면 test-container 컨테이너에서 실행되는 echo 명령의 출력은 다음과 같습니다.
very charm
2.5.4.3. 구성 맵을 사용하여 볼륨에 콘텐츠 삽입
구성 맵을 사용하여 볼륨에 콘텐츠를 삽입할 수 있습니다.
ConfigMap
CR(사용자 정의 리소스)의 예
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: special.how: very special.type: charm
프로세스
구성 맵을 사용하여 볼륨에 콘텐츠를 삽입하는 몇 가지 다른 옵션이 있습니다.
구성 맵을 사용하여 콘텐츠를 볼륨에 삽입하는 가장 기본적인 방법은 키가 파일 이름이고 파일의 콘텐츠가 키의 값인 파일로 볼륨을 채우는 것입니다.
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "cat", "/etc/config/special.how" ] volumeMounts: - name: config-volume mountPath: /etc/config securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] volumes: - name: config-volume configMap: name: special-config 1 restartPolicy: Never
- 1
- 키가 포함된 파일입니다.
이 Pod가 실행되면 cat 명령의 출력은 다음과 같습니다.
very
구성 맵 키가 프로젝션된 볼륨 내의 경로를 제어할 수도 있습니다.
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "cat", "/etc/config/path/to/special-key" ] volumeMounts: - name: config-volume mountPath: /etc/config securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] volumes: - name: config-volume configMap: name: special-config items: - key: special.how path: path/to/special-key 1 restartPolicy: Never
- 1
- 구성 맵 키 경로입니다.
이 Pod가 실행되면 cat 명령의 출력은 다음과 같습니다.
very