본문 바로가기

IT 인프라/DevOps

Kubernetes Secret으로 기밀정보 관리하기

반응형

Kubernetes Secret은 ConfigMap과 유사하게 어떠한 정보를 담고 있지만, 다음과 같은 차이점이 있다. :

  • Secret은 API 키, ID/Password, 인증서 등 기밀 정보를 다룬다.
  • 따라서 etcd 안에서 암호화된 상태로 관리된다
  • Manifest 파일 작성시 key의 value는 base64 인코딩한 값을 입력해야 한다.

Secret 생성하기

인증서 같은 기밀 정보 파일을 Secret으로 생성

###
# Secret 생성
#  - ConfigMap 처럼 --from-env-file, --from-literal 존재
###
$ kubectl create secret generic {Secret 이름} --from-file={key}={value}

###
# 사용 예시
###
$ kubectl create secret generic my-publickey --from-file=publickey=/Users/jhyunto/.ssh/id_rsa.pub

 

API 키와 같은 Key-Value 형태의 기밀 정보를 Secret으로 생성

###
# base64 인코딩
###
$ echo "hyunto" | base64
aHl1bnRvCg==
$ echo "jhyunto@gmail.com" | base64
amh5dW50b0BnbWFpbC5jb20K

###
# Secret Manifest 파일 (secret.yml)
###
apiVersion: v1
kind: Secret
metadata:
  name: my-info
type: Opaque
data:
  name: aHl1bnRvCg==
  email: amh5dW50b0BnbWFpbC5jb20K
  
###
# Secret 생성
###
$ kubectl create -f ./secret.yml

 

Secret 사용

환경변수로 사용하기

###
# 적용 예시
###
spec:
  template:
    spec:
      containers:
        ...<생략>...
        env:
        - name: {환경변수 이름}
          valueFrom:
            secretKeyRef:
              name: {Secret 이름}
              key: {Secret Manifest에서 data 필드에 입력한 Key}
              
            
###
# 사용 예시
###
containers:
  ...<생략>...
  env:
  - name: MY_NAME
    valueFrom:
      secretKeyRef:
        name: my-info
        key: name
      
###
# 적용 확인
###
root@secret-test-559468658c-t6cjg:/# env | grep MY_NAME
MY_NAME=hyunto

볼륨 마운트하여 사용하기

###
# 적용 예시
###
spec:
  template:
    spec:
      containers:
        ...<생략>...
        volumeMounts:
          - name: {볼륨 이름}
            mountPath: {마운트 경로}
            readOnly: true
      volumes:
        - name: {볼륨 이름}
          secret:
            secretName: {Secret 이름}
            
###
# 사용 예시
###
containers:
  ...<생략>...
  volumeMounts:
    - name: my-publickey-volume
      mountPath: /etc/secrets
      readOnly: true
volumes:
  - name: my-publickey-volume
    secret:
      secretName: my-publickey
      
###
# 적용 확인
###
root@secret-test-559468658c-t6cjg:/# ls -l /etc/secrets/
total 0
lrwxrwxrwx 1 root root 16 Nov 26 17:06 publickey -> ..data/publickey

 

실습에 사용한 Deployment.yml 파일

apiVersion: apps/v1
kind: Deployment
metadata:
  name: secret-test
spec:
  selector:
    matchLabels:
      app: secret-test
  template:
    metadata:
      labels:
        app: secret-test
    spec:
      containers:
      - name: nginx
        image: nginx
        resources:
          limits:
            memory: "1Gi"
            cpu: "500m"
        ports:
        - containerPort: 80
        env:
        - name: MY_NAME
          valueFrom:
            secretKeyRef:
              name: my-info
              key: name
        volumeMounts:
          - name: my-publickey-volume
            mountPath: /etc/secrets
            readOnly: true
      volumes:
        - name: my-publickey-volume
          secret:
            secretName: my-publickey
반응형