DevOps/Kubernetes

쿠버네티스 - 환경변수 활용(ConfigMap, Secret)

재성스 2024. 10. 10. 18:00
반응형

환경 변수(Environment Variable)는 운영 체제나 애플리케이션이 실행되는 환경에 대한 정보를 담고 있는 변수다.프로그램이 실행될 때, 운영 체제에서 설정된 환경 분수에 접근해서 필요한 설정 값을 읽어들일 수 있다. 이를 통해 애플리케이션은 자신이 실행되고 있는 환경에 따라 동적으로 동작할 수 있다. 

이처럼, 쿠버네티스에서도 환경 변수는 애플리케이션이 외부 설정을 쉽게 접근할 수 있도록 해주는 중요한 메커니즘이다. 즉, 컨테이너와 애플리케이션이 배포 환경에 따라 설정값을 다르게 할 수 있도록 하며, 코드를 수정하지 않고도 다양한 환경에서 같은 애플리케이션을 실행할 수 있게 해준다. 

ConfigMap과 Secret 개요

쿠버네티스에서는 애플리케이션의 설정값을 관리하기 위해 ConfigMap과 Secret이라는 두 가지 주요 오브젝트를 제공한다. 이 두 오브젝트는 환경 변수를 포함하여 다양한 방식으로 설정 데이터를 주입하는 기능을 제공한다.

  • ConfigMap: 환경 설정 데이터와 같은 구성 데이터를 저장하기 위한 쿠버네티스의 오브젝트이다. 예를 들어, 애플리케이션이 실행되는 환경 변수를 설정하거나, 다른 설정 파일을 제공할 수 있다. 
  • Secret : 중요한 정보(예: 암호, 토큰, 인증서 등)를 저장하는 쿠버네티스 오브젝트로, 데이터를 Base64로 인코딩하여 저장한다. ConfigMap과 비슷한 방식으로 작동하지만 보안성이 중요한 경우 Secret을 사용한다. 

ConfigMap과 Secret은 여러 방식으로 Pod에 전달할 수 있으며, 이 중 Env (Literal), Env (File) 그리고 Volume Mount (File) 방식을 통해 설정 데이터를 주입할 수 있다.


1. Env(Literal) - 환경 변수로 ConfigMap과 Secret 사용

Env(Literal) 방식은 ConfigMap과 Secret을 환경 변수로 직접 Pod에 전달하는 방식이다. 이 방식은 가장 기본적인 형태로, 환경 변수를 설정할 때 간단하고 직관적으로 사용할 수 있으며, 데이터를 파일이 아닌 간단한 key-value 형태로 관리할 때 유용하다.

yaml 예시

1-1) ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-dev  # ConfigMap의 이름
data:
  SSH: 'false'  # SSH라는 key에 'false' 값을 설정 (환경 변수로 전달될 값)
  User: dev     # User라는 key에 'dev' 값을 설정 (환경 변수로 전달될 값)
  • 위 ConfigMap 예제에서 SSH와 User라는 설정을 저장하고 있고, 이 설정은 Pod에 환경 변수로 전달된다.

1-2) Secret

apiVersion: v1
kind: Secret
metadata:
  name: sec-dev  # Secret의 이름
data:
  Key: MTIzNA==  # Base64로 인코딩된 값, 실제 값은 '1234'
  • Secret은 민감한 데이터를 안전하게 관리하기 위한 객체다. Key 값은 민감한 데이터를 저장하기 위해 Base64로 인코딩된 값만 설정이 가능하다.

1-3) Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1  # Pod의 이름
spec:
  containers:
  - name: container
    image: kubetm/init  # 사용할 컨테이너 이미지
    envFrom:
    - configMapRef:
        name: cm-dev    # cm-dev ConfigMap의 모든 데이터를 환경 변수로 로드
    - secretRef:
        name: sec-dev   # sec-dev Secret의 모든 데이터를 환경 변수로 로드
  • 위 예제의 Pod는 앞서 설정한 cm-dev ConfigMap과 sec-dev Secret에서 설정된 데이터를 envFrom을 통해 환경 변수로 가져온다.
  • configMapRef는 cm-dev에서 설정한 모든 데이터를 환경 변수로 설정하고, secretRef는 sec-dev에서 설정한 모든 데이터를 환경 변수로 로드한다.
  • 이처럼 설정값을 직접 코드에 하드코딩할 필요 없이 환경 변수를 통해 필요한 데이터를 사용할 수 있다.

위 Env(Literal)의 설정 예시를 그림으로 표현하면 아래와 같다. 

Env(Literal) 설정 구

 


2. Env (File) - 파일을 통해 ConfigMap과 Secret 사용

이 방식은 설정 데이터를 파일로 변환하여 ConfigMap 또는 Secret에 저장하고, 이를 Pod의 환경 변수로 전달하는 방식이다. 

예)

2-1) ConfigMap

echo "Content" >> file-c.txt  # file-c.txt 파일에 "Content" 추가
kubectl create configmap cm-file --from-file=./file-c.txt  # ConfigMap을 파일에서 생성
  • 위 예제는 file-c.txt 파일의 내용을 ConfigMap으로 변환하여 cm-file이라는 ConfigMap을 생성한다.
  • 이 ConfigMap은 Pod에서 환경 변수로 사용할 수 있는 데이터 소스가 된다.

2-2) Secret

echo "Content" >> file-s.txt  # file-s.txt 파일에 "Content" 추가
kubectl create secret generic sec-file --from-file=./file-s.txt  # Secret을 파일에서 생성
  • 이 명령어는 file-s.txt 파일의 내용을 Secret으로 변환하여 sec-file이라는 Secret을 생성한다.

2-3) Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-file  # Pod의 이름
spec:
  containers:
  - name: container
    image: kubetm/init  # 사용할 컨테이너 이미지
    env:
    - name: file-c
      valueFrom:
        configMapKeyRef:
          name: cm-file     # cm-file ConfigMap에서 파일의 내용을 환경 변수로 설정
          key: file-c.txt   # file-c.txt 파일의 내용이 file-c라는 환경 변수로 설정
    - name: file-s
      valueFrom:
        secretKeyRef:
          name: sec-file    # sec-file Secret에서 파일의 내용을 환경 변수로 설정
          key: file-s.txt   # file-s.txt 파일의 내용이 file-s라는 환경 변수로 설정
  • 이 Pod는 ConfigMap과 Secret을 통해 파일에서 가져온 데이터를 환경 변수로 설정한다.
  • cm-file에서 file-c.txt의 내용을 file-c라는 환경 변수로 전달하고, sec-file에서 file-s.txt의 내용을 file-s라는 환경 변수로 전달한다.
  • 파일로 관리되던 데이터를 환경 변수로 변환하여 애플리케이션이 사용할 수 있도록 한다.

위 Env(file)의 설정 예시를 그림으로 표현하면 아래와 같다. 

Env(file) 설정 구조


3. Volume Mount (File) - 파일로 ConfigMap을 마운트

이 방식은 ConfigMap이나 Secret의 데이터를 Pod의 특정 경로에 파일로 마운트하는 방식이다. 애플리케이션은 마운트된 경로에서 파일을 읽어 데이터를 사용할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-mount  # Pod의 이름
spec:
  containers:
  - name: container
    image: kubetm/init  # 사용할 컨테이너 이미지
    volumeMounts:
    - name: file-volume
      mountPath: /mount  # ConfigMap 데이터를 마운트할 경로
  volumes:
  - name: file-volume
    configMap:
      name: cm-file  # ConfigMap 'cm-file'의 데이터를 마운트
  • 이 Pod는 cm-file ConfigMap에서 가저온 데이터를 /mount 경로에 파일로 마운트한다.
  • 애플리케이션은 /mount 경로에 마운트된 파일을 읽어 설정 데이터를 사용할 수 있다.
  • 이 방식은 애플리케이션이 파일을 직접 읽어야 하는 경우나 파일로 설정 데이터를 제공해야 하는 경우에 유용하다.

Volume Mount (File) 설정 구조


Kubectl 명령어를 사용하여 ConfigMap과 Secret을 생성하는 방식

ConfigMap 생성

1. 파일에서 ConfigMap 생성

kubectl create configmap cm-file --from-file=./file-c.txt
  • file-c.txt 파일의 내용을 기반으로 cm-file 이라는 이름의 ConfigMap을 생성한다. ConfigMap은 이 파일의 내용을 쿠버네티스 클러스터에 저장하고, 이후 Pod에 환경 변수나 파일로 주입할 수 있다.

2. 리터럴 값을 사용해 ConfigMap 생성

kubectl create configmap cm-file --from-literal=key1=value1
  • key1: value1 이라는 리터럴 값을 포함하는 cm-file ConfigMap을 생성한다. 이 방식은 간단한 설정 데이터를 직접 ConfigMap에 저장하고 싶을 때 사용된다.

3. 여러 리터럴 값으로  ConfigMap 생성

kubectl create configmap cm-file --from-literal=key1=value1 --from-literal=key2=value2
  • 여러 개의 key-value 쌍을 가진 ConfigMap을 생성한다. key1: value1과 key2: value2라는 설정이 cm-file에 저장된다.

 

Secret 생성

1. 파일에서 Secret 생성

kubectl create secret generic sec-file --from-file=./file-s.txt
  • file-s.txt 파일의 내용을 기반으로 sec-file이라는 이름의 secret을 생성한다. 
  • Base64로 인코딩된 형태로 쿠버네티스 클러스터에 저장된다.

2. 리터럴 값을 사용해 Secret 생성

kubectl create secret generic sec-file --from-literal=key1=value1
  • key1: value1 이라는 리터럴 값을 가진 Secret을 생성한다. 
  • 이 값도 Base64로 인코딩되어 저장되며, Pod에 저장될 때는 자동으로 디코딩되어 환경 변수나 파일로 사용할 수 있다. 

정리

유형 ConfigMap 사용 방식 Secret 사용 방식 사용 목적
Env(Literal) ConfigMap을 환경 변수로 직접 Pod에 전달 Secret을 환경 변수로 직접 Pod에 전달 간단한 key-value 형태의 데이터를 환경 변수로 전달할 때 유용
Env(File) 파일에서 데이터를 ConfigMap으로 변환 후, 환경 변수로 전달 파일에서 데이터를 Secret으로 변환 후, 환경 변수로 전달 파일 데이터를 환경 변수로 변환해 사용할 때 적합
Volume Mount(File) ConfigMap을 파일로 마운트하여 Pod에서 사용 Secret을 파일로 마운트하여 Pod에서 사용 Pod에서 파일로 설정 데이터를 관리해야 할 때

 

반응형