-
[따배쿠] ConfigMapkubernetes 2024. 12. 24. 16:07
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
'kubernetes' 카테고리의 다른 글
[따배쿠] 인증과 권한 관리 - 권한관리편 (0) 2024.12.29 [따배쿠] Secret (1) 2024.12.25 [따배쿠] Label을 이용한 Canary Deployment (0) 2024.12.10 [따배쿠] Annotation (0) 2024.12.10 [따배쿠] Node Label (0) 2024.12.10