기술 단어장/Kubernetes

[k8s] Pod 환경 변수 설정 및 Pod간 통신 구현

MFDO 2024. 2. 29. 16:40

 

 

 

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 획득 후 작성