๐Ÿณ RecipeTips ( 2023.09.27 ~ 2023.11.01 )

'RecipeTips'๋Š” ์š”๋ฆฌ์— ๋Œ€ํ•œ ์ง€์‹์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ 1์ธ ๊ฐ€์กฑ ๋ฐ ์ž์ทจ์ƒ๋“ค์ด ์ž์œ ๋กญ๊ฒŒ ์†Œํ†ตํ•˜๊ณ , ์ •๋ณด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.


ํ”„๋กœ์ ํŠธ ๋ณด๊ณ ์„œ ๋ฐ ์‹œ์—ฐ ์˜์ƒ


ํ”„๋กœ์ ํŠธ ์„ ์ • ๋ฐฐ๊ฒฝ

Pendemic ์ดํ›„ ์™ธ์‹์ด ์–ด๋ ค์›Œ์ง€๊ณ  ์ง‘์—์„œ ์š”๋ฆฌํ•˜๋Š” ํ˜„์ƒ์ด ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ง์ ‘ ์š”๋ฆฌ๋ฅผ ํ•˜์—ฌ ๋ฌผ๊ฐ€ ๋ถ€๋‹ด์„ ๋‚ฎ์ถ”๋Š” ๊ฒฝํ–ฅ์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์€ ์–ด๋– ํ•œ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค์ง€, ์–ด๋–ป๊ฒŒ ์กฐ๋ฆฌ๋ฅผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด๋Ÿฌํ•œ ์ˆ˜์š”๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๊ณ  ์ง‘์—์„œ ์š”๋ฆฌํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•ด "RecipeTips"๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. RecipeTips๋Š” ๋‹ค์–‘ํ•œ ์š”๋ฆฌ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ถ”์ฒœ ์š”๋ฆฌ, ์กฐ๋ฆฌ ๋ฐฉ๋ฒ• ๋“ฑ์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.


ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

์˜ค๋Š˜๋‚ ์—๋Š” ์‹œ์Šคํ…œ์ด ์ง€์†์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณ ๊ฐ€์šฉ์„ฑ์ด ๊ฐ•์กฐ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด MSA ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Kubernetes๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž๋“ค์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ  ๊ฐœ๋ฐœ Process์˜ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์žฅ์• ์— ๋Œ€ํ•ด ๋Œ€๋น„๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ์ƒˆ๋กœ์šด ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ์‹œ ์ง€์†์ ์œผ๋กœ ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ง€์†์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜/๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Resource์™€ Application ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์—ญํ•  ๋ถ„๋‹ด

์„œ๋ช…์ง„ (PL) : K8S, Terraform ๊ตฌ์„ฑ, Argo, Monitoring ๊ตฌ์ถ•
์ตœ์žฌ๋ฏผ : AWS Infra ๊ตฌ์ถ•, ํ”„๋กœ์ ํŠธ ๋ฌธ์„œํ™” ์ž‘์„ฑ
์กฐ๊ด‘ํฌ : Front-end ๊ฐœ๋ฐœ, FlowChart ์ž‘์„ฑ
์ •์šฐ์šฉ : Back-end ๊ฐœ๋ฐœ, Jenkins ๊ตฌ์ถ•, CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•, PPT ์ œ์ž‘

์‚ฌ์šฉ ๊ธฐ์ˆ 

Infra

EC2 Image : Amazon-Linux 2023
K8S : 2.7
Terraform : 5.1.0

CI/CD

Jenkins : 2.426.1
Argo : 2.8.5

Front-end

React : 18.2.0
JavaScript : ES6

Back-end

Java : 17
MariaDB : 10.6
Redis : 7.0
MariaDB : 10.0.6
Spring Boot : 3.1.4



์•„ํ‚คํ…์ฒ˜

๐Ÿ“Œ Terraform Architecture

img.png

Terraform Code๋ฅผ ํ™œ์šฉํ•˜์—ฌ AWS Infra๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. Bastion Server๋ฅผ DB์™€ Mgmt๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. DB/Redis๋ฅผ ์ด์ค‘ํ™”ํ•˜์—ฌ ๊ฐ€์šฉ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค. EKS ํ™˜๊ฒฝ์—์„œ ํ™•์žฅ์„ฑ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ User Architecture

img_2.png

www.recipetips.net User์šฉ Domain์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ Admin Architecture

img_1.png

kibana.recipetips.net, grafana.recipetips.net, argocd.recipetips.net admin์šฉ Domain์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ ‘๊ทผํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Bastion Server๋ฅผ ํ™œ์šฉํ•ด ๋‚ด๋ถ€์— ์ ‘๊ทผํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ Kubernetes Architecture

img_3.png

์„œ๋น„์Šค๋ณ„๋กœ Namespace๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ CI / CD Pipeline

img_4.png

Github์— ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด push๊ฐ€ ๋˜๋ฉด Jenkins๋Š” ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ์†Œ์Šค ์ฝ”๋“œ clone์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•œ ํ›„, ECR ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ๋นŒ๋“œ๋œ Docker ์ด๋ฏธ์ง€๋ฅผ ECR์— pushํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ manifest File์˜ ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ArgoCD๋Š” Git ์ €์žฅ์†Œ์— ๋ณ€๊ฒฝ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉฐ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ EKS์— ๋ฐฐํฌํ•˜์—ฌ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.



FlowChart



API ๋ช…์„ธ์„œ

๐Ÿ“Œ ํšŒ์› API ๋ช…์„ธ์„œ


๐Ÿ“Œ ๊ฒŒ์‹œ๊ธ€ API ๋ช…์„ธ์„œ


๐Ÿ“Œ ๋Œ“๊ธ€ API ๋ช…์„ธ์„œ


๐Ÿ“Œ ๋ ˆ์‹œํ”ผ ์ถ”์ฒœ API ๋ช…์„ธ์„œ



ERD

img_5.png



์ฃผ์š” ๊ธฐ๋Šฅ

  • ์‚ฌ์šฉ์ž
    • Security ํšŒ์› ๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ
    • JWT Token ์ธ์ฆ
    • ํšŒ์› ์ •๋ณด ์ˆ˜์ •
    • ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ๊ฒŒ์‹œํŒ
    • ๊ฒŒ์‹œ๊ธ€ CRUD
    • ๋‹ต๋ณ€ CRUD
    • ํŽ˜์ด์ง€๋„ค์ด์…˜
    • ์ด๋ฏธ์ง€ ์ถ”๊ฐ€
  • ๋ ˆ์‹œํ”ผ
    • ๋ ˆ์‹œํ”ผ ์ถ”์ฒœ ๊ธฐ๋Šฅ
    • ๋ ˆ์‹œํ”ผ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
    • ๋ ˆ์‹œํ”ผ ์ƒ์„ธ๋ณด๊ธฐ ๊ธฐ๋Šฅ


๋ชจ๋‹ˆํ„ฐ๋ง

  • Grafnana / Prometheus๋ฅผ ํ™œ์šฉํ•˜์—ฌ Resource ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑ
  • EFK Stack์„ ํ™œ์šฉํ•˜์—ฌ Application ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์ถ•

Cluster ๋Œ€์‹œ๋ณด๋“œ

  • API ์„œ๋ฒ„ ํ˜ธ์ถœ
  • Node ์ƒํƒœ ๋ฐ Node ๊ฐœ์ˆ˜
  • Node CPU, Memory
  • Deployment update ํ˜„ํ™ฉ
  • Namespace ๋ณ„ replicas ํ˜„ํ™ฉ

Pod ๋Œ€์‹œ๋ณด๋“œ

  • Namespace ๋ณ„ Pod
  • Pod CPU, Memory
  • HPA ํ™•์ธ์„ ์œ„ํ•œ Pod ๊ฐœ์ˆ˜