https://kubernetes.io/ko/docs/concepts/configuration/configmap/
ConfigMap
서비스의 설정정보, 구성파일, 포트 등 고유한 정보들을 파드에서 참조하게 하는 파일을 만들어 파드들을 직접 컨트롤 할 수 있게하는 API 오브젝트이다 .
간단히 말해 파드가 생성될때 기본값을 변경하는것이다.
기본적으로 pod를 생산하게 되면 매번 yaml 파일에 많은 환경변수를 입력해야한다.
개발환경, 테스트환경, 서비스 환경에 맞춘 환경변수들(env) 말이다.
각 환경마다 Configmap 틀을 어느정도 마련해두면 pod를 생산할때 yaml 파일의 크기가 작아질것이다.
Configmap 구성
컨피그맵을 사용하여 파드 내부에 컨테이너를 구성할 수 있는 네 가지 방법이 있다.
- 컨테이너 커맨드와 인수 내에서
- 컨테이너에 대한 환경 변수
- 애플리케이션이 읽을 수 있도록 읽기 전용 볼륨에 파일 추가
- 쿠버네티스 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 |