[k8s] Pod 환경 변수 설정 및 Pod간 통신 구현
Pod에 대해 기본적으로 이해하고
Pod 간의 통신에 대해 실습을 진행해보았다.
Pod_실습.pdf
drive.google.com
환경변수 불러오기 : 절차
1) Pod YAML파일에 컨테이너에서 사용할 환경변수 선언
> 나만의 환경변수
> 내가 정의한 환경변수로 새로운 값 정의
> Pod의 metadata, spec, status 정보를 환경변수 값으로 정의
2) Pod 실행 후 컨테이너에 접속해 선언한 환경변수 설정 여부 확인
> 컨테이너에 설정된 환경변수 출력
환경변수 불러오기(1) : yaml 선언
- 요구사항
# Pod API 버전: v1
# Pod 이름: hello-app
# Pod 네임스페이스: default
# 컨테이너 이름/포트: hello-app(8080)
# 도커 이미지: yoonjeong/hello-app:1.0
# 환경변수:
# -- POD_NAME(metadata.name), POD_IP(status.podIP)
# -- NAMESPACE_NAME(metadata.namespace)
# -- NODE_NAME(spec.nodeName), NODE_IP(status.hostIP)
# -- STUDENT_NAME(본인이름), GREETING(STUDENT_NAME을 참조한 인사)
- 제시 코드
resources:
limits:
memory: "128Mi"
cpu: "100m"
> 요구 사항을 참고하여 제시 코드를 완성하자
- 작성 코드
apiVersion: v1 kind: Pod # Pod 리소스에 대한 설정 metadata: name: hello-app namespace: default # 미선언 시 기본 default spec: containers: # 컨테이너 선언 - name: hello-app image: yoonjeong/hello-app:1.0 ports: - containerPort: 8080 env: # 환경변수 선언 - name: POD_NAME valueFrom: # 선언된 거 가져올거다 fieldRef: fieldPath: metadata.name - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: NAMESPACE_NAME valueFrom: fieldRef: fieldPath: metadata.namespace - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: NODE_IP valueFrom: fieldRef: fieldPath : status.hostIP - name: STUDENT_NAME # 새로운 값 정의 value: 진주 - name: GREETING # 정의된 값 이용 value: 안녕 $(STUDENT_NAME) |
환경변수 불러오기(2) : yaml 배포
- 배포
kubectl apply -f { yaml file } |
> 파일명 및 경로 주의
- 생성 확인
kubectl get pod -o wide kubectl get pod/hello-app -o json |
환경변수 불러오기(3) : 컨테이너의 환경변수 확인
- IP 확인
kubectl exec hello-app -- cat /etc/hosts |
- 환경변수 확인
kubectl exec hello-app -- env |
- 포트 설정 확인
> yaml에서 설정한 ` ports: - containerPort: 8080 `가 잘 적용됐는가
kubectl exec hello-app -- netstat -an |
환경변수 불러오기(4) : 포트포워딩
- 포트포워딩 설정
kubectl port-forward hello-app 8080:8080 |
- 접근
curl -v localhost:8080 |
![]() |
![]() |
환경변수 불러오기(5) : 환경정리
- 전체 pod 삭제
kubectl delete pod --all |
- 일부 pod 삭제
kubectl delete pod hello-pod |
Pod 내부 컨테이너 통신 : 절차
1) Pod 안에 서로 다른 컨테이너끼리 localhost로 통신
> 하나의 컨테이너에 서로 다른 포트를 가진 컨테이너 2개 선언
2) 서로 다른 Pod끼리 Pod IP로 통신
> Pod A에 존재하는 컨테이너는 B에 요청 전송 및 응답 확인
Pod 내부 컨테이너 통신(1) : yaml 선언
- 제시1) blue-green-app.yaml
# Pod API 버전: v1 # Pod 이름: blue-green-app # 컨테이너 이름/포트: blue-app(8080) # 도커 이미지: yoonjeong/blue-app:1.0 # 환경변수: NODE_NAME, NAMESPACE, POD_IP 설정 # 컨테이너 이름/포트: green-app(8081) # 도커 이미지: yoonjeong/green-app:1.0 # 환경변수: NODE_NAME, NAMESPACE, POD_IP 설정 |
- 제시2) red-app.yaml
# Pod API 버전: v1 # Pod 이름: red-app # 컨테이너 이름/포트: red-app(8080) # 도커 이미지: yoonjeong/red-app:1.0 # 환경변수: NODE_NAME, NAMESPACE, POD_IP 설정 |
- 제시 3) 공통
resources: limits: memory: "64Mi" cpu: "250m" |
- 구현1) blue-green-app.yaml
apiVersion: v1 kind: Pod metadata: name: blue-green-app containers: -name: blue-app image: yoonjeong/blue-app:1.0 ports: - containerPort: 8080 env: -name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName -name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace -name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP resources: limits: memory: "64Mi" cpu: "250m" |
-name: green-app image: yoonjeong/green-app:1.0 ports: - containerPort: 8081 env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: sepc.nodeName - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP resources: limits: memory: "64Mi" cpu: "250m" |
- 구현1) red-app.yaml
apiVersion: v1 kind: Pod metadata: name: red-app spec: containers: - name: red-app image: yoonjeong/red-app:1.0 ports: - containerPort: 8080 |
env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP resources: limits: memory: "64Mi" cpu: "250m" |
Pod 내부 컨테이너 통신(2) : yaml 배포
- yaml 배포
kubectl apply -f blue-green-app.yaml kubectl apply -f red-app.yaml |
- 생성 Pod 확인
kubectl get pod -o wide |
- 환경변수 확인
kubectl exec blue-green-app -c blue-app -- printenv POD_IP NAMESPACE NODE_NAME kubectl exec blue-green-app -c green-app -- printenv POD_IP NAMESPACE NODE_NAME kubectl exec red-app -c red-app -- printenv POD_IP NAMESPACE NODE_NAME |
> red-app 파드 내의 컨테이너인 red-app에 대한 exec
> printenv를 이용하면 환경변수 출력 가능
> 위와 같이 구성됨을 확인 함
Pod 내부 컨테이너 통신(3) : 파드 내부 통신
- 동일 Pod 내부 컨테이너 통신 : Blud -> Green
kubectl exec blue-green-app -c blue-app -- curl -vs localhost:8081/tree |
- 동일 Pod 내부 컨테이너 통신 : Blud <- Green
kubectl exec blue-green-app -c green-app -- curl -vs localhost:8080/sky |
* vs 옵션으로 Request/Response 확인 가능
* 포트포워딩 후 웹 브라우저 상에서 확인 가능
Pod 내부 컨테이너 통신(3) : 파드 내부 통신
- 접근하고자 하는 Pod의 IP에 대해 환경 변수로 등록
export RED_POD_IP= $(kubectl get pod red-app -o jsonpath="{.status.podIP}") |
> Unix 또는 Unix 계열만 가능
- 접근 : Blue -> Red
kubectl exec blue-green-app -c blue-app -- curl -vs $RED_POD_IP:8080/rose |
> RED_POD_IP 미선언 시, 위의 kubectl 명령어로 IP 획득 후 작성