쿠버네티스 ConfigMap과 Secret 사용법

서론


쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 애플리케이션 설정과 비밀 정보를 효율적으로 관리하는 것은 쿠버네티스를 사용하는 데 있어 중요한 부분입니다. ConfigMap과 Secret은 이러한 설정과 비밀 정보를 관리하기 위해 쿠버네티스에서 제공하는 핵심 리소스입니다. 이번 포스팅에서는 ConfigMap과 Secret의 개념과 활용 방법을 초보자도 쉽게 이해할 수 있도록 자세히 설명합니다.


본론


ConfigMap의 개념과 활용


ConfigMap이란?


ConfigMap은 애플리케이션 설정 데이터를 키-값 쌍으로 저장하는 쿠버네티스 리소스입니다. 이를 통해 컨테이너 이미지에 설정 데이터를 포함시키지 않고도 애플리케이션의 설정을 외부에서 관리할 수 있습니다. ConfigMap은 환경 변수, 명령줄 인수 또는 구성 파일로 컨테이너에 전달될 수 있습니다.


ConfigMap 생성 방법


ConfigMap은 여러 가지 방법으로 생성할 수 있습니다. 여기서는 YAML 파일을 사용한 방법과 kubectl 명령어를 사용한 방법을 설명합니다.


YAML 파일을 사용한 ConfigMap 생성


다음은 ConfigMap을 생성하는 YAML 파일의 예시입니다.


apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  database_url: "mongodb://localhost:27017"
  feature_enabled: "true"

이 YAML 파일을 사용하여 ConfigMap을 생성하려면 다음 명령어를 실행합니다.


kubectl apply -f my-config.yaml

kubectl 명령어를 사용한 ConfigMap 생성


kubectl 명령어를 사용하여 ConfigMap을 생성할 수도 있습니다.


kubectl create configmap my-config --from-literal=database_url=mongodb://localhost:27017 --from-literal=feature_enabled=true

ConfigMap 사용 방법


ConfigMap은 여러 가지 방법으로 컨테이너에 전달될 수 있습니다. 여기서는 환경 변수로 전달하는 방법과 볼륨으로 마운트하는 방법을 설명합니다.


환경 변수로 ConfigMap 사용


다음은 ConfigMap을 환경 변수로 전달하는 파드의 YAML 파일 예시입니다.


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: DATABASE_URL
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: database_url
    - name: FEATURE_ENABLED
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: feature_enabled

이 YAML 파일을 사용하여 파드를 생성하면, DATABASE_URLFEATURE_ENABLED 환경 변수가 ConfigMap에서 가져온 값으로 설정됩니다.


볼륨으로 ConfigMap 사용


다음은 ConfigMap을 볼륨으로 마운트하는 파드의 YAML 파일 예시입니다.


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config

이 YAML 파일을 사용하여 파드를 생성하면, ConfigMap의 데이터가 /etc/config 디렉토리에 파일 형태로 마운트됩니다.


Secret의 개념과 활용


Secret이란?


Secret은 비밀 데이터를 저장하고 관리하는 쿠버네티스 리소스입니다. 비밀번호, API 키, 인증서 등 민감한 정보를 암호화하여 저장할 수 있습니다. Secret은 ConfigMap과 유사하게 환경 변수, 명령줄 인수 또는 구성 파일로 컨테이너에 전달될 수 있습니다.


Secret 생성 방법


Secret은 여러 가지 방법으로 생성할 수 있습니다. 여기서는 YAML 파일을 사용한 방법과 kubectl 명령어를 사용한 방법을 설명합니다.


YAML 파일을 사용한 Secret 생성


다음은 Secret을 생성하는 YAML 파일의 예시입니다.


apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  password: cGFzc3dvcmQ=  # "password"를 base64로 인코딩한 값

이 YAML 파일을 사용하여 Secret을 생성하려면 다음 명령어를 실행합니다.


kubectl apply -f my-secret.yaml

kubectl 명령어를 사용한 Secret 생성


kubectl 명령어를 사용하여 Secret을 생성할 수도 있습니다.


kubectl create secret generic my-secret --from-literal=password=password

위 명령어는 비밀번호를 base64로 자동 인코딩하여 Secret을 생성합니다.


Secret 사용 방법


Secret은 여러 가지 방법으로 컨테이너에 전달될 수 있습니다. 여기서는 환경 변수로 전달하는 방법과 볼륨으로 마운트하는 방법을 설명합니다.


환경 변수로 Secret 사용


다음은 Secret을 환경 변수로 전달하는 파드의 YAML 파일 예시입니다.


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

이 YAML 파일을 사용하여 파드를 생성하면, PASSWORD 환경 변수가 Secret에서 가져온 값으로 설정됩니다.


볼륨으로 Secret 사용


다음은 Secret을 볼륨으로 마운트하는 파드의 YAML 파일 예시입니다.


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

이 YAML 파일을 사용하여 파드를 생성하면, Secret의 데이터가 /etc/secret 디렉토리에 파일 형태로 마운트됩니다.


ConfigMap과 Secret 관리


ConfigMap 및 Secret 조회


현재 네임스페이스의 모든 ConfigMap과 Secret을 조회하려면 다음 명령어를 사용합니다.


kubectl get configmaps
kubectl get secrets

ConfigMap 및 Secret 상세 정보 조회


특정 ConfigMap과 Secret의 상세 정보를 조회하려면 다음 명령어를 사용합니다.


kubectl describe configmap my-config
kubectl describe secret my-secret

ConfigMap 및 Secret 삭제


특정 ConfigMap과 Secret을 삭제하려면 다음 명령어를 사용합니다.


kubectl delete configmap my-config
kubectl delete secret my-secret

실습: ConfigMap과 Secret을 사용한 애플리케이션 배포


이번 실습에서는 ConfigMap과 Secret을 사용하여 간단한 애플리케이션을 배포하는 과정을 진행합니다.


  1. ConfigMap 생성

다음 YAML 파일을 사용하여 ConfigMap을 생성합니다.


apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_url: "mongodb://db:27017"
  feature_flag: "true"

kubectl apply -f app-config.yaml

  1. Secret 생성

다음 YAML 파일을 사용하여 Secret을 생성합니다.


apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  db-password: cGFzc3dvcmQ=  # "password"를 base64로 인코딩한 값

kubectl apply -f app-secret.yaml

  1. 애플리케이션 배포

다음 YAML 파일을 사용하여 애플리케이션 파드를 배포합니다.


apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app-container
    image: my-app-image
    env:
    - name: DATABASE_URL
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: database_url
    - name: FEATURE_FLAG
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: feature_flag
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: app-secret
          key: db-password

kubectl apply -f my-app.yaml

이렇게 하면 애플리케이션 파드는 ConfigMap과 Secret에서 필요한 설정과 비밀 정보를 가져와 환경 변수를 설정하게 됩니다.


결론


ConfigMap과 Secret은 쿠버네티스에서 애플리케이션 설정과 비밀 정보를 관리하는 중요한 리소스입니다. ConfigMap은 설정 데이터를, Secret은 비밀 데이터를 안전하게 저장하고 관리할 수 있습니다. 이번 포스팅에서는 ConfigMap과 Secret의 개념, 생성 방법, 사용 방법을 상세히 설명했습니다. 이를 통해 쿠버네티스에서 애플리케이션을 배포할 때 ConfigMap과 Secret을 효과적으로 활용할 수 있기를 바랍니다.

다음 이전