05-15 20:52
Recent Posts
Recent Comments
관리 메뉴

miinsun

[이론] 쿠버네티스 컨피그맵(ConfigMap)과 시크릿(Secret) 본문

Infra/Kubernetes

[이론] 쿠버네티스 컨피그맵(ConfigMap)과 시크릿(Secret)

miinsun 2023. 6. 14. 13:46

유튜브 강의 '따배쿠'와 책 '쿠버네티스 입문'을 정리한 자료입니다.


📌 Kubernetes ConfigMap

쿠버네티스의 컨피그맵은 컨테이너에 필요한 환경 설정을 컨테이너와 분리해서 제공하는 기능이다.

컨피그맵을 이용하면 컨테이너를 분리해 하나는 개발용, 하나는 스테이지용, 하나는 서비스용으로 활용할 수 있게 된다.

 

- configMap yaml template

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-dev
  namespace: default
data:
  DB_URL: localhost
  DB_USER: myuser
  DB_PASS: mypass
  DEBUG_INFO: debug

 

.data 하위 필드로 실제 사용하려는 환경 설정 값을 넣는다. kubectl apply -f config.yaml으로 쿠버네티스 클러스터에 적용하고 kubectl describe configmap으로 설정 내용을 확인할 수 있다.

 

- configmap 정보 불러와서 사용하기

apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    spec:
      containers:
      - name: test
        env:
        - name: DEBUG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: config-dev
              key: DEBUG_INFO

deployment의 환경변수를 위에 지정한 configmap으로 설정해주었다.

.configMapKeyRef 필드로 어떤 ConfigMap의 어떤 키를 가져올 지를 지정할 수 있다.

.name 필드의 값을 config-dev를 설정해 앞서 만들어 두었던 config-dev 컨피그맵을 지정하고 필요한 key값 또한 지정해주었다.

 


📌 Kubernetes Secret

시크릿은 비밀번호, OAuth 토큰, SSH 키 값은 민감한 정보들을 저장하는 용도로 사용된다. 이런 정보들은 컨테이너 안에 저장하지 않고 별도로 보관했다가 실제 파드를 실행할 때의 템플릿으로 컨테이너에 제공한다.

  • ConfigMap: 컨테이너 구성 정보를 한 곳에 모아서 관리
  • Secret: 컨테이너가 사용하는 password, auth token, ssh key와 같은 민감 정보를 저장하고 구성 정보를 base64로 인코딩해서 한 곳에 모아서 관리

- Secret 만들기

# 명령으로 시크릿 만들기
$ echo -n 'username' > ./username.txt
$ echo -n 'password' > ./password.txt
$ kubectl create secret generic user-pass-secret --from-file=./username.txt --from-file=./password.txt

# 시크릿 확인
$ kubectl get secret user-pass-secret -o yaml

# 인코딩 된 값 디코딩하기
$ echo '인코딩 값' | base64 --decode
password

# 템플릿으로 시크릿 만들기
$ vim user-pass-yaml.yaml
apiVersion: v1
kind: Secret
metadata:
  name: user-pass-yaml
type: Opaque
data:
  username: dXNlcm5hbWU=
  password: cGFzc3dvcmQ=
  
$ kubectl apply -f user-pass-yaml.yaml

.type 필드 값의 default 값은 Opaque이다.

  • Opaque: 키-값 형식으로 임의의 데이터를 설정
  • kubernetes.io/service-account-token: 쿠버네티스 인증 토큰 저장
  • kubernetes.io/dockerconfigjson: 도커 저장소 인증 정보를 저장
  • kubernetes.io/tls: tls 인증서 저장

※ 시크릿 설정 주의 사항

필드에 들어가는 값, 파일 명등은 base64 문자 인코딩 값을 설정해야한다.

$ echo -n "username" | base64
dXNlcm5hbWUK

 

- Secret 사용하기

시크릿을 파드의 환경 변수로 설정해 사용하는 예

apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    spec:
      containers:
      - name: test
        env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: user-pass-yaml
              key: username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: user-pass-yaml
              key: password

 

- Secret으로 TLS 인증서를 저장해 사용하기

# 프라이빗 인증서 발급
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=example.com"

# tls 시크릿 생성
$ kubectl create secret tls tlssecret --key tls.key --cert tls.crt

# tls 시크릿 내용 확인
$ kubectl get secret tlssecret -o yaml

 

- Docker registry 시크릿 만들기

$ kubectl create secret docker-registry reg-secret --docker-username= minsun \
--docker-password=pass --docker-email=minsun@abc.com

- Secret 데이터 용량 제한

시크릿 데이터는 etcd에 암호화되지 않은 텍스트로 저장된다. 이때 시크릿 데이터의 용량이 너무 크면 쿠버네티스 시스템의 메모리 용량을 너무 많이 차지하게 된다. 따라서 개별 시크릿 데이터의 최대 용량은 1MB이다.

Comments