본문 바로가기

Kubernetes

쿠버네티스 컨피그 API

쿠버네티스에는 컨테이너에 대해 설정 파일, 패스워드 같은 기밀 정보 등을 추가할 수 있다.

 

컨테이너의 설정 내용은 환경 변수나 파일이 저장되어 있는 영역을 마운트 하여 전달하는 것이 일반적이다.

 

정적 설정으로 컨테이너의 환경 변수 전달

apiVersion: v1
kind: Pod
metadata:
  name: sample-env
  labels:
    app: sample-app
spec:
containers:
  - image:  nginx:1.16
    name:  my-name
    env:
    - name:  MAX_CONNECTION
      value:  100

 

더보기

# 생성된 파드의 컨테이너 내의 환경 변수 MAX_CONNECTION을 출력하면 해당 값이 출력된다
$ kubectl exec -it sample-env -- env | grep MAX_CONNECTION

MAX_CONNECTION = 100

 

시크릿

쿠버네티스에서 MySQL 데이터베이스의 사용자명이나 패스워드 등의 기밀 정보를 전달하고 싶을 때 암호화된 방식을 전달하기 하는 것이 바로 시크릿 리소스이다. 시크릿의 데이터는 키 밸류 값으로 저장이 된다.

 

시크릿 리소스 타입 목록

종류 개요
Opaque 일반적인 범용 용도
kubernetes.io/tls TLS 인증서용
kubernetes.io/basic-auth 기본 인증용
kubernetes.io/dockerconfigjson 도커 레지스트리 인증 정보용
kubernetes.io/ssh-auth SSH 인증 정보용
kubernetes.io/service-account-token
서비스 어카운트 토큰용
bootstrap.kubernetes.io/token Bootstrap 토큰용

일반 사용자명과 패스워드 같은 인증 정보 등은 스키마 리스(Schemaless)로 정의 가능한 Opaque 타입을 사용한다.

 

apiVersion: v1
kind: Secret
metadata:
  name:  sample-db-auth
type: Opaque
data:
   username: cm9vdA==
   password: cm9vdHBhc3N3b3Jk

YAML 파일로 저장할 때 data값에는 base64로 인코딩 된 데이터를 넣어줘야 한다. stringData 필드를 사용하면 일반 텍스트로 작성할 수도 있다.

 

apiVersion: v1
kind: Secret
metadata:
  name:  sample-db-auth
type: Opaque
StringData:
  username: root
  password: rootpassword

 

생성된 시크릿을 컨테이너에서 사용할 경우 크게 환경 변수로의 전달과 볼륨으로 마운트 하는 방식을 사용된다.

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-single-env
spec:
  containers:
    - image: nginx:1.16
      name: secret-container
      env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: sample-db-auth
              key : username

---

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-multi-env
spec:
  containers:
    - image: nginx:1.16
      name: secret-container2
      envFrom:
      - secretRef:
        name: sample-db-auth

 

환경변수로 전달될 경우 sample-secret-single-env 파드는 sample-db-auth 시크릿에서 key값이 username인 value 값을 DB_USERNAME으로 받고 sample-secret-multi-env 파드는 시크릿 안에서 정의된 데이터 그대로 컨테이너에서 사용할 수 있다.

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-single-volume
spec:
  containers:
    - image: nginx:1.16
      name: secret-container
      volumeMounts:
        - name: config-volume
          mountPath: /config
  volumes:
    - name: config-volume
      secret:
        secretName: sample-db-auth
        items:
        - key: username
          path: username.txt
---
apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-multi-volume
spec:
  containers:
    - image: nginx:1.16
      name: secret-container2
      volumeMounts:
        - name: config-volume
          mountPath: /config
  volumes:
    - name: config-volume
      secret:
        secretName: sample-db-auth

 

볼륨으로 마운트 해서 시크릿 키를 가져올 때는 volumeMounts로 마운트 되는 path를 지정하고 volume를 생성해 sample-db-auth의 key 값이 username인 value를 username.txt로 생성한다. sample-secret-multi-volume에서는 path에 key의 이름으로 된 파일이 생성된다.

 

컨피그맵

 

컨피그맵은 서정 정보 등을 키-밸류 값으로 저장할 수 있는 데이터 저장 리소스이다. key-value 형식 외에도 nginx.conf나 httpd.conf 같은 설정 파일 자체도 저장할 수 있다.

 

컨피그맵 생성이나 컨테이너 사용법은 시크릿과 비슷하며 문법적인 차이점만 존재한다.

 

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-configmap
  labels:
    app: my-configmap
data:
  thread: "16"
  conneciton.max: "100"
  connection.min: "10"

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-single-env
spec:
  containers:
  - image: nginx:1.16
    name: configmap-container
    env:
      - name:  CONNECTION_MAX
        valueFrom:
          configMapKeyRef:
            name: sample-configmap
            key: connection.max

---
apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-multi-env
spec:
  containers:
  - image: nginx:1.16
    name: configmap-container2
    envFrom:
    - configMapRef:
        name: sample-configmap

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-single-volume
spec:
  containers:
  - image: nginx:1.16
    name: configmap-container
    volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
  - name: config-volume
    configMap:
      name: sample-configmap
      items:
      - key: nginx.conf
        path: nginx-sample.conf

---
apiVersion: v1
kind: Pod
metadata:
  name: sample-configmap-multi-volume
spec:
  containers:
  - image: nginx:1.16
    name: configmap-container2
    volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
  - name: config-volume
    configMap:
      name: sample-configmap