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 게이트웨이 역할을 합니다.
- Sidecar Pattern
퀴즈
문제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