[따배쿠] ConfigMap
ConfigMap
미리 ConfigMap에 구성정보를 정의해놓았다가,
컨테이너마다 해당 구성정보가 필요할 경우 사용
실습
# Configmap 생성
root@master:~/Getting-Start-Kubernetes/10# kubectl create configmap ttabae-config --from-literal=INTERVAL=2 --from-literal=OPTION=boy --from-file=config.dir/
configmap/ttabae-config created
# 확인
root@master:~/Getting-Start-Kubernetes/10# kubectl get configmaps ttabae-config
NAME DATA AGE
ttabae-config 3 12s
root@master:~/Getting-Start-Kubernetes/10# kubectl describe configmaps ttabae-config
Name: ttabae-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
IMTERVAL:
----
2
OPTION:
----
boy
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;
}
}
BinaryData
====
Events: <none>
실습2 (ConfigMap의 일부분을 적용하기)
생성한 ConfigMap의 key를 pod의 컨테이너에 적용해보자
[Dockerfile 파일 생성]
root@master:~/Getting-Start-Kubernetes/10/build# cat 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"]
제공된 Dockerfile은 Ubuntu 18.04를 기반으로 하는 Docker 이미지를 생성하는 과정을 보여줍니다.
각 줄의 의미는 다음과 같습니다
- FROM ubuntu:18.04: 이 줄은 Docker 이미지의 기본 이미지를 Ubuntu 18.04로 설정합니다.
- RUN apt-get update ; apt-get -y install rig boxes: 이 명령은 패키지 목록을 업데이트하고 rig와 boxes라는 두 개의 패키지를 설치합니다. -y 플래그는 설치 중에 발생하는 모든 프롬프트에 자동으로 'yes'로 응답합니다.
- ENV INTERVAL 5: INTERVAL이라는 환경 변수를 값 5로 설정합니다. 이 변수는 컨테이너 내에서 실행되는 모든 프로세스에서 사용할 수 있습니다.
- ENV OPTION stone: OPTION이라는 또 다른 환경 변수를 값 stone으로 설정합니다.
- ADD genid.sh /bin/genid.sh: 빌드 컨텍스트에서 genid.sh라는 스크립트를 컨테이너의 /bin 디렉토리에 추가합니다.
- RUN chmod +x /bin/genid.sh: genid.sh 스크립트의 권한을 변경하여 실행 가능하도록 만듭니다.
- ENTRYPOINT ["/bin/genid.sh"]: 컨테이너가 시작될 때 실행될 기본 명령을 설정합니다. 이 경우, 컨테이너가 시작되면 /bin/genid.sh 스크립트가 실행됩니다.
[genid.sh 파일 생성]
root@master:~/Getting-Start-Kubernetes/10/build# vi genid.sh
#!/bin/bash
mkdir -p /webdata
while true
do
/usr/bin/rig | /usr/bin/boxes -d $OPTION > /webdata/index.html
sleep $INTERVAL
done
이 스크립트는 /webdata 디렉토리를 생성한 후, 무한 루프를 통해 rig 명령의 출력을 boxes 명령에 전달하고, 그 결과를 index.html 파일에 저장합니다. 그런 다음, 5초 동안 대기하고 이 과정을 반복합니다.
각 줄의 의미는 다음과 같습니다
- #!/bin/bash: 이 줄은 스크립트가 Bash 셸에서 실행되어야 함을 나타냅니다.
- mkdir -p /webdata: /webdata라는 디렉토리를 생성합니다. -p 옵션은 디렉토리가 이미 존재하는 경우 오류를 발생시키지 않도록 합니다.
- while true: 무한 루프를 시작합니다. 이 루프는 종료 조건이 없으므로 계속해서 반복됩니다.
- /usr/bin/rig | /usr/bin/boxes -d $OPTION > /webdata/index.html:
- /usr/bin/rig 명령의 출력을 /usr/bin/boxes -d $OPTION 명령의 입력으로 전달합니다.
-d $OPTION에서 $OPTION은 환경 변수로 설정된 값(이 경우 stone)을 사용합니다.
*/usr/bin/rig : 일반적으로 Linux 시스템에서 사용되는 명령어로, 랜덤한 이름을 생성하는 도구
*/usr/bin/boxes : 일반적으로 Linux 시스템에서 사용되는 명령어로 텍스트를 다양한 테두리와 스타일로 감싸는 데 사용됩니다
- 최종적으로 이 명령의 출력을 /webdata/index.html 파일에 저장합니다.
- sleep $INTERVAL: INTERVAL 환경 변수에 설정된 시간(초)만큼 대기합니다. 이 경우, INTERVAL은 5로 설정되어 있으므로 5초 동안 대기합니다.
[genid.yaml 파일 생성]
root@master:~/Getting-Start-Kubernetes/10# vi genid.yaml
apiVersion: v1
kind: Pod
metadata:
name: genid-stone
spec:
containers:
- image: smlinux/genid:env
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: ttabae-config
key: INTERVAL
name: fakeid
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
이 파일은 genid-stone이라는 이름의 Pod를 생성하며, 특정 컨테이너 이미지(smlinux/genid:env)를 사용하고 환경 변수를 설정합니다.
앞서 이미지를 생성할 Dockerfile에는 Interval이 5로 정의되어 있지만, 해당 genid.yaml 파일을 통해 Pod를 배포하게 되면 해당 yaml 파일에 정의된 환경변수가 우선적으로 적용되게 되어, ttabae-config의 configmap 내 Interval 값인 2가 적용되게 된다.
[Pod 생성]
root@master:~/Getting-Start-Kubernetes/10# kubectl apply -f genid.yaml pod/genid-stone configured
[Pod 확인]
root@master:~/Getting-Start-Kubernetes/10# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
genid-stone 2/2 Running 0 3m6s 192.168.104.38 node2 <none> <none>
[Pod 삭제]
root@master:~/Getting-Start-Kubernetes/10# kubectl delete pod --all
pod "genid-stone" deleted
[ConfigMap 수정]
root@master:~/Getting-Start-Kubernetes/10# kubectl edit configmaps ttabae-config
apiVersion: v1
data:
INTERVAL: "10"
OPTION: boy
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;
}
}
kind: ConfigMap
metadata:
creationTimestamp: "2024-12-24T08:06:56Z"
name: ttabae-config
namespace: default
resourceVersion: "416624"
uid: f8634173-3f07-43a7-9fb3-cca624ced9b8
Interval을 10으로 수정했다.
10초마다 생성될 거다.
[Pod 생성]
root@master:~/Getting-Start-Kubernetes/10# kubectl apply -f genid.yaml
pod/genid-stone created
[Pod 확인]
root@master:~/Getting-Start-Kubernetes/10# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
genid-stone 2/2 Running 0 23s 192.168.104.39 node2 <none> <none>
root@master:~/Getting-Start-Kubernetes/10# curl 192.168.104.38
실습3 (ConfigMap의 전체 적용하기)
ConfigMap 일부 적용 방법과 전체 적용 방법의 차이점은
ConfigMap을 전체로 적용할 시, envFrom을 쓴다는 것
[genid-whole.yaml 파일 생성]
root@master:~/Getting-Start-Kubernetes/10# cat genid-whole.yaml
apiVersion: v1
kind: Pod
metadata:
name: genid-boy
spec:
containers:
- image: smlinux/genid:env
envFrom:
- configMapRef:
name: ttabae-config
name: fakeid
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
[Pod 생성]
root@master:~/Getting-Start-Kubernetes/10# kubectl apply -f genid-whole.yaml
pod/genid-boy created
[Pod 확인]
root@master:~/Getting-Start-Kubernetes/10# kubectl get pods
NAME READY STATUS RESTARTS AGE
genid-boy 2/2 Running 0 49s
genid-stone 2/2 Running 0 13m
root@master:~/Getting-Start-Kubernetes/10# kubectl exec genid-boy -- env
Defaulted container "fakeid" out of: fakeid, web-server
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=genid-boy
INTERVAL=10
OPTION=boy
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;
}
}
MAINUI_SVC_PORT_80_TCP=tcp://10.97.156.116:80
MAINUI_SVC_PORT_80_TCP_PORT=80
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MAINUI_SVC_SERVICE_HOST=10.97.156.116
MAINUI_SVC_SERVICE_PORT=80
MAINUI_SVC_PORT=tcp://10.97.156.116:80
MAINUI_SVC_PORT_80_TCP_PROTO=tcp
MAINUI_SVC_PORT_80_TCP_ADDR=10.97.156.116
KUBERNETES_SERVICE_HOST=10.96.0.1
HOME=/root
kubectl exec 명령어는 Kubernetes 클러스터 내의 실행중인 특정 Pod에서 명령을 실행하는 데 사용됩니다.
즉 해당 명령어는 genid-boy라는 Pod에서 환경 변수를 출력하는 명령입니다.
전체 configmap을 적용했으므로, 해당 Pod의 환경변수 또한 변경된 것을 확인할 수 있다.
실습4 (ConfigMap을 볼륨으로 적용하기)
Configmap의 구성 파일을 미리 만들어놨다가
실행할 컨테이너에 전달 가능
[genid-volume.yaml 파일 생성]
apiVersion: v1
kind: Pod
metadata:
name: genid-volume
spec:
containers:
- image: smlinux/genid:env
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: ttabae-config
key: INTERVAL
name: fakeid-generator
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
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: ttabae-config
items:
- key: nginx-config.conf
path: nginx-config.conf
[Pod 생성]
root@master:~/Getting-Start-Kubernetes/10# kubectl create -f genid-volume.yaml
pod/genid-volume created
[Pod 확인]
root@master:~/Getting-Start-Kubernetes/10# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
genid-volume 2/2 Running 0 53s 192.168.166.183 node1 <none> <none>
[Container 접속 후, config 확인]
root@master:~/Getting-Start-Kubernetes/10# kubectl exec -it genid-volume -c web-server -- /bin/bash
root@genid-volume:/# cd /etc/nginx/conf.d/
root@genid-volume:/etc/nginx/conf.d# ls
nginx-config.conf
root@genid-volume:/etc/nginx/conf.d# cat 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;
}
}
root@genid-volume:/etc/nginx/conf.d# ls -l
total 0
lrwxrwxrwx 1 root root 24 Dec 24 08:36 nginx-config.conf -> ..data/nginx-config.conf
[참고 영상]
[따배쿠] 10. Kubernetes ConfigMap