게으름을 위한 부지런한 게으름뱅리' 블로그

[K8S] 쿠버네티스 Configmap과 yaml 예시 본문

IT/K8S

[K8S] 쿠버네티스 Configmap과 yaml 예시

LazismLee 2024. 6. 30. 15:45
반응형

쿠버네티스에서 ConfigMap은 애플리케이션 설정 정보를 저장하고 관리하는 리소스입니다. 주로 환경 변수, 설정 파일 등의 텍스트 데이터를 저장하는 데 사용됩니다. ConfigMap은 다음과 같은 특징을 가집니다:

 

  • 텍스트 데이터 저장: 주로 텍스트 기반의 설정 정보를 저장합니다. 예를 들어, 데이터베이스 주소, 포트 번호, API 키, 환경 변수 등을 저장할 수 있습니다.
  • 애플리케이션 설정 외부화: ConfigMap을 사용하여 애플리케이션의 설정을 컨테이너 이미지에서 분리할 수 있습니다. 이는 설정을 변경할 때 컨테이너를 다시 빌드하지 않고도 설정 값을 업데이트할 수 있게 합니다.
  • 파드에서 볼륨 마운트: ConfigMap을 파드 내부에 볼륨으로 마운트하여 애플리케이션에 설정 값을 제공할 수 있습니다. 이를 통해 애플리케이션은 파일 시스템 경로를 통해 설정 값을 읽어들일 수 있습니다.
  • 환경 변수로 주입: ConfigMap의 데이터를 환경 변수로 직접 주입하여 애플리케이션에서 활용할 수도 있습니다.
  • 다양한 데이터 포맷 지원: ConfigMap은 텍스트 데이터뿐만 아니라 JSON, XML 등 다양한 데이터 형식을 저장할 수 있습니다.

ConfigMap은 일반적으로 YAML 파일을 사용하여 정의하거나 kubectl create configmap 명령어를 통해 생성할 수 있습니다. 애플리케이션의 설정 관리를 위해 중요한 쿠버네티스 리소스 중 하나입니다.

 

ConfigMap을 사용할 수 있는 주요 리소스

 

  • 파드 (Pods):
    • 파드 내에서 ConfigMap을 환경 변수로 주입하거나 볼륨으로 마운트하여 애플리케이션에 설정 값을 제공할 수 있습니다.
  • 레플리카셋 (ReplicaSet):
    • 레플리카셋을 통해 관리되는 파드들도 ConfigMap을 환경 변수로 주입하거나 볼륨으로 마운트하여 설정 값을 공유할 수 있습니다.
  • 디플로이먼트 (Deployment):
    • 디플로이먼트 역시 ConfigMap을 사용하여 파드에 설정 값을 제공할 수 있습니다. 디플로이먼트는 레플리카셋을 기반으로 하므로 레플리카셋과 동일하게 ConfigMap을 사용할 수 있습니다.
  • 스테이트풀셋 (StatefulSet):
    • 스테이트풀셋 역시 파드를 관리하는 리소스이며, ConfigMap을 환경 변수로 주입하거나 볼륨으로 마운트하여 설정 값을 전달할 수 있습니다.
  • 데몬셋 (DaemonSet):
    • 모든 노드에 하나씩 파드를 실행하는 데몬셋에서도 ConfigMap을 사용하여 설정 값을 제공할 수 있습니다.
  • 잡 (Job)크론잡 (CronJob):
    • 일시적으로 실행되는 작업을 정의하는 잡 및 주기적으로 실행되는 작업을 정의하는 크론잡에서도 ConfigMap을 환경 변수로 주입하거나 볼륨으로 마운트하여 설정 값을 사용할 수 있습니다.

YAML파일 설정 예시

 

다음은 ConfigMap을 사용하여 YAML 파일에서 설정을 정의하는 예시입니다

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config   # ConfigMap의 이름
data:
  # 텍스트 데이터를 key-value 쌍으로 정의
  database-url: "mysql://db.example.com:3306/mydatabase"
  api-key: "abc123xyz456"
  app.properties: |
    # 여러 줄의 설정 파일 예시
    key1=value1
    key2=value2
    key3=value3

 

 

  • apiVersion: 사용할 Kubernetes API 버전을 지정합니다. 여기서는 v1을 사용하고 있습니다.
  • kind: 리소스의 종류를 지정합니다. 여기서는 ConfigMap을 정의하고 있습니다.
  • metadata: ConfigMap의 메타데이터 정보를 지정합니다. 여기서는 ConfigMap의 이름을 app-config로 지정하고 있습니다.
  • data: 실제로 저장할 데이터를 지정하는 부분입니다. 각각의 항목은 key-value 쌍으로 되어 있습니다.
    • database-url: 데이터베이스 연결 URL을 설정하고 있습니다.
    • api-key: 애플리케이션에서 사용할 API 키를 설정하고 있습니다.
    • app.properties: 설정 파일 형태로 여러 줄의 데이터를 저장하고 있습니다. | 기호를 사용하여 다중 줄 문자열로 정의하였습니다.

이렇게 정의된 ConfigMap을 사용하면 파드나 다른 Kubernetes 리소스에서 이 설정 값을 활용할 수 있습니다. 예를 들어, 파드에서 ConfigMap을 환경 변수로 주입하거나 볼륨으로 마운트하여 설정 값을 사용할 수 있습니다.

♪  파드에서 yaml 파일 Configmap 적용하기

♬ 환경 변수로 주입하는 예시

파드에서 ConfigMap을 환경 변수로 주입하는 방법은 env 필드를 사용하여 ConfigMap의 데이터를 환경 변수로 설정하는 것입니다.

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
    - name: app-container
      image: my-app-image
      env:
        # ConfigMap의 데이터를 환경 변수로 주입
        - name: DATABASE_URL
          valueFrom:
            configMapKeyRef:
              name: app-config   # ConfigMap의 이름
              key: database-url  # ConfigMap에서 사용할 key
        - name: API_KEY
          valueFrom:
            configMapKeyRef:
              name: app-config   # ConfigMap의 이름
              key: api-key       # ConfigMap에서 사용할 key
  restartPolicy: Never

 

위 예시에서는 env 필드를 사용하여 ConfigMap의 database-url과 api-key를 각각 DATABASE_URL과 API_KEY 환경 변수로 주입하고 있습니다. 파드 내의 app-container에서는 이 환경 변수들을 사용하여 설정 값을 읽어들일 수 있습니다.

 

 볼륨으로 마운트하는 예시

파드에서 ConfigMap을 볼륨으로 마운트하여 파일 시스템 경로를 통해 설정 값을 사용하는 방법은 volumes 및 volumeMounts 필드를 사용하여 구성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
    - name: app-container
      image: my-app-image
      volumeMounts:
        - name: config-volume   # 볼륨 이름
          mountPath: /etc/config  # 마운트될 경로
  volumes:
    - name: config-volume
      configMap:
        name: app-config   # ConfigMap의 이름
  restartPolicy: Never

위 예시에서는 volumes 필드에 ConfigMap을 지정하여 config-volume이라는 이름의 볼륨을 생성하고 있습니다. 그리고 volumeMounts 필드를 사용하여 app-container 내에서 /etc/config 경로에 이 볼륨을 마운트하고 있습니다. 이제 파드 내에서 /etc/config 경로를 통해 ConfigMap의 데이터에 접근할 수 있습니다.

 

이렇게 하면 파드에서 ConfigMap을 환경 변수로 주입하거나 볼륨으로 마운트하여 설정 값을 효과적으로 활용할 수 있습니다.

 

ConfigMap을 파드에서 환경 변수로 주입하거나 볼륨으로 마운트하는 작업은 YAML 파일 외에도 kubectl 명령어를 사용하여 직접 구성할 수 있습니다. 아래에서 각각의 방법에 대해 kubectl 명령어 예시를 보여드리겠습니다.

 

♪  kubectl로 적용하기

ConfigMap을 파드에서 환경 변수로 주입하거나 볼륨으로 마운트하는 작업은 YAML 파일 외에도 kubectl 명령어를 사용하여 직접 구성할 수 있습니다. 아래에서 각각의 방법에 대해 kubectl 명령어 예시를 보여드리겠습니다.

환경 변수로 주입하는 경우

환경 변수로 ConfigMap을 주입하기 위해서는 kubectl 명령어에서 env 옵션을 사용하여 각 환경 변수를 설정할 수 있습니다.

kubectl run app-pod --image=my-app-image --env="DATABASE_URL=$(kubectl get configmap app-config -o=jsonpath='{.data.database-url}')" --env="API_KEY=$(kubectl get configmap app-config -o=jsonpath='{.data.api-key}')" --restart=Never

위 명령어에서:

  • kubectl run: 파드를 생성하는 명령어입니다.
  • --env: 환경 변수를 설정하는 옵션입니다. 여기서는 kubectl get configmap 명령어를 사용하여 app-config ConfigMap에서 database-url과 api-key 값을 가져와 환경 변수로 설정하고 있습니다.
  • --restart=Never: 파드의 재시작 정책을 설정하는 옵션입니다. 필요에 따라 조정할 수 있습니다.

볼륨으로 마운트하는 경우

볼륨으로 ConfigMap을 파드에 마운트하는 경우에는 kubectl 명령어에서 volume 및 volume-mount 옵션을 사용하여 설정합니다.

kubectl run app-pod --image=my-app-image --restart=Never --overrides='
{
  "spec": {
    "containers": [
      {
        "name": "app-container",
        "volumeMounts": [
          {
            "name": "config-volume",
            "mountPath": "/etc/config"
          }
        ]
      }
    ],
    "volumes": [
      {
        "name": "config-volume",
        "configMap": {
          "name": "app-config"
        }
      }
    ]
  }
}'

위 명령어에서:

  • kubectl run: 파드를 생성하는 명령어입니다.
  • --overrides: JSON 형식으로 파드의 스펙을 직접 설정할 수 있는 옵션입니다. 여기서는 spec.containers.volumeMounts 및 spec.volumes를 사용하여 ConfigMap을 config-volume이라는 이름의 볼륨으로 설정하고, 이를 /etc/config 경로에 마운트하고 있습니다.
  • "name": "app-config": ConfigMap의 이름을 지정하고 있습니다.

이렇게 kubectl 명령어를 사용하여도 YAML 파일을 사용하는 것과 유사하게 ConfigMap을 환경 변수로 주입하거나 볼륨으로 마운트할 수 있습니다.

반응형
Comments