환경 변수 설정

개별 환경 변수 설정

 

Kubernetes에서 환경변수(ConfigMapSecret)는 애플리케이션 구성 및 비밀 정보를 관리하는 두 가지 핵심 리소스이다. 이 두 리소스는 애플리케이션 컨테이너에서 환경 변수를 설정하거나, 파일 시스템에 매핑하거나, 명령줄 인자로 제공할 수 있는 데이터를 저장하는 데 사용된다.

 

Kubernetes 환경에선 Pod를 생성할 때 Pod내에서 사용할 환경변수를 미리 지정해줄 수 있다. 

 

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
    - name: redis
      image: redis
      env:
        - name: DATABASE_HOST
          value: "redis.example.com"
        - name: DATABASE_PORT
          value: "6379"

 

단일 Pod를 구성할 때에는 추가적인 리소스를 필요하지 않기 때문에 해당 방법은 간단함 측면에서 좋을 수 있다.

 

하지만 여러 Pod 또는 애플리케이션에서 동일한 환경 변수를 설정해야 할 때 각 Pod 정의마다 중복해서 작성해야 하고, 또 변경이 있다면 제각각 적용해줘야 한다. 즉 유연성과 재사용성이 떨어질 수 있다. 또 가독성 측면에서 yaml 파일 자체의 길이가 길어질 수 있으므로 좋지 못하다. 

 

그럴 떄 사용할 수 있는게 바로 Configmap이다.

 

Configmap을 이용한 환경 변수 설정

 

ConfigMap은 환경 설정 값을 중앙에서 관리할 수 있는 쿠버네티스 리소스이다. 여러 Pod나 컨테이너가 ConfigMap에서 값을 가져와 사용할 수 있으므로, 관리 효율성이 높아진다.

 

ConfigMap은 YAML 파일을 통해 정의하거나 kubectl 명령어로 생성할 수 있다.

 

 

YAML 파일을 통한 Configmap 생성

 

먼저 redis_config.yaml 파일을 작성한다.

 

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis_config
data:
  DATABASE_HOST: "redis.example.com"
  DATABASE_PORT: "6379"

 

그 다음 YAML 파일을 사용하여 Configmap Resource를 생성해준다.

 

kubectl apply -f redis_config.yaml

 

Kubectl command로 Configmap 생성

 

--from-literal 옵션을 사용하여 키=값 쌍을 설정한다.

kubectl create configmap redis_config --from-literal=DATABASE_HOST=redis.example.com --from-literal=DATABASE_PORT=6379

 

위 두 방식으로 만든 Configmap은 모두 다음 명령어로 확인 가능하다.

 

kubectl get configmap

 

 

Pod에서 Configmap 사용

 

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
    - name: redis
      image: redis
      envFrom:
        - configMapRef:
            name: redis_config

 

Configmap과 개별 환경 변수 설정 비교

항목 Configmap 개별 환경 변수 설정
관리 방식 중앙 집중식 관리, 여러 Pod에서 재사용 가능 각 Pod 정의에서 개별적으로 설정
재사용성 여러 Pod에서 참조 가능 재사용 불가, Pod마다 중복 설정 필요
구성 변경 ConfigMap만 수정하면 적용됨 모 든 Pod 정의에서 각각 수정 필요
환경 변수 관리 복잡성 환경 변수가 많아도 일관성 있게 관리 가능 변수가 많아지면 관리가 어려워짐
pod 업데이트 재배포 없이 환경 변수 값 변경 가능 환경 변수를 변경하려면 Pod를 다시 배포해야 함

 

Secrets

앞의 환경변수 예제에서는 노출되어도 상관없는 정보를 저장한다. db open port, db name 등 하지만 외부에 노출되어선 안되는 정보를 어떻게 환경변수처럼 사용할 수 있을까? 그 때 사용되는 것이 바로 Secret이다. 

 

Secret은 비밀번호, API 키, 인증서와 같은 민감한 정보를 저장하는 데 사용된다. Secret은 기본적으로 Base64로 인코딩되며, 암호화된 방식으로 저장될 수 있다. 

 

YAML 파일을 통한 Secret 생성

 

먼저 redis_secret.yaml 파일 작성한다. 

다만 직접 value 값을 base64로 인코딩해서 저장해야 한다는 번거로움이 존재한다. 

apiVersion: v1
kind: Secret
metadata:
  name: redis-secret
type: Opaque
data:
  redis-password: c29tZXBhc3N3b3Jk  # "somepassword"를 base64로 인코딩한 값

 

그 후 kubectl 명령어로 secret resource를 생성한다.

kubectl apply -f redis-secret.yaml

 

Kubectl command로 Secret 생성

 

kubectl create secret generic redis-secret --from-literal=redis-password=somepassword

 

위 명령어는 redis-password라는 키에 "somepassword" 값을 저장한 Secret을 생성한다. 이 값은 자동으로 Base64로 인코딩되어 저장된다. 

 

Pod에서 Secret 사용

 

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
    - name: redis
      image: redis
      envFrom:
        - secretRef:
            name: redis-secret

'DevOps > Kubernetes' 카테고리의 다른 글

Kubernetes Drain, Cordon and Uncordon  (0) 2024.10.23
Kubernetes InitContainer  (0) 2024.10.23
Kubernetes Metrics Server 구축  (0) 2024.10.20
Kubernetes 환경에서의 Monitoring  (3) 2024.10.20
Kubernetes Static Pod & Control Plane  (0) 2024.10.18