DevOps

Kubernetes - Secret, ConfigMap

Vince_rf 2024. 11. 2. 01:18

쿠버네티스에서 **시크릿(Secret)**은 암호, API 키, 인증 토큰 등 민감한 정보를 안전하게 저장하고 배포하는 리소스입니다. 시크릿을 사용하면 애플리케이션 코드를 수정하지 않고도 민감한 정보를 안전하게 파드에 전달할 수 있습니다.

시크릿의 주요 개념

  1. 기밀 데이터 보호: 시크릿은 비밀번호, API 키, 인증 토큰 같은 민감한 정보를 Base64 인코딩하여 저장합니다.
  2. 파드와 시크릿 연결: 시크릿을 파드에 마운트하여 환경 변수로 주입하거나 파일 시스템 볼륨으로 마운트할 수 있습니다.
  3. 시크릿 유형: 다양한 유형의 시크릿이 있으며, Opaque가 일반적으로 사용됩니다.

시크릿 종류

  • Opaque: 기본적으로 사용되는 유형으로, 커스텀 데이터를 담을 수 있습니다.
  • kubernetes.io/service-account-token: 서비스 어카운트와 관련된 토큰을 저장할 때 사용합니다.
  • kubernetes.io/dockerconfigjson: 프라이빗 Docker 레지스트리 인증에 사용하는 시크릿입니다.

시크릿 생성 방법

1. kubectl 명령어를 통한 생성

kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=mypassword

2. YAML 파일로 생성

YAML 파일로 시크릿을 정의하여 생성할 수 있습니다. 예시:

 
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=   # 'admin'의 Base64 인코딩 값
  password: bXlwYXNzd29yZA==  # 'mypassword'의 Base64 인코딩 값

시크릿 사용 방법

  1. 환경 변수로 사용 파드 매니페스트에서 시크릿을 환경 변수로 주입하여 사용할 수 있습니다.
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: my-image
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password


  2. 볼륨 마운트로 사용 시크릿을 파일 시스템에 마운트하여 사용할 수도 있습니다.이 경우 /etc/secret/username과 /etc/secret/password 파일에 각각의 시크릿 값이 저장됩니다.

 

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

시크릿 관리의 보안 고려 사항

  1. RBAC 설정: 시크릿에 접근할 수 있는 권한을 철저히 관리합니다.
  2. ETCD 암호화: 쿠버네티스는 기본적으로 etcd에 시크릿을 평문으로 저장하므로, etcd 암호화를 활성화하여 보호해야 합니다.
  3. 네트워크 정책: 특정 네임스페이스나 파드에서만 시크릿에 접근하도록 네트워크 정책을 구성할 수 있습니다.

쿠버네티스 시크릿은 이러한 보안 정책들을 적절히 구성하여 안전하게 관리할 수 있는 매우 유용한 기능입니다.

 

쿠버네티스 ConfigMap은 애플리케이션 설정과 같은 비밀이 아닌 구성 데이터를 저장하고 관리하기 위한 리소스입니다. ConfigMap을 사용하면 애플리케이션의 컨테이너 이미지를 수정하지 않고도 설정을 외부에서 유연하게 제공할 수 있습니다.

ConfigMap 주요 개념

  1. 비밀이 아닌 설정 데이터: ConfigMap은 데이터베이스 URL, 애플리케이션 설정 값 등 비밀이 아닌 데이터를 저장합니다. 비밀 데이터는 시크릿(Secret)으로 관리하는 것이 권장됩니다.
  2. 파드와의 연결: ConfigMap 데이터를 환경 변수로 주입하거나 파일 시스템에 마운트하여 파드에서 사용할 수 있습니다.
  3. 유연한 업데이트: ConfigMap을 업데이트하면, 파드의 재배포 없이도 설정을 변경할 수 있어 애플리케이션 설정 관리가 용이합니다.

ConfigMap 생성 방법

1. kubectl 명령어로 생성

단일 키-값 쌍을 지정하거나 파일에서 값을 불러와 생성할 수 있습니다.

# 단일 키-값 쌍을 사용해 ConfigMap 생성
kubectl create configmap my-config --from-literal=app_name=myapp --from-literal=log_level=debug

# 파일에서 생성
kubectl create configmap my-config --from-file=config-file.txt

2. YAML 파일로 생성

YAML 파일을 작성하여 ConfigMap을 정의할 수도 있습니다. 예시:

 
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  app_name: "myapp"
  log_level: "debug"
  database_url: "http://mydatabase.example.com"

ConfigMap 사용 방법

  1. 환경 변수로 사용 ConfigMap 값을 파드의 환경 변수로 주입할 수 있습니다.
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: my-image
        env:
        - name: APP_NAME
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: app_name
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: log_level
  2. 볼륨 마운트로 사용 ConfigMap을 파일로 마운트하여 애플리케이션에서 사용할 수 있습니다.이 경우 ConfigMap의 각 키가 /etc/config 디렉토리에 파일로 생성되며, 파일 내용은 해당 키의 값이 됩니다.
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: config-volume
      mountPath: "/etc/config"
  volumes:
  - name: config-volume
    configMap:
      name: my-config

 

ConfigMap 업데이트

  • ConfigMap은 업데이트 가능하며, 파드가 이를 참조하면 변경된 설정을 즉시 반영할 수 있습니다.
  • 그러나 파드가 ConfigMap의 내용을 즉시 반영하지 않는 경우 kubectl rollout restart 명령어를 사용해 파드를 재시작하여 변경 사항을 적용할 수 있습니다.

ConfigMap과 Secret 비교

  • ConfigMap: 비밀이 아닌 데이터를 저장하는 데 사용.
  • Secret: 비밀번호, 토큰 등 민감한 정보를 저장하며, 데이터를 Base64로 인코딩하여 저장.

ConfigMap 관리 시 주의 사항

  1. 기밀 정보는 시크릿 사용: ConfigMap에는 비밀 정보가 저장되지 않도록 주의합니다.
  2. 종속성 관리: ConfigMap을 참조하는 파드에서 ConfigMap이 삭제되면 애플리케이션이 오류를 일으킬 수 있으므로, 종속성을 확인하여 관리합니다.

ConfigMap은 쿠버네티스 애플리케이션 설정을 외부에서 동적으로 관리할 수 있게 하여 유연하고 효율적인 운영을 가능하게 해줍니다.

 

 

Optional )

 

echo -n 'secret' | base64

 
 
echo 'c2VjcmV0' | base64 -d