반응형
동탄야도란
미역의 DevOps 일지
동탄야도란
전체 방문자
오늘
어제
  • 분류 전체보기 (54)
    • javascript (0)
      • Nest.js (0)
    • JAVA (1)
      • Algorithm (1)
    • DevOps (50)
      • Docker (7)
      • K8s (11)
      • AWS (10)
      • GCP (1)
      • Linux (6)
      • CS (7)
      • Terraform (2)
      • ElasticSearch (2)
    • 회고 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
동탄야도란

미역의 DevOps 일지

[K8s] 쿠버네티스 Pod간의 네트워크
DevOps/K8s

[K8s] 쿠버네티스 Pod간의 네트워크

2022. 12. 21. 17:22
728x90
반응형

1. Pod안에 서로 다른 컨테이너끼리 localhost로 통신한다

하나의 Pod에 서로 다른 포트로 컨테이너 2개를 선언

 

2. 서로 다른 Pod끼리 Pod IP로 통신한다.

Pod A에 있는 컨테이너 -> Pod B에 있는 컨테이너로 요청 전송/응답 확인

(파드 안에서 실행될 컨테이너는 준비되어있는 이미지이다)

 

진행 순서를 다시 한번 확인해 보자면

  1. Pod 선언과 환경변수 설정
  2. Pod 생성/배포
  3. Pod IP 할당 및 컨테이너 실행 확인
  4. 컨테이너 환경변수 목록 확인
  5. 컨테이너 간 localhost 통신
  6. 다른 Pod의 Pod IP로 통신
  7. 포트포워딩을 통해 각 컨테이너로 요청/응답 확인

앞으로 진행할 Pod의 통신의 예시

컨테이너 안에서의 엔드포인트 응답은 /sky, /tree, /rose, /hello 4개의 엔드포인트로 확인해볼 거다

총 실행되는 Pod는 3개이다 컨테이너 내부에서 실행될 node.js 서버를 잠깐만 확인해 보자

 

blue-app

blue-app은 /sky 엔드포인트로 접근하면 파란색의 view를 보여준다

const express = require('express')
const app = express()

app.set('view engine', 'ejs')

const POD_IP = process.env.POD_IP
const NODE_NAME = process.env.NODE_NAME
const NAMESPACE = process.env.NAMESPACE
const PORT = 8080

app.get('/sky', (req, res) => {
    res.render('sky', { podIp: POD_IP, nodeName: NODE_NAME, namespace: NAMESPACE })
})

app.get('/hello', (req, res) => {
    res.json("Hello, I'm Sky.")
})
app.listen(PORT, () => {
    console.log(`Server is running on ${PORT}`)

 

green-app

green-app은 /tree 엔드포인트로 요청하면 초록색 view를 보여준다

const express = require('express')
const app = express()

app.set('view engine', 'ejs')

const POD_IP = process.env.POD_IP
const NODE_NAME = process.env.NODE_NAME
const NAMESPACE = process.env.NAMESPACE
const PORT = 8081

app.get('/tree', (req, res) => {
    res.render('tree', { podIp: POD_IP, nodeName: NODE_NAME, namespace: NAMESPACE })
})

app.get('/hello', (req, res) => {
    res.json("Hello, I'm Tree.")
})
app.listen(PORT, () => {
    console.log(`Server is running on ${PORT}`)

 

red-app

res-app은 /rose의 엔드포인트로 접근하면 붉은 view를 렌더링 할 것이다

const express = require('express')
const app = express()

app.set('view engine', 'ejs')

const POD_IP = process.env.POD_IP
const NODE_NAME = process.env.NODE_NAME
const NAMESPACE = process.env.NAMESPACE
const PORT = 8080

app.get('/rose', (req, res) => {
    res.render('rose', { podIp: POD_IP, nodeName: NODE_NAME, namespace: NAMESPACE })
})

app.get('/hello', (req, res) => {
    res.json("Hello, I'm Rose.")
})
app.listen(PORT, () => {
    console.log(`Server is running on ${PORT}`)

실행될 서버의 코드들의 공통적으로는 /hello 엔드포인트가 있으며

각 Pod IP, node name, namespace가 외부에 보일 수 있게 설정해 놓았다

이제 파드를 생성하기 위해 yaml파일을 작성해 보자

apiVersion: v1
kind: Pod
metadata:
  name: blue-green-app
spec:
  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: spec.nodeName
    - name: NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    resources:
      limits:
        memory: "64Mi"
        cpu: "250m"

blue-app과 green-app은 같은 파드 안에서 실행하기 위해 세팅해 놨다.

또한 같은 파드 안에서 실행이 되기 때문에 포트번호를 구분해 놨다.

 

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"

red-app도 별다를 거 없이 비슷하다

이제 2개의 yaml 파일을 실행해 보자

$ kubectl apply -f blue-green-app.yaml red-app.yaml

실행했다면 파드를 조회해보자 조회했다면 아래처럼 확인이 가능할 거다

$ kubectl get pod

확인했다면 먼저 각 컨테이너의 환경변수를 확인해 보자

 

blue-app과 green-app은 같은 Pod안에서 실행이 되었기 때문에 Pod IP가 같은걸 확인할 수 있고

red-app은 다른 Pod이기 때문에 Pod IP가 다르다 이번에 blue-app과 green-app과 통신을 해보려 한다

블루 앱과 그린 앱은 다시 한번 말하지만 같은 Pod이기 때문에 localhost로 접근할 수 있다

# exec명령어는 실행중인 컨테이너에 접근하기위한 명령어이다 
# curl의 -v 옵션은 request header를 확인하기위함이다 -s는 reqeust의 결과만 확인이다
$ kubectl exec blue-green-app -c blue-app -- curl -vs localhost:8081/tree

바라는 엔드포인트로 요청을 했더니 정확하게 응답이 왔다 응답을 보면 환경변수로 세팅해놓은 pod IP와 nodename, namespace까지 확인할 수있다 그렇다면 green-app에서 blue-app으로 요청을 해본다면 비슷 응답이 온다는걸 확인 할 수 있을 것이다.

먼저 같은 Pod안에서 요청과 응답을 보냈다면 이번에는 서로 다른 Pod에서 요청을 해볼 차례다.

처음에 다른 Pod로 배포한 red-app Pod에서 blue-app, green-app Pod로 요청을 해보고 응답을 받아보자 

요청하기 위해서 우리는 각 Pod IP를 알아야 한다 먼저 red-app의 Pod IP를 조회해보자 Pod IP는 필드의 status.podIP 존재하게 되는데

아래의 명령어로 조회하게 된다면

# -o옵션은 output이며 뒤에오는 명령어는 어떤 출력을 원하는지에 다르다
# 여기서는 jsonpath로 .status.podIP를 탐색하게된다
$ kubectl get pod red-app -o jsonpath="{.status.podIP}"

red-app의 Pod IP가 조회된다 이제 조회된 IP를 이용해서 <Pod IP>:8080/red 엔드포인트를 요청해 보자

아래의 응답을 보면 다른 Pod로 통신하기 위해서 다른 Pod IP가 필요하다는 걸 확인할 수 있다

 

 

정리하자면 같은 Pod안에서 실행된 컨테이너는 localhost로 접근할 수 있지만

각각 다른 Pod와 통신을 하려면 서로 다른 Pod IP로 접근해야 통신이 가능하다는 걸 알 수 있다.

 

728x90
반응형

'DevOps > K8s' 카테고리의 다른 글

[K8s] 쿠버네티스 Deployment의 개념  (2) 2022.12.22
[K8s] 쿠버네티스 ReplicaSet의 개념  (0) 2022.12.22
[K8s] 쿠버네티스 Label과 Selector  (0) 2022.12.21
[K8s] 쿠버네티스 Pod의 개념과 환경변수  (0) 2022.12.21
[k8s] 쿠버네티스의 개념 - 1  (0) 2022.12.08
    'DevOps/K8s' 카테고리의 다른 글
    • [K8s] 쿠버네티스 ReplicaSet의 개념
    • [K8s] 쿠버네티스 Label과 Selector
    • [K8s] 쿠버네티스 Pod의 개념과 환경변수
    • [k8s] 쿠버네티스의 개념 - 1
    동탄야도란
    동탄야도란
    저도 잘 몰라요

    티스토리툴바