kok202
쿠버네티스 입문 - 06 - 컨피그맵, 시크릿

2020. 4. 4. 22:15[정리] 기능별 개념 정리/Kubernetes

컨피그맵

컨테이너에 필요한 환경설정을 분리해서 저장할 수 있다.

클라우드 네이티브 아키텍쳐에서 컨테이너는 템플릿에 맞춰 변하지 않는 자원이여야한다.

그런데 개발용과 프로덕션용 서비스를 다르게 설정해야하는 경우가 생긴다. (ex. DB 설정, 로그 출력 레벨...)

이럴때 컨피그맵을 사용한다.

 

 

 

컨피그맵 샘플

configmap-dev.yml

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

configmap-prod.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-prod
  namespace: default
data:
  DB_URL: prodhost
  DB_USER: produser
  DB_PASS: produser
  DEBUG_INFO: production

 

 

 

시크릿

시크릿은 컨피그맵으로 저장하기에는 민감한 정보를 저장하는 용도다. (ex. 비밀번호, OAuth 토큰, SSH 키)

시크릿은 내장 시크릿과 사용자 정의 시크릿이 있다.

내장 시크릿은 쿠버네티스 클러스터 안에서 쿠버네티스 API 에 접근할 때 사용한다.

시크릿은 명령어로도 만들 수 있는데 이때 필드 값으로 들어가는 값은 base64인코딩 되서 들어간다.

kubectl create secret generic mySecret --from-literal=username=kok202 --from-literal=password=123456

시크릿의 타입은 다음과 같은 것들이 있다.

  • Opaque : key - value 데이터
  • kubernetes.io/service-account-token : 쿠버네티스 인증 토큰을 저장한다.
  • kubernetes.io/dockerconfigjson : 도커 저장소 인증 정보를 저장한다.
  • kubernetes.io/tls : tls 인증서를 저장한다.

시크릿의 최대 용량은 1MB이다.

시크릿은 etcd 에 암호화되지 않은 텍스트로 저장된다.

만약 중요한 서비스에서 쿠버네티스를 사용중이라면 etcd 를 관리해야한다.

  • etcd 은 기본적으로 인증서 있는 사용자만 접근할 수 있다. (kube-apiserver 는 tls 인증이 되어있다.)
  • etcd 가 실행중인 마스터에 들어가서 데이터를 접근할 수도 있는데, 따라서 접근 가능한 사용자, IP 를 화이트 리스트로 관리해야한다.
  • 혹은 쿠버네티스 클러스터를 직접 설치하는 경우 별도로 암호화하는 옵션을 사용해야한다.

 

 

 

시크릿 샘플

apiVersion: v1
kind: Secret
metadata:
  name: mySecret
type: Opaque
data:
  username: a29rMjAy
  password: MTIzNDU2

.type : 시크릿의 타입

 

 

 

컨피그맵과 시크릿의 사용

apiVersion: apps/v1
kind: Deployment
metadata:
  name: configapp
  labels:
    app: configapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configapp
  template:
    metadata:
      labels:
        app: configapp
    spec:
      containers:
      - name: testapp
        image: arisu1000/simple-container-app:latest
        ports:
        - containerPort: 8080
        envFrom:
        - configMapRef:
            name: config-dev
            # name: config-prod

.spec.env[].name : 환경 변수의 이름

.spec.env[].value : 환경 변수의 값

.spec.env[].valueFrom : 환경 변수의 값을 ~에서 불러온다.

.spec.env[].valueFrom.configMapKeyRef : 환경 변수의 값을 컨피그맵에서 불러온다.

.spec.env[].valueFrom.configMapKeyRef.name : 환경 변수의 값을 ~ 이름의 컨피그맵에서 불러온다.

.spec.env[].valueFrom.configMapKeyRef.key : 환경 변수의 값을 ~ 이름의 컨피그맵에서 ~ 키를 가진 값을 불러온다.

.spec.envFrom : ~ 에서 환경변수 전체를 불러온다.

.spec.envFrom.configMapRef : 컨피그 맵에서 환경변수 전체를 불러온다.

.spec.envFrom.configMapRef.name : ~ 이름을 가진 컨피그 맵에서 환경변수 전체를 불러온다.

* 여기서 configMapRef를 secretKeyRef 로 치환하면 컨피그 맵이 아니라 시크릿에서 값을 불러온다는 의미다.

 

 

 

컨피그맵과 시크릿을 볼륨에 마운트 시키기

apiVersion: apps/v1
kind: Deployment
metadata:
  name: configapp
  labels:
    app: configapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configapp
  template:
    metadata:
      labels:
        app: configapp
    spec:
      volumes:
      - name: config-volume
        configMap:
          name: config-dev
      containers:
      - name: testapp
        image: arisu1000/simple-container-app:latest
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config

.spec.volumes[] : 볼륨을 만든다.

.spec.volumes[].configMap : 컨피그맵을 사용하는 볼륨을 만든다.

.spec.volumes[].configMap.name : 어떤 이름을 사용하느 컨피그맵을 사용하는 볼륨을 만든다.

.spec.containers[].volumeMounts[] : 만들어진 볼륨들을 마운트 시킨다.

.spec.containers[].volumeMounts[].mountPath : 만들어진 볼륨들을 어느 경로에 마운트 시킨다.

.spec.containers[].volumeMounts[].readOnly : 마운트된 파일을 읽기 전용으로 사용한다.

 

위의 예시에서는 config-dev 컨피그 맵을 가져와 config-volume 이라는 볼륨을 만들고, 해당 볼륨을 각 파드의 /etc/config 파일로 저장한다는 의미다.

 

 

 

도커 이미지가 프라이빗인 경우 시크릿 사용하기

kubectl create secret docker-registry myDockerSecret --docker-username=kok202 --docker-password=123456 --docker-email=kok202@naver.com --docker-server=https://index.docker.io/v1/

이후 .spec.imagePullSecrets[].name 필드로 myDockerSecret 을 가져다 사용하면된다.