-
[따배쿠] 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 게이트웨이 역할을 합니다.
- 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
'kubernetes' 카테고리의 다른 글
[따배쿠] Controller - Replicaset (0) 2024.12.04 [따배쿠] Controller - ReplicationController란? (1) 2024.12.04 [따배쿠] Pod - Pod에 Resource 할당하기 (CPU/memory requests, limits) (0) 2024.12.03 [따배쿠] Pod - static Pod(feat. kubelet daemon) (0) 2024.12.02 따배쿠 학습 용도 (0) 2024.12.01