kubernetes

[따배쿠] Pod - Pod 환경변수 설정과 실행 패턴

bbiyak2da 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