ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Pod - Pod 환경변수 설정과 실행 패턴
    kubernetes 2024. 12. 3. 14:07

    환경변수

    • Pod 내의 컨테이너가 실행될 때 필요로 하는 변수
    • 컨테이너 제작 시 미리 정의
      • NGINX Dockerfile의 예
      • ENV NGINX_VERSION 1.19.2
      • ENV NUS_VERSION 0.4.3
    • Pod 실행 시, 미리 정의된 컨테이너 환경변수를 변경할 수 있다. 혹은 환경변수를 새롭게 지정할 수도 있다.

     

    예시

     

    # pod-nginx-env.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/5# cat pod-nginx-env.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod-env
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        ports:
        - containerPort: 80
          protocol: TCP
        env:
        - name: MYVAR
          value: "testvalue"

     

    nginx 컨테이너를 생성할 때, env에 정의된 환경변수 값을 할당

     

     # 생성 및 bash 쉘로 접속

    root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-env.yaml
    pod/nginx-pod-env created
    root@master:~/Getting-Start-Kubernetes/5# kubectl exec nginx-pod-env -it -- /bin/bash

     

    # 환경변수 확인

    root@nginx-pod-env:/# env
    MYDB_SERVICE_PORT=80
    MYSERVICE_PORT_80_TCP_PROTO=tcp
    MYSERVICE_SERVICE_HOST=10.109.39.200
    HOSTNAME=nginx-pod-env
    MYSERVICE_SERVICE_PORT=80
    NJS_VERSION=1.14.2.0.2.6-1~stretch
    MYDB_PORT=tcp://10.96.75.40:80
    NGINX_VERSION=1.14.2-1~stretch
    KUBERNETES_PORT_443_TCP_PROTO=tcp
    KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
    MYDB_SERVICE_HOST=10.96.75.40
    MYSERVICE_PORT_80_TCP=tcp://10.109.39.200:80
    MYVAR=testvalue
    KUBERNETES_PORT=tcp://10.96.0.1:443
    PWD=/
    HOME=/root
    KUBERNETES_SERVICE_PORT_HTTPS=443
    MYDB_PORT_80_TCP_PORT=80
    KUBERNETES_PORT_443_TCP_PORT=443
    MYSERVICE_PORT_80_TCP_PORT=80
    MYSERVICE_PORT=tcp://10.109.39.200:80
    KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
    TERM=xterm
    MYSERVICE_PORT_80_TCP_ADDR=10.109.39.200
    SHLVL=1
    KUBERNETES_SERVICE_PORT=443
    MYDB_PORT_80_TCP_PROTO=tcp
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    KUBERNETES_SERVICE_HOST=10.96.0.1
    MYDB_PORT_80_TCP=tcp://10.96.75.40:80
    MYDB_PORT_80_TCP_ADDR=10.96.75.40
    _=/usr/bin/env

     

    Pod 구성 패턴의 종류

     

    • Kubernetes에서 멀티 컨테이너 포드(Multi-Container Pod)는 여러 개의 컨테이너가 하나의 포드 내에서 함께 실행되는 구조입니다. 이러한 구조의 주요 종류는 다음과 같습니다.
      • Sidecar Pattern
        주 애플리케이션과 함께 보조적인 기능을 제공하는 컨테이너입니다. 예를 들어, 로그 수집기나 프록시 서버가 이에 해당합니다.
      • Adapter Pattern
        기존 애플리케이션의 인터페이스를 변환하여 다른 시스템과의 호환성을 제공하는 컨테이너입니다. 데이터 포맷을 변환하는 작업을 수행합니다.
      • Ambassador Pattern
        외부 서비스와의 통신을 담당하는 컨테이너입니다. 주로 서비스의 외부 접근을 관리하고, API 게이트웨이 역할을 합니다.

     

    퀴즈

     

    문제1, 문제2를 풀어봅시당

     

    문제1

    • Create a Static pod on node01 called mydb with image redis
    • Create this pod on node01 and make sure that it is recreated/restarted automatically in case of failure
      • Use /etc/kubernetes/manifests as the Static Pod path for example
      • Kubelet Configured for Static Pods
      • Pod mydb-node01 is Up and running

     

    [정답]

     

    # master에서 node1으로 접속

    root@master:~/Getting-Start-Kubernetes/5# ssh node1

     

    # static pod path로 이동

    root@node1:~# cd /etc/kubernetes/manifests

     

    # 해당 디렉터리에서 yaml파일 작성

    apiVersion: v1
    kind: Pod
    metadata:
      name: mydb
    spec:
      containers:
      - image: redis
        name: redis

     

    # master에서 pod 상태 확인

    root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -o wide
    NAME         READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES
    mydb-node1   1/1     Running   0          15s   192.168.166.161   node1   <none>           <none>

     

     mydb라는 pod가 running 상태인지, node01에 올라와있는지 확인

     

    문제2

    • 다음 조건에 맞는 Pod를 생성하시오
      • Pod name : myweb, image : nginx:1.14
      • CPU 200m, Memory 500mi를 요구하고 / CPU 1core, Memory 1Gi 제한
      • Application 동작에 필요한 환경변수 DB=mydb를 포함
      • namespace product에서 동작

     

    [정답]

     

    # namespace 생성

    root@master:~/Getting-Start-Kubernetes/5# kubectl create namespace product
    namespace/product created

     

    # pod-nginx.yaml 파일 생성

    root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: myweb
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        ports:
        - containerPort: 80
          protocol: TCP
        env:
        - name: DB
          value: "mydb"
        resources:
          requests:
            memory: 500Mi
            cpu: 200m
          limits:
            memory: 1Gi
            cpu: 1

     

    조건에 따라 이미지, 환경변수, 리소스 할당량을 작성해준다.

     

    # namespace product에 pod 생성

    root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx.yaml -n product
    pod/myweb created

     

    # 확인

    root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -n product -o wide
    NAME    READY   STATUS    RESTARTS   AGE     IP                NODE    NOMINATED NODE   READINESS GATES
    myweb   1/1     Running   0          6m35s   192.168.166.162   node1   <none>           <none>

     

    번외)

     

    namespace를 지정해주지 않고, kubectl get pods -o wide 명령어를 실행하면

    namespace가 default인 값의 pod가 조회된다는 것을 기억 !!

     

    root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -o wide
    NAME         READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES
    mydb-node1   1/1     Running   0          24m   192.168.166.161   node1   <none>           <none>
    root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -n default -o wide
    NAME         READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES
    mydb-node1   1/1     Running   0          25m   192.168.166.161   node1   <none>           <none>

     

    따라서 다른 namespace를 갖고 있는 pod를 조회하려면, 꼭 namespace를 지정해주자

     


    참고 영상

     

    https://www.youtube.com/watch?v=Uc-VnK19T7w&t=26s

     

     

     

Designed by Tistory.