ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] ConfigMap
    kubernetes 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
Designed by Tistory.