Kubernetes

Kubernetes 기초 - ConfigMap

사실 나도 모름 2023. 12. 23. 00:33
  1. ConfigMap생성
  2. ConfigMap의 일부분을 적용하기
  3. ConfigMap의 전체를 적용하기
  4. ConfigMap을 볼륨으로 적용하기

1. ConfigMap 생성

ConfigMap : 컨테이너 구성 정보를 한 곳에 모아서 통합 관리

 

각 컨테이너는 다양한 구성 정보를 가지고 있다.

컨테이너가 한 두개일 경우에는 관리하는데 큰 문제가 없겠지만 만약 여러 대의 컨테이너를 운영하고 있다면 구성 정보를 변경해야 하는 상황이 발생했을 때 하나씩 모두 변경해야 하니 관리가 곤란해진다.

이런 구성 정보를 컨테이너에 직접 입력해서 부여하는 것이 아니라 한 곳에 모아서 적용시켜 관리를 용이하게 하자는 것이 ConfigMap의 목적이다.

물론 ConfigMap내의 구성 정보를 동적으로 적용하거나 설정을 분리하는 등 다양한 목적이 존재한다.

 

사용법
kubectl create configmap NAME [--from-file=source] [--from-literal=key1=value1]

 

 

Key Value
test.file This is a file.
mydata This is a file.
id b2023002
class bigdata
interval 2
nginx-config.conf server {
    listen 80;
    server_name www.example.com;
    gzip on;
    gzip_types text/plain application/xml;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
}

 

kubectl create configmap CONFIG_NAME --from-literal=id=2023002 --from-literal=class=bigdata

kubectl create configmap CONFIG_NAME --from-file=text.file

kubectl create configmap CONFIG_NAME --from-file=mydata=text.file

kubectl create configmap CONFIG_NAME --from-file=/configmap.dir/

참고
value에 들어가는 값은 총 1MiB를 초과할 수 없다.

 

 

 

실습

우리가 만들 컨피그맵은 다음과 같다.

Key Value
INTERVAL 2
OPTION boy
nginx-config.conf server {
    listen 80;
    server_name http://www.example.com;
    gzip on;
    gzip_types text/plain application/xml;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
}
# config.conf 파일 미리 생성
mkdir ~/config.dir
cd ~/config.dir
cat > nginx-config.conf << EOF
server {
    listen 80;
    server_name www.example.com;
    gzip on;
    gzip_types text/plain application/xml;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
}
EOF

# 컨피그맵 생성
kubectl create configmap tt-config \
--from-literal=INTERVAL=2 --from-literal=OPTION=boy --from-file=config.dir/

# 컨피그맵 상세정보 출력
kubectl describe configmap tt-config

describe

 

 

내용을 수정하고 싶다면 edit 명령으로 동일하게 수정가능하다.

# 컨피그맵 수정
kubectl edit configmap tt-config

기존의 내용 수정 가능

 

 

우리는 CLI로 직접 컨피그맵을 생성했지만 영구적으로 사용하고 싶으면 yaml파일을 생성하여 관리하는 것이 좋다.

컨피그맵 yaml파일도 kubectl apply -f 로 생성이 가능하며 yaml파일을 수정하면 동적으로 값이 변경되어 적용된다.

 

 

 

 


2. ConfigMap의 일부분을 적용하기

# genid.yaml
apiVersion: v1
kind: Pod
metadata:
  name: genid-stone
spec:
  containers:
  - image: smlinux/genid:env
    env:
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: tt-config
          key: INTERVAL
    name: fakeid
    volumeMounts: 
    - name: html
      mountPath: /webdata
  - image: nginx:1.25
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
  volumes:
  - name: html
    emptyDir: {}

 

위 yaml파일의 내용은 다음과 같다.

하나의 파드에 컨테이너가 두 개 실행된다.

html이라는 이름의 공유 디렉토리를 생성하고 각 컨테이너의 /webdata와 /usr/share/nginx/html 디렉토리에 마운트된다.

html디렉토리는 빈 디렉토리로 생성되므로 각 컨테이너가 해당 위치로 이동하더라도 아무런 파일을 볼 수 없다.

nginx컨테이너는 readOnly로 설정되어 html 디렉토리에 파일을 생성하거나 변경할 수 없지만 읽기만 가능하고 fakeid 컨테이너는 html 디렉토리에 파일을 생성하여 nginx컨테이너와 함께 파일을 공유할 수 있게 된다.

fakeid 컨테이너는 앞서 만든 tt-config 컨피그맵을 이용하여 INTERVAL이라는 키의 값을 INTERVAL이라는 이름으로 환경변수를 생성한다.

만약 env이하 내용을 yaml파일에 기재하지 않으면 당연히 컨피그맵의 데이터는 사용되지 않으며 자신 컨테이너의 기본값만 사용하게 된다.

 

 

genid라는 이미지가 무엇인지 알아보자.

내부에는 환경변수와 유저데이터가 들어있는 도커 파일과 genid.sh이라는 셸 스크립트 파일이 있다.

# genid.sh
mkdir -p /webdata
while true
do
  /usr/bin/rig | /usr/bin/boxes -d $OPTION > /webdata/index.html
  sleep $INTERVAL
done

 

 

셸 스크립트 파일의 내용은 간단하다. rig라는 패키지는 fakeID를 생성해주는데 이를 boxes라는 패키지를 통해 특수문자로 구현한 모양틀에 넣어서 index.html파일에 입력하는 동작을 한다.

이를 INTERVAL만큼 쉬었다가 새로운 값으로 변경하도록 만드는 스크립트다.

rig와 boxes를 사용한 모양

 

 

위와 같은 모양이 된다.

저 결과를 index.html에 입력하겠다는 의미다.

rig와 boxes는 별도로 apt-get을 통해 설치를 해줘야 하는 패키지다.

그래서 도커 파일 내에 이를 위한 유저 데이터로 apt-get install 명령이 들어간다.

# Dockerfile
FROM ubuntu:18.04
RUN apt-get update ; apt-get -y install rig boxes
ENV INTERVAL 5
ENV OPTION stone
ADD genid.sh /bin/genid.sh
RUN chmod +x /bin/genid.sh
ENTRYPOINT ["/bin/genid.sh"]

 

 

위 yaml파일을 실행하면 기존의 INTERVAL이 5로 설정되어 있던게 2로 대체되며 새로운 스톤모양의 fakeid를 생성하는 주기가 2초로 변경된다.

만약 여러 컨테이너가 컨피그맵의 INTERVAL을 참조하고 있다면 참조한 모든 컨테이너의 INTERVAL 모두 2로 변경될 것이지만 현재는 컨테이너 하나만 참조 중이기 때문에 하나만 변경되었다.

만약 컨피그맵의 값을 변경하여 다른 값을 적용하고 싶다면 컨피그맵의 내용을 변경 후 컨테이너를 재시작해야 한다.

kubectl edit 명령으로 ITNERVAL내용을 10으로 변경한 후 컨테이너를 재시작하면 컨테이너의 INTERVAL 값이  10초로 변경될 것이다.

 

 

 

 


3. ConfigMap의 전체를 적용하기

# genid-whole.yaml
apiVersion: v1
kind: Pod
metadata:
  name: genid-stone
spec:
  containers:
  - image: smlinux/genid:env
#    env:
#    - name: INTERVAL
#      valueFrom:
#        configMapKeyRef:
#          name: tt-config
#          key: INTERVAL
    envFrom:
    - configMapRef:
        name: tt-config
    name: fakeid
    volumeMounts: 
    - name: html
      mountPath: /webdata
  - image: nginx:1.25
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
  volumes:
  - name: html
    emptyDir: {}

 

 

주석처리되어 있는 내용과 함께 비교해보면 차이를 쉽게 알 수 있을 것이다.

기존에 env라고 썼던 부분이 envFrom이 되었고 configMapKeyRef가 configMapRef로 바뀌었다.

일부가 아니라 컨피그맵의 전체를 사용하는 것이니 컨피그맵의 이름만 기재해주면 된다.

(이름 필드를 입력하는 부분에 띄어쓰기 두 칸이 더 들어가는 것을 주의)

 

 

현재 적용된 환경변수

# genid-boy 컨테이너에 적용된 환경변수
kubectl exec genid-boy -- env

적용된 환경변수

 

 

기존의 환경변수에는 OPTION 키에는 stone이라는 값이 들어갔었는데 이번에는 boy라는 값이 들어갔다.

또한 nginx-config.conf 까지 적용이 되었다.

curl 명령을 통해 확인하면 다음과 같이 나온다.

curl 출력 결과

 

 

 

 


4. ConfigMap을 볼륨으로 적용하기

특정 디렉토리로 볼륨 마운트시킬 수도 있다.

대신 그럴 경우 파일의 이름이 키가 되고 파일의 내용이 값이 되어 적용된다.

# genid-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: genid-stone
spec:
  containers:
  - image: smlinux/genid:env
    name: fakeid
    volumeMounts: 
    - name: html
      mountPath: /webdata
  - image: nginx:1.25
    name: web-server
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    - name: config
      mountPath: /etc/nginx/conf.d
      readOnly: true
  volumes:
  - name: html
    emptyDir: {}
  - name: config
    configMap:
      name: tt-config
      items:
      - key: nginx-config.conf
        path: default.conf

 

 

위 yaml코드를 해석하면 다음과 같다.

config라는 이름의 공유 디렉토리를 생성하고 web-server 컨테이너의 /etc/nginx/conf.d/ 디렉토리에 마운트한다.

해당 디렉토리는 읽기 전용이며 디렉토리 내부에 컨피그맵의 nginx-config.conf 키의 값을 default.conf라는 이름의 파일의 내용으로 저장한다.

 

 

위 yaml코드를 실행하면 에러가 날 것이다.

여러 번 시도끝에 발견한 사실은 컨피그맵에 있는 nginx-config.conf의 값의 형식문제였다.

nginx컨테이너가 /n와 같은 이스케이프 문자를 이해하지 못한다.

그로 인해 대략 이런 에러가 난다.

 

 

컨피그맵을 수정하여 다음과 같이 바꾼다.

컨피그맵 내용 수정

 

 

yaml파일로 생성하나 CLI로 생성하나 컨피그맵이 우리가 입력한대로 값을 집어넣지는 않는 모양이다.

줄바꿈이나 탭 같은 입력은 이스케이프 문자를 사용해서 컨피그맵의 값을 저장하니 주의하자.

curl 출력 결과

 

 

어찌 되었든 결과는 이제 정상적으로 나온다.

우리가 적용한 컨피그맵이 실제 컨테이너에 잘 적용되었는지 확인해보자.

# 컨테이너 접속해서 컨피그맵 적용 확인
kubectl exec -it genid-volume -c web-server -- bash
cat /etc/nginx/conf.d/default.conf

적용 잘 됨
실제로 컨피그맵으로 인해 생성된 파일

 

 

실제로 컨피그맵에 의해 생성된 파일이기에 심볼릭 링크가 생성되어 적용된 것을 볼 수 있다.

이런 형태로 컨피그맵은 볼륨 마운트로도 지원해준다.

 

 


 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

멀티 마스터 쿠버네티스 클러스터 구성 방법  (0) 2023.12.31
Kubernetes 기초 - Secret  (0) 2023.12.23
Kubernetes 기초 - Label(4)  (0) 2023.12.22
Kubernetes 기초 - Label(3)  (0) 2023.12.22
Kubernetes 기초 - Label(2)  (0) 2023.12.21