내 잡다한 노트

쿠버네티스 Secrets 본문

DevOps/쿠버네티스

쿠버네티스 Secrets

peanutwalnut 2024. 11. 17. 12:36

1. Secrets란 무엇인가?

  • Secrets는 Kubernetes에서 비밀번호, 인증키, API 토큰과 같은 민감한 정보를 저장하고 관리하기 위한 객체입니다.
  • ConfigMap과 유사하지만, 민감한 데이터를 인코딩(Base64) 형식으로 저장한다는 차이점이 있습니다.
  • ConfigMap과의 차이:
    • ConfigMap: 일반적인 환경 설정 데이터를 저장 (평문).
    • Secrets: 비밀번호와 같은 민감한 데이터를 저장 (Base64로 인코딩).

 

2. Secrets 생성 방법

Secrets를 생성하는 두 가지 주요 방법이 있습니다:

(1) 명령형(Imperative) 접근 방식

  • kubectl create secret 명령어를 사용하여 Secrets를 생성합니다.

예제 1: from-literal 옵션 사용

 
kubectl create secret generic app-secret --from-literal=DB_host=MySQL --from-literal=DB_password=my-secret-password
  • Secret 이름: app-secret
  • 키-값 데이터:
    • DB_host=MySQL
    • DB_password=my-secret-password

예제 2: from-file 옵션 사용

 
kubectl create secret generic app-secret --from-file=./db-config.txt
  • 파일의 내용을 Secret으로 저장.

 

(2) 선언형(Declarative) 접근 방식

  • Secrets를 정의하는 매니페스트 파일을 작성하여 생성합니다.

매니페스트 파일 예제 (secret.yaml)

 
apiVersion: v1
  kind: Secret
  metadata:
        name: app-secret
  data:
      DB_host: TXlTUUw= # Base64로 인코딩된 값
      DB_password: bXktc2VjcmV0LXBhc3N3b3Jk
  • data 섹션에는 모든 값을 Base64로 인코딩해야 합니다.

Base64 인코딩 방법

Linux에서 Base64로 인코딩:

 
echo -n "MySQL" | base64 # 출력: TXlTUUw=
 
Secret 생성:
 
kubectl apply -f secret.yaml

 

4. Secrets를 Pod에 주입

Secrets는 Pod에 여러 가지 방법으로 주입할 수 있습니다:

(1) 환경 변수로 주입

  • Secrets를 환경 변수로 추가:
 
apiVersion: v1
    kind: Pod
    metadata:
        name: app-pod
    spec:
        containers:
        - name: app-container
          image: my-app
          envFrom:
           - secretRef:
                 name: app-secret
  • Secrets에 저장된 값들이 애플리케이션의 환경 변수로 전달됩니다.

 

(2) 볼륨으로 마운트

  • Secrets 데이터를 파일 형태로 Pod에 마운트:
 
apiVersion: v1
kind: Pod
metadata:
    name: app-pod
spec:
    containers:
     - name: app-container
       image: my-app
       volumeMounts:
          - name: secret-volume
            mountPath: /etc/secrets
   volumes:
      - name: secret-volume
         secret: secretName: app-secret
  • /etc/secrets 디렉토리에 Secret의 각 키가 파일로 생성됩니다.
    • 파일 이름: Secret의 키
    • 파일 내용: Secret의 값(Base64 디코딩된 값)

 

5. Secrets의 보안 및 제한 사항

  • Secrets는 기본적으로 암호화되지 않음:
    • Secrets는 Base64로 인코딩되어 저장되며, 쉽게 디코딩 가능.
    • etcd에 저장된 데이터도 기본적으로 암호화되지 않으므로, 암호화 설정을 권장.
    • 암호화를 위해 EncryptionConfiguration을 사용해 kube-apiserver에 설정.

외부 Secret 관리 시스템 사용:

  • AWS Secrets Manager, Azure Key Vault, HashiCorp Vault 등.
  • Secrets를 Kubernetes 외부에서 관리하며, 더 강력한 보안 제공.

 

Secrets 사용 시 주의사항

  1. GitHub에 Secret 정의 파일 업로드 금지:
    • Secret이 포함된 파일을 GitHub에 업로드하면 Base64 인코딩된 데이터를 쉽게 디코딩할 수 있음.