본문 바로가기
Kubernetes

ConfigMap (환경변수)

by Nirah 2023. 1. 4.

 

https://kubernetes.io/ko/docs/concepts/configuration/configmap/

 

컨피그맵(ConfigMap)

컨피그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트이다. 파드는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그맵을 사용할 수 있다. 컨피그맵

kubernetes.io

 

ConfigMap

서비스의 설정정보, 구성파일, 포트 등 고유한 정보들을 파드에서 참조하게 하는 파일을 만들어 파드들을 직접 컨트롤 할 수 있게하는 API 오브젝트이다 . 

간단히 말해 파드가 생성될때 기본값을 변경하는것이다. 

 

기본적으로 pod를 생산하게 되면 매번 yaml 파일에 많은 환경변수를 입력해야한다.

개발환경, 테스트환경, 서비스 환경에 맞춘 환경변수들(env) 말이다.

각 환경마다 Configmap 틀을 어느정도 마련해두면 pod를 생산할때 yaml 파일의 크기가 작아질것이다. 

 

 

Configmap 구성

컨피그맵을 사용하여 파드 내부에 컨테이너를 구성할 수 있는 네 가지 방법이 있다.

  1. 컨테이너 커맨드와 인수 내에서
  2. 컨테이너에 대한 환경 변수
  3. 애플리케이션이 읽을 수 있도록 읽기 전용 볼륨에 파일 추가
  4. 쿠버네티스 API를 사용하여 컨피그맵을 읽는 파드 내에서 실행할 코드 작성

이러한 방법들은 소비되는 데이터를 모델링하는 방식에 따라 다르게 쓰인다. 처음 세 가지 방법의 경우,

kubelet은 파드의 컨테이너를 시작할 때 컨피그맵의 데이터를 사용한다.

네 번째 방법은 컨피그맵과 데이터를 읽기 위해 코드를 작성해야 한다는 것을 의미한다. 

 

 

주의사항

  1. 컨피그맵은 보안 또는 암호화를 제공하지 않는다. 저장하려는 데이터가 기밀인 경우,

컨피그맵 대신 시크릿(Secret) 또는 추가(써드파티) 도구를 사용하여 데이터를 비공개로 유지하자.

  2.컨피그맵에 저장된 데이터는 1MiB를 초과할 수 없다. 이 제한보다 큰 설정을 저장해야 하는 경우,

볼륨을 마운트하는 것을 고려하거나 별도의 데이터베이스 또는 파일 서비스를 사용할 수 있다.

 

 

 

컨피그맵 예시

 

redis라는 이미지에 대해 컨피그맵으로 환경변수를 넣어서 실행해보겠다.

 

빈 껍대기인 base configmap을 만들자.

cat <<EOF >./example-redis-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
 name: example-redis-config
data:
 redis-config: "" # null
EOF

 

 

위 base configmap을 컨피그맵으로 지정하여 redis를 실행하는 yaml파일 작성

볼륨 마운트도 시도해본다.

cat<<EOF > redis-pod.yaml

apiVersion: v1
kind: Pod
metadata:
 name: redis
spec:
 containers:
 - name: redis
   image: redis:5.0.4
   command:
     - redis-server
     - "/redis-master/redis.conf"
   env:
   - name: MASTER
     value: "true"
   ports:
   - containerPort: 6379
   resources:
     limits:
       cpu: "0.1"
   volumeMounts: # data라는 볼륨을 mountPath 위치에 mount 
   - mountPath: /redis-master-data
     name: data
   - mountPath: /redis-master
     name: config
 volumes:
   - name: data
     emptyDir: {} # 컨테이너들끼리 데이터를 공유하기 위해서 볼륨을 사용
   - name: config
     configMap:
       name: example-redis-config
       items:
       - key: redis-config
         path: redis.conf
EOF

k create -f example-redis-config.yaml

k create -f redis-pod.yaml

 

컨피그맵을 뜻하는 명령어는 cm이다.

k get cm

 

다음과 같이 아직 빈 껍대기 컨피그맵이라 아직 아무설정도 안들어가있다.

k describe configmap example-redis-config

 

컨테이너에 들어가서 원래 디폴트의 환경 변수를 좀더 확인해두자.

k exec redis -it -- redis-cli

다음과 같이 maxmemory를 확인하면 0이다.

mexmemory-policy 는 noeviction 으로 돼있다.

exit

 

 

이제 빈 껍대기 컨피그맵이 아닌 환경변수를 추가한 컨피그맵으로 교체한 뒤 어떻게 바뀌는지 관찰한다.

maxmemory와 mexmemory-policy에 대한 env를 지정하는 내용이 추가됐다.

 

k delete configmap example-redis-config

 

cat << EOF > example-redis-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
 name: example-redis-config
data:
 redis-config: |
   maxmemory 2mb
   maxmemory-policy allkeys-lru    
EOF

 

k create -f example-redis-config.yaml

 

k exec redis -it -- redis-cli

이제 컨피그맵대로 환경변수가 바뀌었을까? 아니다. 아직 환경변수 값이 안바뀌었다.

파드 생성될 때 설정되는거라 파드를 지웠다 다시 만들어야 적용이 되기때문이다.

 

k delete pod redis

k create -f redis-pod.yaml

 

k exec redis -it -- redis-cli

파드를 재생성할 때 컨피그맵이 적용되면서 원하는 환경변수를 갖고 시작하는 컨테이너가 되었다.

maxmemory는 2097152 (2mb)

mexmemory-policy는 allkeys-lru 로 바뀐 것을 확인할 수 있다.

 

 

 

 

환경변수를 이용한 mysql 자동로그인

환경변수를 커스텀으로 설정하기 위해서 컨피그맵을 위처럼 따로 다른 yaml파일로 뺄 수도 있지만

그냥 컨테이너를 실행하는 yaml파일 자체에 모든 환경변수를 지정해서 실행할 수도 있다.

이를 응용해서 mysql의 환경변수에 비밀번호를 넣어 귀찮게 매번 안쳐도 되게하겠다.

그런 김에 kubernetes라는 이름의 database를 구성하는 내용도 환경변수에 추가해준다.

 

mkdir -p configmap/1

cd configmap/1

cat << EOF > dep-configmap.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mariadb:10.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: dkagh1.
        - name: MYSQL_DATABASE
          value: kubernetes
        ports:
        - name: http
          containerPort: 3306
          protocol: TCP
EOF

k apply -f dep-configmap.yaml

 

위 yaml에 env로 지정해준 mysql 비밀번호 값이 자동으로 컨테이너의 환경변수로 들어가있다.

k exec mysql-78bb947d54-gmp89 -it -- /bin/bash

 

mysql -uroot -p

이렇게만 쳐도 자동으로 env에서 설정한 비밀번호가 적용되어 로그인이 된다.

show databases;

env에 추가로 설정했던 kubernetes라는 이름의 db도 만들어져있는 채로 출력 된다.

 

이러한 환경변수가 잘 적용돼있나 확인하는건 사실 이렇게 일일이 테스트해볼 필요는 없고

env 라는 명령어로 확인 가능하다.

설정한 mysql 비밀번호가 들어가 있고, kubernetes라는 이름의 데이터베이스가 지정돼있는 모습이 보인다.

 

'Kubernetes' 카테고리의 다른 글

ingress  (0) 2023.01.04
secret  (0) 2023.01.04
워크로드  (0) 2023.01.03
Networkpolicy  (0) 2023.01.02
쿠버네티스 논리연산자  (0) 2023.01.02