
1. Pod안에 서로 다른 컨테이너끼리 localhost로 통신한다
하나의 Pod에 서로 다른 포트로 컨테이너 2개를 선언
2. 서로 다른 Pod끼리 Pod IP로 통신한다.
Pod A에 있는 컨테이너 -> Pod B에 있는 컨테이너로 요청 전송/응답 확인
(파드 안에서 실행될 컨테이너는 준비되어있는 이미지이다)
진행 순서를 다시 한번 확인해 보자면
- Pod 선언과 환경변수 설정
- Pod 생성/배포
- Pod IP 할당 및 컨테이너 실행 확인
- 컨테이너 환경변수 목록 확인
- 컨테이너 간 localhost 통신
- 다른 Pod의 Pod IP로 통신
- 포트포워딩을 통해 각 컨테이너로 요청/응답 확인

컨테이너 안에서의 엔드포인트 응답은 /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로 접근해야 통신이 가능하다는 걸 알 수 있다.
'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 |