Post

[Kubernetes] ConfigMap과 Secret

Kubernetes Pod 환경 구성을 위한 오브젝트 - ConfigMap과 Secret

Kubernetes에서 애플리케이션을 배포할 때, 각 Pod는 다양한 환경 설정이 필요합니다. 이때, ConfigMapSecret은 Pod의 환경 변수를 효율적으로 관리하고, 보안 정보나 설정 값을 저장 및 제공하는 데 중요한 역할을 합니다. 이 포스팅에서는 ConfigMapSecret을 사용하여 Pod 환경을 구성하는 방법에 대해 설명하고, 실습 예시를 통해 구체적인 활용법을 살펴보겠습니다.

1. ConfigMap과 Secret 이해

1.1 ConfigMap

ConfigMap은 설정 데이터를 키-값 형태로 저장하는 Kubernetes 오브젝트입니다. 이를 통해 애플리케이션 코드와 환경 설정을 분리하여 관리할 수 있습니다. ConfigMap은 데이터베이스 연결 정보, API 키, 설정 파일 등 애플리케이션에서 필요한 다양한 설정을 저장할 수 있습니다.

ConfigMap 예시

1
2
3
4
5
6
7
8
yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  DATABASE_URL: postgres://user:password@db:5432/mydatabase

이 ConfigMap은 APP_ENVDATABASE_URL이라는 환경 변수를 저장하고 있습니다.

1.2 Secret

Secret은 민감한 데이터를 저장하기 위한 Kubernetes 오브젝트로, 보안에 민감한 정보인 비밀번호, 토큰, API 키 등을 저장하는 데 사용됩니다. ConfigMap과 비슷하지만, Secret은 base64로 인코딩된 데이터를 저장하여 좀 더 안전하게 민감한 정보를 다룰 수 있도록 합니다.

Secret 예시

1
2
3
4
5
6
7
8
9
yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: dXNlcm5hbWU=  # base64로 인코딩된 "username"
  password: cGFzc3dvcmQ=  # base64로 인코딩된 "password"

이 Secret은 usernamepassword를 저장하고 있으며, base64로 인코딩된 값을 담고 있습니다.

2. ConfigMap 활용

2.1 환경 변수를 통한 ConfigMap 사용

ConfigMap을 Pod의 환경 변수로 사용하려면 envFrom 필드를 사용합니다. 다음은 ConfigMap을 참조하여 Pod를 생성하는 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
    - name: myapp-container
      image: nginx:1.25.3-alpine
      envFrom:
        - configMapRef:
            name: app-config

이 Pod는 app-config ConfigMap을 환경 변수로 사용하여 실행됩니다.

2.2 ConfigMap을 볼륨으로 마운트하기

ConfigMap 데이터를 파일로 마운트할 수 있습니다. 이 경우, ConfigMap의 각 키가 파일 이름이 되며, 그 값은 파일 내용으로 저장됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: myapp-container
      image: nginx:1.25.3-alpine
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: app-config

이 예시에서는 app-config ConfigMap의 데이터를 /etc/config 디렉토리에 마운트하고 있습니다.

2.3 ConfigMap 수정 및 적용

실행 중인 애플리케이션에서 ConfigMap을 수정할 수 있습니다. 예를 들어, 다음과 같이 ConfigMap을 수정하고 이를 적용할 수 있습니다.

1
kubectl edit configmap app-config

수정 후 Pod는 변경된 ConfigMap을 자동으로 사용할 수 있습니다. 필요하다면 Pod를 재시작하여 변경된 환경 변수를 반영할 수 있습니다.

3. Secret 활용

3.1 환경 변수를 통한 Secret 사용

Secret은 ConfigMap과 유사하게 Pod의 환경 변수로 사용할 수 있습니다. 아래는 Secret을 환경 변수로 사용하는 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
    - name: myapp-container
      image: busybox
      envFrom:
        - secretRef:
            name: db-secret

이 Pod는 db-secret Secret의 값을 환경 변수로 설정하여 컨테이너 내에서 사용할 수 있습니다.

3.2 Secret을 볼륨으로 마운트하기

Secret 데이터를 볼륨으로 마운트할 수 있습니다. 마운트된 Secret의 각 키가 파일 이름이 되고, 그 값은 파일 내용으로 저장됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  containers:
    - name: myapp-container
      image: busybox
      volumeMounts:
        - name: secret-volume
          mountPath: /etc/secrets
  volumes:
    - name: secret-volume
      secret:
        secretName: db-secret

이 예시에서는 db-secret Secret을 /etc/secrets 디렉토리에 마운트하여 Pod에서 파일로 접근할 수 있습니다.

4. 실습: ConfigMap과 Secret 생성 및 활용

4.1 ConfigMap 생성

1
2
3
kubectl create configmap app-config \
  --from-literal=APP_ENV=production \
  --from-literal=DATABASE_URL=postgres://user:password@db:5432/mydatabase

4.2 Secret 생성

1
2
3
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=secret123

4.3 Pod에서 ConfigMap과 Secret 사용

ConfigMap과 Secret을 생성한 후, 이를 Pod에서 사용하는 예시를 작성할 수 있습니다. 다음과 같이 ConfigMap과 Secret을 환경 변수로 설정한 Pod YAML 파일을 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
yaml
apiVersion: v1
kind: Pod
metadata:
  name: config-secret-pod
spec:
  containers:
    - name: myapp-container
      image: nginx:1.25.3-alpine
      envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: db-secre

4.4 ConfigMap과 Secret을 동적으로 변경

Kubernetes에서는 ConfigMap과 Secret의 변경 사항을 Pod에 즉시 반영할 수 있습니다. 변경 후, 다음 명령어를 사용하여 Pod를 재시작하지 않고도 업데이트된 값을 반영할 수 있습니다.

1
kubectl rollout restart pod <pod-name>

5. Ambassador Pod 패턴

Ambassador 패턴 이해

Ambassador 패턴은 외부 서비스에 대한 요청을 처리하는 별도의 컨테이너(Proxy)를 Pod에 추가하여 외부 서비스와의 연결을 관리합니다. 이 패턴은 주로 데이터베이스와 같은 외부 리소스에 대한 접근을 제어하고, 복잡한 네트워크 연결을 간소화하는 데 사용됩니다.

1
2
3
4
5
6
7
8
9
10
11
yaml
apiVersion: v1
kind: Pod
metadata:
  name: ambassador-pod
spec:
  containers:
    - name: app-container
      image: nginx:1.25.3-alpine
    - name: ambassador-container
      image: nginx:1.25.3-alpine

Ambassador 컨테이너는 외부 DB 서버나 API와의 연결을 관리하며, 애플리케이션 컨테이너는 이 Ambassador 컨테이너를 통해 외부 서비스에 접근합니다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.