Skip to content

Latest commit

ย 

History

History

kubernetes

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

0. k9s

Cluster ๋ณ€๊ฒฝ ๋ช…๋ น์–ด

:context

Port forwarding ๋ช…๋ น์–ด

shift + f

1. ์„ค์น˜ ๋ช…๋ น์–ด

Kubectl ์„ค์น˜ ๋ช…๋ น์–ด (Mac OS)

brew install kubectl 

Kustomize ์„ค์น˜ ๋ช…๋ น์–ด (Mac OS)

brew install kustomize

Minikube ์„ค์น˜ ๋ช…๋ น์–ด (Mac OS)

brew install minikube

2. ๊ธฐ๋ณธ ๊ฐœ๋…

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์™œ ํ•„์š”ํ•œ๊ฐ€

  • ๋ฐฐํฌํ•ด์•ผ ํ•  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ์ˆ˜๋ฐฑ ๊ฐœ์ธ ๊ฒฝ์šฐ ์‚ฌ๋žŒ์ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ์ˆ˜๋งŽ์€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ํšจ์œจ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๋Š”๊ฒƒ์ด ์–ด๋ ต๋‹ค.
  • ์—ฌ๋Ÿฌ ์„œ๋ฒ„์™€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐฐํฌ ์กฐํ•ฉ ์ˆ˜๋ฅผ ์‚ฌ๋žŒ์ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๋‹ค
    • ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•œ๋‹ค๋ฉด? ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„, ๋น„์šฉ ๋ฐœ์ƒ
  • ๊ฐ„๋‹จํ•œ ์žฌ์‹œ์ž‘๋งŒ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ณต๊ตฌ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค
    • ์–ด๋–ค ์„œ๋ฒ„์— ์–ด๋–ค ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์—ˆ๋Š”์ง€๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๊ธฐ๋Šฅ

  • ์ž๋™ํ™”๋œ ๋นˆ ํŒจํ‚น(bin packing)
    • ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ๊ฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” CPU์™€ ๋ฉ”๋ชจ๋ฆฌ(RAN)์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—๊ฒŒ ์ง€์‹œํ•œ๋‹ค.
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋…ธ๋“œ์— ๋งž์ถ”์–ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์žฅ ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
  • ์ž๋™ํ™”๋œ ๋ณต๊ตฌ
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ต์ฒดํ•œ๋‹ค.
    • '์‚ฌ์šฉ์ž ์ •์˜ ์ƒํƒœ ๊ฒ€์‚ฌ'์— ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฃฝ์ด๊ณ , ์„œ๋น„์Šค ์ค€๋น„๊ฐ€ ๋๋‚  ๋•Œ ๊นŒ์ง€ ๊ทธ๋Ÿฌํ•œ ๊ณผ์ •์„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
  • ์ž๋™ํ™”๋œ ๋กค์•„์›ƒ๊ณผ ๋กค๋ฐฑ
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์„œ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ์„ค์ •ํ•œ ์†๋„์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ) ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ž๋™ํ™”ํ•ด์„œ ๋ฐฐํฌ์šฉ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Borg

  • Google์—์„œ ๊ฐœ๋ฐœํ•œ ์ตœ์ดˆ์˜ ํ†ตํ•ฉ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ
  • ์ž์› ์š”๊ตฌ์‚ฌํ•ญ์„ ์˜ˆ์ธกํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ๋„๋ฅผ ๋†’์ด๊ณ  ๋น„์šฉ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • Configuration ํŒŒ์ผ์„ ์‹คํ–‰ ์ค‘์ธ ์„œ๋น„์Šค์— ๋™์ ์œผ๋กœ ๋ฐ˜์˜
  • ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์ž๋™ ํฌ๊ธฐ ์กฐ์ • ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

Omega

  • Borg์—์„œ ๋ช‡๊ฐ€์ง€ ๊ธฐ๋Šฅ ๊ฐœ์„ ์„ ํ•ด์„œ ๋งŒ๋“ฌ
  • ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ์ €์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ - ์˜๊ตฌ ์ €์žฅ์†Œ
  • ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ๋‹ค.

Kubernetes

  • Borg, Omega์™€ ๋‹ฌ๋ฆฌ ์˜คํ”ˆ ์†Œ์Šค์ด๋‹ค.
  • ๊ตฌ๊ธ€ ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ์‚ฌ์—…์„ ์„ฑ์žฅ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœ
  • Omega์ฒ˜๋Ÿผ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์œ  ์˜๊ตฌ ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋‹ค
  • Omega๋Š” ์˜๊ตฌ ์ €์žฅ์†Œ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๋“ค์ด ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐฉ ํ–ˆ์ง€๋งŒ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ์œ„ํ•ด REST API๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝํ—˜์— ๋” ์ค‘์ ์„ ๋‘๊ณ  ๊ฐœ๋ฐœํ–ˆ๋‹ค.
  • ์ฃผ์š” ์„ค๊ณ„ ๋ชฉํ‘œ -> ์ปจํ…Œ์ด๋„ˆ๋กœ ํ–ฅ์ƒ๋œ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ์˜ ์ด์ ์„ ๋ˆ„๋ฆฌ๋ฉด์„œ๋„ ๋ณต์žกํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”๊ฒƒ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ)์— ์ž๋™์œผ๋กœ ๋ฐฐํฌ, ์Šค์ผ€์ผ๋ง ๋ฐ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ์‹œ์Šคํ…œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ž€

  • ํด๋Ÿฌ์Šคํ„ฐ: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ์ง‘ํ•ฉ, ํ•˜๋‚˜์˜ ์„œ๋ฒ„์ฒ˜๋Ÿผ ๋™์ž‘
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„ ์ง‘ํ•ฉ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—๋Š” Master node์™€ Worker node๊ฐ€ ์žˆ๋‹ค.
  • Master node: worker node๋“ค์˜ ๋Œ€์žฅ ์—ญํ• 
  • Worker node: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋…ธ๋“œ

Master ๋…ธ๋“œ์˜ ์—ญํ• 

  • ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ
  • 4๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ
    • etcd(key-value data store): ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ •๋ณด๋ฅผ ์ €์žฅ
    • API Server: ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ์กฐํšŒ, ๋ณ€๊ฒฝ์„ ์œ„ํ•œ API ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
    • Scheduler: ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ์Šค์ผ€์ฅด๋ง์„ ๋‹ด๋‹น
    • Controller Managers: ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฐœ์ˆ˜๋‚˜ ์ƒํƒœ๋“ค์ด ์ž˜ ์šด์˜๋˜๊ณ  ์žˆ๋Š” ์ง€๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด API Server์— ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ์—ญํ• ์„ ํ•จ

๋งˆ์Šคํ„ฐ๋…ธ๋“œ - etcd

  • ๋ชจ๋“  ์ƒํƒœ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์•ˆ์ „์„ฑ์„ ๋†’์ž„ (๊ณ ๊ฐ€์šฉ์„ฑ)
  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋ฉด์„œ ์ •ํ™•ํ•˜๊ฒŒ ์„ค๊ณ„ (์ผ๊ด€์„ฑ)
  • Key(directory)-Value ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ
  • TTL(time to live), watch๊ฐ™์€ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ๋ฐฑ์—…์€ ํ•„์ˆ˜!

๋งˆ์Šคํ„ฐ๋…ธ๋“œ - API server

  • ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์กฐํšŒ
  • etcd์™€ ์œ ์ผํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๋Š” ๋ชจ๋“ˆ
  • REST API ํ˜•ํƒœ๋กœ ์ œ๊ณต
  • ๊ถŒํ•œ์„ ์ฒดํฌํ•˜์—ฌ ์ ์ ˆํ•œ ๊ถŒํ•œ์ด ์—†์„ ๊ฒฝ์šฐ ์š”์ฒญ์„ ์ฐจ๋‹จ
  • ๊ด€๋ฆฌ์ž ์š”์ฒญ ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๋‚ด๋ถ€ ๋ชจ๋“ˆ๊ณผ ํ†ต์‹ 
  • ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅ๋˜๋„๋ก ๋””์ž์ธ

๋งˆ์Šคํ„ฐ๋…ธ๋“œ - Scheduler

  • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ Pod์„ ๊ฐ์ง€ํ•˜๊ณ  ์‹คํ–‰ํ•  ๋…ธ๋“œ๋ฅผ ์„ ํƒ
  • ๋…ธ๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ Pod์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒดํฌ
    • ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ๋ถ€์—ฌ
    • ex) a-zone, b-zone ๋˜๋Š” gpu-enabled, ...

๋งˆ์Šคํ„ฐ๋…ธ๋“œ - Controller

  • ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์กด์žฌ
    • ๋ณต์ œ ์ปจํŠธ๋กค๋Ÿฌ
    • ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ
    • ์—”๋“œํฌ์ธํŠธ ์ปจํŠธ๋กค๋Ÿฌ...
  • ๋Š์ž„ ์—†์ด ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๊ณ  ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€
  • ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰

Worker ๋…ธ๋“œ

  • ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์„ ๋‹ด๋‹น
  • Kubelet, Container Runtime (Docker, ...) ๋“ฑ์ด ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค.
  • kube-proxy: ์›Œ์ปค ๋…ธ๋“œ๋“ค๋กœ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ pod๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ kube-proxy ํ”„๋กœ์„ธ์Šค๋„ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค.

"์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฐํฌํ•œ๋‹ค"๋ž€

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ Manifest ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์„œ, ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์žˆ๋Š” API Server์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ–‰์œ„

Manifest ํŒŒ์ผ์ด๋ž€

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ •๋ณด
  • "์ผ์„ ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ง€์‹œ์„œ"

API Server๋ฅผ ํ†ตํ•œ ํ˜‘๋ ฅ

image

  1. ์‚ฌ์šฉ์ž๊ฐ€ kubectl์„ ํ†ตํ•ด์„œ API Server์— HTTP POST request๋ฅผ ์š”์ฒญํ•จ
  2. ์š”์ฒญ์„ ๋ฐ›์€ API Server๋Š” etcd์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  3. Controller Managers๊ฐ€ ์‹ ๊ทœ ๋ฆฌ์†Œ์Šค Event๋ฅผ ๋ฐ›์•„, ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์š”์ฒญ์„ API Server๋กœ ๋ณด๋‚ธ๋‹ค.
  4. API๊ฐ€ pod ์ƒ์„ฑ ์š”์ฒญ์„ ๋ฐ›๊ฒŒ ๋˜๊ณ , pod์— ๋Œ€ํ•œ ์„ค์ • ์ •๋ณด๋ฅผ etcd์— ์ €์žฅํ•œ๋‹ค.
  5. Scheduler๊ฐ€ ๋…ธ๋“œ์— ๋ฐฐํฌ ๋˜์ง€ ์•Š์€ pod๋ฅผ ์ฝ์–ด์˜ค๊ณ , ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ๋ณด๊ณ  pod๊ฐ€ ๋ฐฐํฌ๋  ๋•Œ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๊ณ  ๊ทธ ๋ฆฌ์†Œ์Šค์— ์ ํ•ฉํ•œ ์ตœ์ ์˜ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ์„ ํƒํ•˜์—ฌ ๋…ธ๋“œ ์ •๋ณด๋ฅผ pod์ •๋ณด์— ์ถ”๊ฐ€ํ•ด์„œ API Server๋กœ ์ „์†กํ•œ๋‹ค.
  6. API Server๋Š” ๊ทธ ์ •๋ณด๋ฅผ etcd์— ๊ธฐ๋กํ•œ๋‹ค.
  7. Kubelet ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚ด๊ฐ€ ์‹คํ–‰ ์ค‘์ธ A๋…ธ๋“œ์— ๋ฐฐํฌ ํ•ด์•ผ ํ•  pod๊ฐ€ ์žˆ๊ตฌ๋‚˜์— ๋Œ€ํ•œ event๋ฅผ ๋ฐ›์•„, docker์—๊ฒŒ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  docker๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ํ•œ๋‹ค.
  • Kubelet์€ ์ง€์†์ ์œผ๋กœ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ํ—ฌ์Šค์ฒดํฌ๋ฅผ ํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์ด์ง€ ์•Š๋‹ค๋ฉด API์„œ๋ฒ„์— ๋ณด๊ณ ๋ฅผํ•˜๊ณ  API Server๋Š” etcd์— ์ €์žฅํ•œ๋‹ค.
  • Kubelet์€ ๋งŒ์•ฝ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๊ฐ€ ์ข‹์ง€ ์•Š์œผ๋ฉด ์žฌ์‹œ์ž‘ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

kube-proxy์™€ iptables๋ฅผ ์ด์šฉํ•œ ํ†ต์‹  ๋ฐฉ๋ฒ•

image

์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. API Server๋ฅผ ํ†ตํ•ด์„œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๋จ
  2. ์–ด๋–ค pod์˜ ip๋“ค์ด ํ• ๋‹น์ด ๋˜๊ธฐ ์œ„ํ•ด์„œ kube-proxy๊ฐ€ ๊ฐ์‹œ๋ฅผ ํ•ด์„œ ์ž์‹ ์˜ worker node์— ์žˆ๋Š” iptable์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. kube-proxy๊ฐ€ ์›Œ์ปค๋…ธ๋“œ๋กœ ์ƒˆ๋กœ์šด ํŠธ๋ž˜ํ”ฝ์ด ๋“ค์–ด ์™”์„ ๋•Œ iptables๋ฅผ ๋ณด๊ณ  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ชฉ์ ์ง€๋กœ ์—ฐ๊ฒฐ์„ ์ง€์›ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ด์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค
  • ์‚ฌ์šฉ์ž ์˜๋„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํ‘œํ˜„ ๋ฐฉ์‹: YAML
  • ์ „๋‹ฌ ๋ฐฉ์‹: REST API
  • ์˜ค๋ธŒ์ ํŠธ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ด ๋‹ฌ๋ผ์ง„๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ƒํƒœ๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํŒ€์˜ ๊ตฌ์กฐ, ๋ฐฐํฌ ์ •์ฑ…, ํ”„๋กœ์„ธ์Šค๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ (ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐœ์ฒด๋“ค)

  • Pod: ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„
  • ReplicaSet: ์–ผ๋งˆ๋‚˜
  • Node, Namespace: ์–ด๋””์—
  • Deployment: ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•  ๊ฒƒ์ธ๊ฐ€
  • Service, Endpoints: ํŠธ๋ž˜ํ”ฝ์„ ์–ด๋–ป๊ฒŒ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํ•  ๊ฒƒ์ธ๊ฐ€

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•

  • ์˜ค๋ธŒ์ ํŠธ ๊ธฐ๋ณธ ์ •๋ณด (ํ•„์ˆ˜ ๊ฐ’)
    • apiVersion: ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” API ๋ฒ„์ „
    • kind: ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์ข…๋ฅ˜
    • metadata: ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ตฌ๋ถ„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด (name, resourceVersion, labels, namespace, ...)
    • spec: ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์ƒํƒœ (์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์€ ์˜ค๋ธŒ์ ํŠธ ์ข…๋ฅ˜๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค.)
  • status
    • ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒ์„ฑ๋˜๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์˜ค๋ธŒ์ ํŠธ ์ •๋ณด์— status ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

spec vs status ํ•„๋“œ

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ YAML ํŒŒ์ผ์„ ์ž‘์„ฑ (spec ์ž‘์„ฑ)
  2. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์ด์šฉํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ƒ์„ฑ์„ ์š”์ฒญ
  3. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API Server๊ฐ€ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ spec ํŒŒ์ผ์„ ์ฝ๊ณ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑ
  4. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ControllerManager๊ฐ€ spec๊ณผ status๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ๊ณ„์† ์กฐ์ •ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

3. ๊ธฐ๋ณธ ๋ช…๋ น์–ด

minikube ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • (docker)

minikube start --driver docker 

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ ๋ชฉ๋ก ์กฐํšŒ

kubectl api-resources

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์„ค๋ช…๊ณผ 1๋ ˆ๋ฒจ ์†์„ฑ๋“ค์˜ ์„ค๋ช…

kubectl explain <type> 
kubectl explain deployment

(apiVersion, kind, metadata, spec, status)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์†์„ฑ๋“ค์˜ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…

kubectl explain <type>.<fieldName>[.<fieldName>]
kubectl explain pods.spec.containers

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์†ํ•œ ๋…ธ๋“œ ๋ชฉ๋ก ์กฐํšŒ

kubectl get nodes

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ/๋ณ€๊ฒฝ

kubectl apply -f <object-file-name>
kubectl apply -f deployment.yaml

์‹คํ–‰ ์ค‘์ธ Pod(์ปจํ…Œ์ด๋„ˆ) ๋ชฉ๋ก ์กฐํšŒ

kubectl get pods

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๊ฐœ์ˆ˜ ์กฐ์ •

kubectl scale -f <object-file-name> --replicas=#
kubectl scale -f deployment.yaml --replicas=3

์‹คํ–‰ ์ค‘์ธ ์˜ค๋ธŒ์ ํŠธ ์„ค์ •๊ณผ ์ž…๋ ฅํ•œ ํŒŒ์ผ์˜ ์ฐจ์ด์  ๋ถ„์„

kubectl diff -f <object-file-name>
kubectl diff -f deployment.yaml

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ spec์„ editor๋กœ ํŽธ์ง‘

kubectl edit <type>/<name>
kubectl edit deployment/nginx-deployment -> replicas๋ฅผ 4๋กœ ๋ณ€๊ฒฝ 

๋กœ์ปฌ์—์„œ ํฌํŠธํฌ์›Œ๋”ฉ

kubectl port-forward <type>/<name> <local-port>:<container-port>
kubectl port-forward pod/nginx-deployment-74bfc88f4d-fkfjc 8080:80

์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค์— ์ ‘์†ํ•ด์„œ ๋กœ๊ทธ ํ™•์ธ

kubectl attach <type>/<name> -c <container-name>
kubectl attach deployment/nginx-deployment -c nginx

์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค์— ๋ชจ๋“  ๋กœ๊ทธ ์ถœ๋ ฅ

kubectl logs <type>/<name> -c <container-name> -f
kubectl logs deployment/nginx-deployment -c nginx -f

4. ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…

local ํ™˜๊ฒฝ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ (m1 mac)

brew install google-cloud-sdk
gcloud init
gcloud container clusters get-credentials <ํ”„๋กœ์ ํŠธ ๋ช…> --zone us-central1-c --project <..>

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ yaml ์ž‘์„ฑ ์‹œ ๋„์›€ ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ

vscode ํŒจํ‚ค์ง€ -> Kubernetes ์„ค์น˜ 

5. pod ์‚ดํŽด๋ณด๊ธฐ

Pod ๊ฐœ๋…

  • Pod์€ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์ฝฉ๊ป์งˆ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
  • ๋…ธ๋“œ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ ๋‹จ์œ„
  • ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— 1๊ฐœ ์ด์ƒ์˜ Pod๋ฅผ ๋ถ„์‚ฐ ๋ฐฐํฌ/์‹คํ–‰ ๊ฐ€๋Šฅ (Pod Replicas)

Pod ํŠน์ง•

  • Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋…ธ๋“œ์—์„œ ์œ ์ผํ•œ IP๋ฅผ ํ• ๋‹น (์„œ๋ฒ„ ๋ถ„๋ฆฌ ํšจ๊ณผ)
  • Pod ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— localhost๋กœ ํ†ต์‹  ๊ฐ€๋Šฅ (ํฌํŠธ ์ถฉ๋Œ์„ ์ฃผ์˜ ํ•ด์•ผ ํ•œ๋‹ค)
  • Pod ์•ˆ์—์„œ ๋„คํŠธ์›Œํฌ์™€ ๋ณผ๋ฅจ ๋“ฑ ์ž์›์„ ๊ณต์œ 

Pod ํŠน์ง• - PodIP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” Service ํ˜น์€ Ingress ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Pod ํŠน์ง• - Replica

  • ๋‹จ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ์›ํ•˜๋Š” ์ˆ˜๋งŒํผ Pod ์ƒ์„ฑ
kubectl scal deployment orderapp --replicas=3 

Pod์™€ ์ปจํ…Œ์ด๋„ˆ ์„ค๊ณ„์‹œ ๊ณ ๋ ค ํ•  ์ 

  • Pod:Container = 1:1 or 1:N ๊ฒฐ์ • => pod์€ ์ƒ์„ฑ๊ณผ ์ข…๋ฃŒ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜์„œ, ์„œ๋กœ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜์˜ pod๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š” 1:1๋กœ ๊ตฌ์„ฑํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.
  1. ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์ด ๊ฐ™์€๊ฐ€?
    • Pod ๋ผ์ดํ”„ ์‚ฌ์ดํด = ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด
    • ์ปจํ…Œ์ด๋„ˆ A๊ฐ€ ์ข…๋ฃŒ ๋˜์—ˆ์„ ๋•Œ ์ปจํ…Œ์ด๋„ˆ B ์‹คํ–‰์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”๊ฐ€
  2. ์Šค์ผ€์ผ๋ง ์š”๊ตฌ์‚ฌํ•ญ์ด ๊ฐ™์€๊ฐ€?
    • ์›น ์„œ๋ฒ„ vs ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์ด "ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ vs ๊ทธ๋ ‡์ง€ ์•Š์€" ๊ณผ ๊ฐ™์ด ์š”๊ตฌ์‚ฌํ•ญ์ด ๋‹ค๋ฅด๋ฉด ์ข‹์ง€ ์•Š๋‹ค.
  3. ์ธํ”„๋ผ ํ™œ์šฉ๋„๊ฐ€ ๋” ๋†’์•„์ง€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค ๋“ฑ ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ Pod๋ฅผ ์Šค์ผ€์ฅด๋ง

pod๊ฐ€ ๋…ธ๋“œ์— ๋ฐฐํฌ๋˜๋Š” ๊ณผ์ •

Master Node: API Server, Replication Controller, Scheduler Worker Node: kubelet, docker

  1. API Server: ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ pod ๋ฐฐํฌ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•œ๋‹ค
  2. Replication Controller: Api Server๋กœ ๋ถ€ํ„ฐ ์š”์ฒญ ๋ฐ›์€ ์ˆ˜ ๋งŒํผ Pod Replica๋ฅผ ์ƒ์„ฑ ํ•œ๋‹ค (pod desired state == current state)
  3. Scheduler: Api Server๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์€ ์š”์ฒญ์œผ๋กœ Pod๋ฅผ ๋ฐฐํฌํ•  ์ ์ ˆํ•œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค (nodeselector)
  4. Kublet: Api Server๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์€ ์š”์ฒญ์œผ๋กœ docker์—๊ฒŒ ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ช…๋ นํ•˜๊ณ  Pod ์‹คํ–‰์„ ์ค€๋น„ํ•œ๋‹ค. Pod ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค
  5. Docker: kublet๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์€ ์š”์ฒญ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

Pod ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•

apiVersion: V1 # Kubernetes API ๋ฒ„์ „
kind: Pod # ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…
metadata: # ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด 
  name: kube-basic # ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„
  labels: # ์˜ค๋ธŒ์ ํŠธ ์ง‘ํ•ฉ์„ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ด๋ฆ„ํ‘œ 
    app: kube-basic
    project: test-project
spec: # ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฐ”๋žŒ์งํ•œ ์ƒํƒœ
  nodeSelector: # Pod๋ฅผ ๋ฐฐํฌํ•  ๋…ธ๋“œ
  containers: # Pod ์•ˆ์—์„œ ์‹คํ–‰ํ•  ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก
  volumes: # ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ ๋ชฉ๋ก 

Pod ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ• - nodeSelector

spec:
  nodeSelector: # Pod ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๋…ธ๋“œ ์„ ํƒ
    gpu: "true" # ๋…ธ๋“œ ์ง‘ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž (key: value) 

# ์œ„ ๊ตฌ๋ฌธ์˜ ํ•ด์„: gpu ๊ฐ€ true์ธ ๋…ธ๋“œ์—๋งŒ ๋ฐฐํฌ๋ฅผ ํ•˜๋ผ.

Pod ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ• - containers

spec:
  containers:
  - name: kube-basic  # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ 
  image: kube-basic: 1.0 # ๋„์ปค ์ด๋ฏธ์ง€ ์ฃผ์†Œ 
  imagePullPolicy: "Always" # ๋„์ปค ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ์ •์ฑ… (Always/IfNotPresent/Never)
  ports:
  - containerPort: 80 # ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ  

Pod ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ• - containers ํ™˜๊ฒฝ ๋ณ€์ˆ˜ env

spec:
  containers:
  - name:kube-basic
  image: kube-basic:1.0
    env: # ์ปจํ…Œ์ด๋„ˆ์— ์„ค์ •ํ•  ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ชฉ๋ก 
    - name: PROFILE # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ด๋ฆ„ 
    value: production # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’ 
    - name: LOG_DIRECTORY
    value: /logs
    - name: MESSAGE
    value: This application is running on $(PROFILE) # ๋‹ค๋ฅธ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฐธ์กฐ

Pod ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ• - containers valumeMounts

spec:
  containers:
  - name: kube-basic
  image: kube-basic:1.0 
    volumeMounts: # ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  Pod ๋ณผ๋ฅจ ๋ชฉ๋ก 
    - name: html # Pod ๋ณผ๋ฅจ ์ด๋ฆ„ 
    mountPath: /var/html # ๋งˆ์šดํŠธํ•  ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ
  - name: web-server
    image: nginx
    volumeMounts: 
    - name: html
      mountPath: /usr/share/nginx/html  # ๊ฐ™์€ Pod ๋ณผ๋ฅจ์„ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ๋งˆ์šดํŠธ
      readOnly: true

Pod ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ• - spec volumes

spec:
  containers:
  volumes: # ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ ๋ชฉ๋ก 
    name: host-volume # ๋ณผ๋ฅจ ์ด๋ฆ„ 
    hostPath: # ๋ณผ๋ฅจ ํƒ€์ž… , ๋…ธ๋“œ์— ์žˆ๋Š” ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธํ•˜๊ณ ์ž ํ•  ๋•Œ 
      path: /data/mysql
  • Pod ๋ณผ๋ฅจ ๋ผ์ดํ”„์‚ฌ์ดํด = Pod ๋ผ์ดํ”„์‚ฌ์ดํด
  • Container์—์„œ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ๋ฐฉ๋ฒ•: volumeMounts ์†์„ฑ
  • ๋ชฉ์ ์— ๋งž๋Š” ๋ณผ๋ฅจ ์„ ํƒ (hostPath, gitRepo, ConfigMap, Secret, ...)

Pod์˜ ํ•œ๊ณ„์ 

  1. Pod์ด ๋‚˜๋„ ๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ์ข…๋ฃŒ๋œ๋‹ค๋ฉด?
  • ์ž๊ฐ€ ์น˜์œ  ๋Šฅ๋ ฅ(Self-Healing)์ด ์—†๋‹ค. Pod์ด๋‚˜ ๋…ธ๋“œ ์ด์ƒ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด ๋
  • "์‚ฌ์šฉ์ž๊ฐ€ ์„ ์–ธํ•œ ์ˆ˜๋งŒํผ Pod์„ ์œ ์ง€" ํ•ด์ฃผ๋Š” Replicaset ์˜ค๋ธŒ์ ํŠธ ๋„์ž… ํ•„์š”
  1. Pod IP๋Š” ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑํ•  ๋•Œ ๋งˆ๋‹ค IP๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ "์™ธ๋ถ€์—์„œ ์ ‘๊ทผ"ํ•  ์ˆ˜ ์žˆ๋Š” "๊ณ ์ •์ ์ธ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ"๊ฐ€ ํ•„์š”
  • Pod์˜ ์ง‘ํ•ฉ์„ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ Service ์˜ค๋ธŒ์ ํŠธ ๋„์ž… ํ•„์š”

Pod ํ•ต์‹ฌ ์ •๋ฆฌ

Pod ์ƒ์„ฑ๊ณผ ๋ฐฐํฌ

  • Pod๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ณ  ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ๋ฐฐํฌ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • Pod๋ฅผ YAML ํŒŒ์ผ๋กœ ์ •์˜ ํ•ด๋‘๋ฉด ํ•„์š” ํ•  ๋•Œ ์›ํ•˜๋Š” ์ˆ˜ ๋งŒํผ ๋…ธ๋“œ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Pod์™€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ 1:1๋กœ ๊ธฐ๋ณธ ์„ค๊ณ„ํ•˜๊ณ  ํŠน๋ณ„ํ•œ ์‚ฌ์œ ๊ฐ€ ์žˆ์„ ๋•Œ 1:N ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ•˜์ž.

Pod IP

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” IP๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  • Pod IP๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ ๊ณต์œ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ๊ฐ„ ํฌํŠธ ์ถฉ๋Œ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ Pod์— ์†ํ•œ ์ปจํ…Œ์ด๋„ˆ๋“ค์€ localhost๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ Pod(์ปจํ…Œ์ด๋„ˆ)์™€ ํ†ต์‹ ์€ Pod IP๋ฅผ ์ด์šฉํ•œ๋‹ค.

Pod ๋ฐฐํฌ ๋ฐ ํ™•์ธ ์‹ค์Šต ๋ฐฉ๋ฒ•

image

Pod ์ด๋ฆ„, ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„๊ณผ ์ด๋ฏธ์ง€, ํฌํŠธ ์„ค์ •

apiVersion: v1
kind: Pod
metadata:
  name: hello-app
spec:
  containers:
  - name: hello-app
    image: devchloe/hello-app:1.0
    ports:
    - containerPort: 3000
  - env:

์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ‚ค์™€ ๊ฐ’ ์„ค์ •

spec:
  containers:
  - env: hello-app
    - name: STUDENT_NAME # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ‚ค ์„ ์–ธ
      value: ์‹ ๊ฒฝ๋• # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’ ์„ ์–ธ 
    - name: GREETING
      value: ํ•˜์ด $(STUDENT_NAME)๋‹˜ 

Pod ์˜ค๋ธŒ์ ํŠธ ๊ฐ’์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ์„ค์ •

spec:
  containers:
  - env: hello-app
    - name: NODE_NAME
      valueFrom: # k8s ์˜ค๋ธŒ์ ํŠธ๋กœ๋ถ€ํ„ฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์„ ์–ป๋Š”๋‹ค.
        fieldRef: # Pod spec, status์˜ field๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ์ฐธ์กฐ 
          fieldPath: spec.nodeName # ์ฐธ์กฐํ•  field์˜ ๊ฒฝ๋กœ ์„ ํƒ 
    - name: NODE_IP
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP

Pod์ด๋ฆ„, ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„๊ณผ ์ด๋ฏธ์ง€, ํฌํŠธ, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ ์„ค์ •

# ์š”๊ตฌ์‚ฌํ•ญ!
# Pod API ๋ฒ„์ „: v1
# Pod ์ด๋ฆ„: hello-app
# Pod ๋„ค์ž„์ŠคํŽ˜์ด์Šค: default
# ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„/ํฌํŠธ: hello-app(80)
# ๋„์ปค ์ด๋ฏธ์ง€: 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์„ ์ฐธ์กฐํ•œ ์ธ์‚ฟ๋ง)

apiVersion: v1
kind: Pod
metadata:
  name: hello-app
spec:
  containers:
  - name: hello-app
    image: nginx:latest
    ports:
    - containerPort: 80
    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)๋‹˜!
    resources:
      limits:
        memory: "128Mi"
        cpu: "100m"

๋ฐฐํฌ, ํ™•์ธ, ์‚ญ์ œ ๋ช…๋ น์–ด

# ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch2/hello-app.yaml

# Pod ์‹คํ–‰ ๋ฐ IP ํ™•์ธ
kubectl get pod -o wide 

# ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ
kubectl exec hello-app -- env 

# ์ปจํ…Œ์ด๋„ˆ IP ํ™•์ธ
kubectl exec hello-app -- ifconfig eth0 

# ์ปจํ…Œ์ด๋„ˆ host ํ™•์ธ 
kubectl exec hello-app -- cat /etc/hosts

# ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์Šค๋‹ ํฌํŠธ ํ™•์ธ 
kubectl exec hello-app -- netstat -an

# ํฌํŠธ ํฌ์›Œ๋”ฉ 
kubectl port-forward hello-app 5000:80

# or kubectl delete pod <pod-name> -> Pod ์ข…๋ฃŒ 
kubectl delete pod --all 

์ปจํ…Œ์ด๋„ˆ ๊ฐ„ localhost ํ†ต์‹ , ๋‹ค๋ฅธ Pod์˜ Pod IP ํ†ต์‹  ์˜ˆ์ œ

image

# blue, green ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch3/blue-green-app.yaml

# red ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch3/red-app.yaml 

# blue log ํ™•์ธ 
kubectl logs blue-green-app -c blue-app

# ํ™˜๊ฒฝ๋ณ€์ˆ˜(POD_IP, NAMESPACE, NODE_NAME) ์กฐํšŒ 
kubectl exec blue-green-app -c blue-app -- printenv POD_IP NAMESPACE NODE_NAME

# blue-app ์ปจํ…Œ์ด๋„ˆ -> green-app ์ปจํ…Œ์ด๋„ˆ /tree, /hello ์š”์ฒญ ์‹คํ–‰ 
kubectl exec blue-green-app -c blue-app -- curl -vs localhost:8081/tree
kubectl exec blue-green-app -c blue-app -- curl -vs localhost:8081/hello

# green-app ์ปจํ…Œ์ด๋„ˆ -> blue-app ์ปจํ…Œ์ด๋„ˆ /sky, /hello ์š”์ฒญ ์‹คํ–‰ 
kubectl exec blue-green-app -c green-app -- curl -vs localhost:8080/sky
kubectl exec blue-green-app -c green-app -- curl -vs localhost:8080/hello

# red-app ip ์กฐํšŒ 
kubectl get pod/red-app -o jsonpath="{.status.podIP}"

# red_pod_ip ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • 
export RED_POD_IP=$(kubectl get pod/red-app -o jsonpath="{.status.podIP}")

# blue-app ์ปจํ…Œ์ด๋„ˆ -> red-app ์ปจํ…Œ์ด๋„ˆ /rose, /hello ์š”์ฒญ ์‹คํ–‰ 
kubectl exec blue-green-app -c blue-app -- curl -vs $RED_POD_IP:8080/rose

# ํฌํŠธํฌ์›Œ๋”ฉ 
kubectl port-forward blue-green-app 8080:8080
kubectl port-forward blue-green-app 8081:8081
kubectl port-forward red-app 8082:8080

# pod ์ข…๋ฃŒ 
kubectl delete pod --all 

Label๊ณผ Selector ๋ž€

  • Label: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ key/value ์Œ์˜ ๋ฉ”ํƒ€์ •๋ณด
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด ๋ถ™์ด๋Š” ์ด๋ฆ„ํ‘œ
  • Selector: Label์„ ์ด์šฉํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ label query
    • Label๋ฅผ ์ด์šฉํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•

Label๊ณผ Selector๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ

image

  • ์˜ˆ) ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํŒ€์˜ ์ˆ˜๋ฐฑ๊ฐœ Pod์ด ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์ฃผ๋ฌธ ํŠธ๋ž˜ํ”ฝ์„ ์ฃผ๋ฌธ Pod์œผ๋กœ, ๋ฐฐ๋‹ฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฐ๋‹ฌ Pod์œผ๋กœ ๋ผ์šฐํŒ… ํ•ด์•ผ ํ•  ๋•Œ
  • ์˜ˆ) ๋ฐฐ๋‹ฌ ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€๋˜๋Š” ์ƒํ™ฉ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ฐฐ๋‹ฌ ๊ด€๋ จ Pod๋“ค์„ ์ˆ˜ํ‰ ํ™•์žฅ ํ•ด์•ผ ํ•  ๋•Œ
  • ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•ด์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•  ๋•Œ

Label ์˜ˆ์‹œ

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: backend
    version: v1
    env: prod

Label ์กฐํšŒ ๋ช…๋ น์–ด

kubectl get pod my-pod --show-labels

Label ์ถ”๊ฐ€ ๋ช…๋ น์–ด

kubectl label pod my-pod app=backend

Label ๋ณ€๊ฒฝ ๋ช…๋ น์–ด

kubectl label pod my-pod version=v1 # ์ƒ์„ฑ 
kubectl label pod my-pod version=v2 --overwrite # ๋ณ€๊ฒฝ 

Label ์„ ํƒ ์กฐํšŒ ๋ช…๋ น์–ด

kubectl get pod/my-pod --label-columns app,env
kubectl get pod/my-pod -L app,env

Label ์‚ญ์ œ ๋ช…๋ น์–ด

kubectl label pod/my-pod app-

selector ๋ฌธ๋ฒ•

kubectl get <์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…> --selector <label query 1, ..., label query N>
kubectl get <์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…> -l <label query 1, ..., label query N>
label query: key=value

label query ์—ฐ์‚ฐ์ž =, !=

  • = : ๊ฐ™๋‹ค
  • != : ๊ฐ™์ง€ ์•Š๋‹ค
kubectl get pod --selector env=prod
kubectl get pod --selector env!=prod
kubectl get pod --selector app=backend,env=prod
kubectl get pod --selector app!=backend,env=prod

label query ์—ฐ์‚ฐ์ž in, notin

  • in: ์†ํ•ด ์žˆ๋‹ค, ํ‚ค๊ฐ€ ์กด์žฌํ•œ๋‹ค
  • notin: ์†ํ•ด ์žˆ์ง€ ์•Š๋‹ค, ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
kubectl get pod --selector 'env in (dev,stage,prod)' # env์— dev,stage,prod ์…‹ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋˜๋ฉด ์ถœ๋ ฅ  
kubectl get pod --selector 'env notin (dev,stage,prod)' # env์— dev,stage,prod ์…‹๋‹ค ์•„๋‹Œ๊ฒƒ์„ ์ถœ๋ ฅ 

label query ์—ฐ์‚ฐ์ž ํ‚ค๊ฐ’ ์กฐํšŒ

kubectl get pod --selector env # env ํ‚ค๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ์ถœ๋ ฅ 
kubectl get pod --selector !env # env ํ‚ค๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ์ถœ๋ ฅ 

label query (selector) ์˜ˆ์‹œ

# -- group=nature ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“  ํŒŒ๋“œ ์กฐํšŒ
kubectl get pod --selector group=nature -L group,concept,element,position,version
# -- concept๊ฐ€ flower์ด๊ฑฐ๋‚˜ earth์ธ ๋ชจ๋“  ํŒŒ๋“œ ์กฐํšŒ 
kubectl get pod --selector 'concept in (flower,earth)' -L group,concept,element,position,version
# -- concept ๋ ˆ์ด๋ธ”์ด ์—†๋Š” ๋ชจ๋“  ํŒŒ๋“œ ์กฐํšŒ (! ์ด์šฉ)
kubectl get pod --selector '!concept' -L group,concept,element,position,version
# -- concept ๋ ˆ์ด๋ธ”์ด ์—†๋Š” ๋ชจ๋“  ํŒŒ๋“œ ์กฐํšŒ (notin ์ด์šฉ)
kubectl get pod --selector 'concept notin (earth, flower)' -L group,concept,element,position,version
# -- ๋ฌผ์„ ์ฃผ์–ด์•ผ ํ•˜๋Š” group=nature ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“œ ํŒŒ๋“œ ์กฐํšŒ (position=bottom)
kubectl get pod --selector group=nature,position=bottom -L group,concept,element,position,version
# -- ์†์ด ๋‹ฟ์ง€ ์•Š๋Š” group=nature ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ํŒŒ๋“œ์˜ IP ์กฐํšŒ (position=top)
kubectl get pod --selector group=nature,position=top -L group,concept,element,position,version
kubectl get pod --selector group=nature,position!=bottom -L group,concept,element,position,version

nodeSelector๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ธฐ

image

kubectl get nodes --show-labels # ๋…ธ๋“œ ์กฐํšŒ -> ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋œ node 3๊ฐœ๊ฐ€ ๋‚˜์˜ด. 
kubectl get nodes # ๋ ˆ์ด๋ธ” ์—†์ด ์กฐํšŒ 

# ์ฒซ๋ฒˆ์งธ ์„ธ๋ฒˆ์งธ ๋…ธ๋“œ์— ๋ ˆ์ด๋ธ” ์ถ”๊ฐ€ 
kubectl label node gke-my-cluster-default-pool-3b91989a-56s9 gke-my-cluster-default-pool-3b91989a-xv16 soil=moist 

# ๋‘๋ฒˆ์งธ ๋…ธ๋“œ์— ๋ ˆ์ด๋ธ” ์ถ”๊ฐ€ 
kubectl label node gke-my-cluster-default-pool-3b91989a-bx9c soil=dry

# ๋ฐ˜์˜๋œ label ์กฐํšŒ
kubectl get node -L soil 


# Pod ์ƒ์„ฑ (kubectl run <pod-name> --labels="" --image= --port= --overrides='{"key": {"key": {"key": "value"}}}')
# apiVersion: v1
# kind: Pod
# metadata:
#   name: tree-app-1
#   labels:
#     element: tree
# spec:
#   nodeSelector:
#     soil: moist
#   containers:
#   - name: tree-app
#     image: yoonjeong/green-app:1.0
#     ports:
#     - containerPort: 8081

# pod 5๊ฐœ ๋ฐฐํฌ 
for i in {1..5}; 
do kubectl run tree-app-$i \
--labels="element=tree" \
--image=yoonjeong/green-app:1.0 \
--port=8081 \
--overrides='{ "spec": { "nodeSelector": {"soil": "moist"} } }';
done


# ๋ฐฐํฌ๋œ pod ํ™•์ธ -> moist์—๋งŒ ๋ฐฐํฌ๋๋Š”์ง€ ํ™•์ธ.
kubectl get pod -o wide

# ์ƒ์„ฑํ•œ pod ์ œ๊ฑฐ 
kubectl delete pod -l element=tree

6. replica set

replica set ์ด๋ž€

  • replicaSet์€ Pod ๋ณต์ œ๋ณธ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.
  • N๊ฐœ์˜ Pod์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ ๋ช…๋ น์„ N๋ฒˆ ์‹คํ–‰ํ•  ํ•„์š” ์—†๋‹ค.
  • replicaSet ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ  ์›ํ•˜๋Š” Pod์˜ ๊ฐœ์ˆ˜๋ฅผ replicas ์†์„ฑ์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž ๋Œ€์‹  Pod ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋„˜์น˜์ง€ ์•Š๊ฒŒ Pod ์ˆ˜๋ฅผ ์กฐ์ •

replica set์˜ ํ•„์š”์„ฑ

  • pod์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ, pod๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค. (No Self-Healing)
  • pod์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ, ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ 24/7 ๋™์•ˆ Pod ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์ •์ƒ ๋ณต๊ตฌํ•ด์•ผ ํ•œ๋‹ค
  • N๊ฐœ์˜ Pod์„ ์‹คํ–‰ํ•˜๊ณ  ์ƒํƒœ ์ด์ƒ์— ๋Œ€๋น„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ replica set์ด ํ•ด์ค€๋‹ค.

replica set ํŠน์ง•

  • ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๊ฐ€์ง„๋‹ค. (fault tolerance)
  • ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ํ•˜๋“œ์›จ์–ด ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ •์ƒ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • ์‚ฌ๋žŒ์˜ ๊ฐœ์ž…์—†์ด ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๊ฐ€์ง„ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

replica set ์—ญํ• 

  • Pod/๋…ธ๋“œ ์ƒํƒœ์— ๋”ฐ๋ผ Pod์˜ ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ReplicaSet์—๊ฒŒ ์—ญํ• ์„ ์œ„์ž„ํ•œ๋‹ค.
  • ReplicaSet์„ ์ด์šฉํ•ด์„œ Pod ๋ณต์ œ ๋ฐ ๋ณต๊ตฌ ์ž‘์—… ์ž๋™ํ™”
  • ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ReplicaSet์„ ๋งŒ๋“ค์–ด ํ•„์š”ํ•œ Pod์˜ ๊ฐœ์ˆ˜๋ฅผ k8s์—๊ฒŒ ์„ ์–ธ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ReplicaSet ์š”์ฒญ์„œ์— ์„ ์–ธ๋œ replicas๋ฅผ ์ฝ๊ณ  ๊ทธ ์ˆ˜๋งŒํผ Pod ์‹คํ–‰์„ ๋ณด์žฅ

replica set ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•

apiVersion: apps/v1 # k8s api ๋ฒ„์ „
kind: ReplicaSet # ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…
metadata: # ์˜ค๋ธŒ์ ํŠธ ์‹๋ณ„ ์ •๋ณด 
  name: blue-app-rs # ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„
  labels: # ์˜ค๋ธŒ์ ํŠธ ์ง‘ํ•ฉ์„ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ด๋ฆ„ํ‘œ
    app: blue-app
spec: # ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” Pod์˜ ๋ฐ”๋žŒ์งํ•œ ์ƒํƒœ
  selector: # ReplicaSet์ด ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” Pod๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ label query
    matchLabels:
      app: blue-app # Pod label query ์ž‘์„ฑ
  replicas: # ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” Pod์˜ ๋ณต์ œ๋ณธ ๊ฐœ์ˆ˜ ์„ ์–ธ 
  template: # Pod ์‹คํ–‰ ์ •๋ณด - Pod Template๊ณผ ๋™์ผ (metadata, spec, ...)
    metadata:
      labels:
        app: blue-app # Replica Set selector์— ์ •์˜ํ•œ label์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค 
    spec:
      containers:
        - name: blue-app
          image: blue-app:1.0

replica set์œผ๋กœ pod ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜

  • replicaSet์„ ์ด์šฉํ•ด์„œ Pod ๋ณต์ œ๋ณธ(replicas)์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค
    • ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๊ฑธ์ณ ๋ฐฐํฌ๋œ Pod Up/Down ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  replicas ์ˆ˜๋งŒํผ ์‹คํ–‰์„ ๋ณด์žฅํ•œ๋‹ค
  • replicaSet์˜ spec.selector.matchLabels๋Š” Pod Template ๋ถ€๋ถ„์˜ spec.template.metadata.labels์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • spec.replicas๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๋‹ค.

๊ฐ„๋‹จํ•œ replica set ์˜ˆ์‹œ

spec:
  selector:
    matchLabels:
      app: blue-app
  replicas: 3
  template:
    metadata:
      labels:
        app: blue-app
    spec:
      containers:
      - name: blue-app
        image: 'yoonjeong/blue-app:1.0'
        ports:
        - containerPort: 8080
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch4/replicaset.yaml # replicaSet ์ƒ์„ฑ
kubectl get rs blue-replicaset -o wide # replicaset๊ณผ ๋ฐฐํฌ ์ด๋ฏธ์ง€ ํ™•์ธ
kubectl get pod -o wide # pod ๋ชฉ๋ก๊ณผ ๋ฐฐํฌ๋œ ๋…ธ๋“œ ํ™•์ธ
kubectl describe rs blue-replicaset # replicaset์˜ pod ์ƒ์„ฑ ๊ธฐ๋ก ํ™•์ธ
kubectl get events --sort-by=.metadata.creationTimestamp # replicaSet์˜ pod ์ƒ์„ฑ ์ดํ›„ ๊ณผ์ • ํ™•์ธ
kubectl port-forward rs/blue-replicaset 8080:8080 # replicaSet ํŒŒ๋“œ๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ 
curl localhost:8080/sky
kubectl delete rs/blue-replicaset # ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์‚ญ์ œ 

๊ธฐ์กด์— ์ƒ์„ฑํ•œ Pod๋ฅผ ReplicaSet์œผ๋กœ ๊ด€๋ฆฌ

kubectl apply -f blue-app.yaml # pod ์ƒ์„ฑ 
kubectl apply -f replicaset.yaml # ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์ƒ์„ฑ, blue-app์˜ label๊ณผ ๋™์ผํ•ด์•ผ๋จ.
kubectl describe rs blue-replicaset # 2๊ฐœ๊ฐ€ ์ƒ์„ฑ๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ -> 1๊ฐœ pod๋Š” ์ด๋ฏธ ์ƒ์„ฑํ•ด์„œ.

replicaset์˜ Pod ์ƒ์„ฑ/๋ณต๊ตฌ ์ž๋™ํ™” ๊ธฐ๋Šฅ

  • pod ์‚ญ์ œ ํ˜น์€ ์ข…๋ฃŒ์‹œ
    • pod ๊ฐœ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ replicas์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด pod๋ฅผ ์ƒ์„ฑํ•˜์—ฌ replicas๋ฅผ ๋งž์ถค
  • ๋…ธ๋“œ ์‹คํŒจ ์‹œ
    • up์ƒํƒœ์˜ pod์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์ธ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด pod๋ฅผ ๊ฑด๊ฐ•ํ•œ ๋…ธ๋“œ์— ์ƒ์„ฑํ•˜์—ฌ replicas๋ฅผ ๋งž์ถ˜๋‹ค.

pod๋Š” ๋‚ฉ๋‘๊ณ , replicaset๋งŒ ์‚ญ์ œ ํ•˜๊ธฐ

kubectl delete rs blue-replicaset --cascade=orphan

gracefullyํ•˜๊ฒŒ replicaSet&pod ์‚ญ์ œ ํ•˜๊ธฐ

kubectl scale rs/blue-replicaset --replicas 0
kubectl delete rs/blue-replicaset

pod watch ๋ชจ๋“œ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ๋ฒ•

kubectl get pod -w

pod์˜ owner ํ™•์ธ ๋ช…๋ น์–ด

kubectl get pod blue-replicaset-9k7zh -o jsonpath="{.metadata.ownerReferences[0].name}" 
# ๊ฒฐ๊ณผ -> blue-replicaset

๋ฐฐํฌํ•œ ReplicaSet์˜ Pod Template์„ ๋ณ€๊ฒฝ

  • ๋ณ€๊ฒฝํ•ด๋„ ๊ธฐ์กด Pod์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค.
  • ReplicaSet์— ์„ ์–ธํ•œ replicas ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๊ฒฝ์šฐ์—๋งŒ Pod์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•œ๋‹ค.
  • 3๊ฐœ๋ฅผ ๋ฐฐํฌํ•œ ์ƒํ™ฉ์—์„œ, Pod Template์„ ๋ณ€๊ฒฝํ•˜๊ณ  Replicas๋ฅผ 4๊ฐœ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด, ๊ธฐ์กด Pod๋“ค์€ ๊ทธ๋Œ€๋กœ ์žˆ๊ณ  ์ƒˆ๋กœ์šด Pod์—๋งŒ ๋ณ€๊ฒฝ๋œ Template๊ฐ€ ์ ์šฉ๋˜์–ด ๋ฐฐํฌ๋œ๋‹ค.

replicas ์ˆ˜ ๋ณ€๊ฒฝ ๋ช…๋ น์–ด

kubectl scle rs/<replicaset-name> --replicas <number of replicas>

replicaset ๋กค๋ฐฑ

  • pod template ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๋กค๋ฐฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹คํ–‰ ์ค‘์ธ Pod ์žฅ์•  ์‹œ ReplicaSet์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ๋ฒ„์ „์˜ Pod๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Label์„ ํ†ตํ•œ ๋กค๋ฐฑ
    • ๊ธฐ์กด์— replicaSet์œผ๋กœ image: my-app2.0 ์œผ๋กœ 3๊ฐœ๋ฅผ ๋ฐฐํฌํ•œ ์ƒํ™ฉ์ด๋‹ค.
    • ๊ทธ 3๊ฐœ๊ฐ€ ๋ชจ๋‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์„œ my-app1.0์œผ๋กœ ๋กค๋ฐฑํ•ด์•ผ ํ•œ๋‹ค.
      1. replicaSet์˜ Pod Template ์ด๋ฏธ์ง€๋ฅผ 1.0์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
      1. ๊ธฐ์กด์— 2.0์œผ๋กœ ๋ฐฐํฌ๋œ Pod์˜ ๋ ˆ์ด๋ธ”์„ ๋ณ€๊ฒฝํ•œ๋‹ค -> ReplicaSet selector๋กœ๋ถ€ํ„ฐ ์ œ์™ธ
    • ์œ„ 1,2๋ฒˆ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด replicaSet์ด ๊ด€๋ฆฌํ•˜๋Š” pod๊ฐ€ ์—†์–ด์กŒ๋‹ค๋Š”๊ฒƒ์„ ์•Œ๊ณ  ์ƒˆ๋กญ๊ฒŒ my-app1.0์œผ๋กœ 3๊ฐœ๋ฅผ ๋ฐฐํฌ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • replicas ์ˆ˜ ์กฐ์ •์„ ํ†ตํ•œ ๋กค๋ฐฑ
      1. kubectl scale rs myapp-replicaset --replicas 0
      1. replicaSet์˜ Pod Template ๋ณ€๊ฒฝ (์ด๋ฏธ์ง€๋ฅผ my-app2.0 -> my-app1.0์œผ๋กœ ๋ณ€๊ฒฝ)
      1. kubectl scale rs myapp-replicaset --replicas 3

ReplicaSet ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ

kubectl set image rs/<replicaset-name> <container>=<image>

7. deployment

์ง€๊ธˆ๊นŒ์ง€์˜ ReplicaSet์œผ๋กœ Pod๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์ด์œ 

  • replicaSet์˜ Pod ๋ณต์ œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Pod๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ ์–ธํ•œ replicas ์ˆ˜๋งŒํผ Pod ์‹คํ–‰์„ ๋ณด์žฅํ•œ๋‹ค
  • ReplicaSet์ด ์šด์˜์ž ๋Œ€์‹  Pod ์ƒํƒœ๋ฅผ 24/7 ๊ฐ์‹œํ•œ๋‹ค
  • Pod ์‹คํ–‰ ์ค‘์—๋„ replicas ์กฐ์ •์ด ์ž์œ ๋กญ๋‹ค

Deployment์˜ ํ•„์š”์„ฑ

  • ๋กค๋ฐฑ์„ ํ•  ๋•Œ ์ƒˆ๋กœ์šด ReplicaSet์„ ๋งŒ๋“ค์–ด์„œ Pod ์žฌ๋ฐฐํฌ or Pod Template ๋ณ€๊ฒฝ ํ›„ ์ ์šฉํ›„ ํ•„์š”์—†๋Š” ReplicaSet๊ณผ Pod๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.
  • ๋กค๋ฐฑ ํ˜น์€ ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณต์„ ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.
  • ๋ฐฐํฌํ•  ๋•Œ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์€ ๋ณดํ†ต Pod Template ์ด๋ฏธ์ง€์ด๋‹ค.

Deployment ์˜ค๋ธŒ์ ํŠธ๋ž€

  • Pod ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ ์˜ค๋ธŒ์ ํŠธ (ReplicaSet + ๋ฐฐํฌ์ „๋žต)
  • ์ƒˆ๋กœ์šด Pod์„ ๋กค์•„์›ƒ/๋กค๋ฐฑํ•  ๋•Œ ReplicaSet ์ƒ์„ฑ์„ ๋Œ€์‹ ํ•ด์ค€๋‹ค. (Pod ๋ณต์ œ)
  • ๋‹ค์–‘ํ•œ ๋ฐฐํฌ ์ „๋žต์„ ์ œ๊ณตํ•˜๊ณ  ์ด์ „ ํŒŒ๋“œ์—์„œ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋กœ์˜ ์ „ํ™˜ ์†๋„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด์ œ๋ถ€ํ„ฐ๋Š” Pod๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ReplicaSet์ด ์•„๋‹Œ Deployment๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Deployment ์˜ค๋ธŒ์ ํŠธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•

apiVersion: apps/v1 # Kubernetes API ๋ฒ„์ „
kind: Deployment # ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…
metadata: # ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด
  name: my-app # ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„ 
spec: # ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” Pod์˜ ๋ฐ”๋žŒ์งํ•œ ์ƒํƒœ
  selector: # ReplicaSet์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•  Pod๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ label query
    matchLabels:
      app: my-app
  replicas: 3 # ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” Pod ๋ณต์ œ๋ณธ ๊ฐœ์ˆ˜ ์„ ์–ธ
  template: # Pod ์‹คํ–‰ ์ •๋ณด - Pod Template๊ณผ ๋™์ผ (metadata, spec, ...)
    metadata:
      labels:
        app: my-app # selector์— ์ •์˜ํ•œ label์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค
    spec:
      containers:
      - name: my-app
        image: my-app:1.0

Deployment์˜ Pod Template 1.0 -> 2.0 ๋ณ€๊ฒฝ ์š”์ฒญ

  1. ๊ธฐ์กด์— Deployment๋กœ 1.0์ด "ReplicaSetA"์•ˆ์— 3๊ฐœ์˜ pod๊ฐ€ ๋ฐฐํฌ๋œ ์ƒํ™ฉ
  2. 1.0->2.0 ์—…๋ฐ์ดํŠธ ์š”์ฒญ
  3. Deployment๊ฐ€ "ReplicaSetB"์•ˆ์— 3๊ฐœ์˜ 2.0๋ฒ„์ „์˜ pod์™€ ํ•จ๊ป˜ ๋ฐฐํฌ
  4. "ReplicaSetA"์˜ scale์„ 0์œผ๋กœ ์กฐ์ •
  5. "ReplicaSetA" ์ œ๊ฑฐ

Deployment ๋กค์•„์›ƒ ์ „๋žต1 - Recreate ๋ฐฐํฌ

  • ์ด์ „ Pod๋ฅผ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๊ณ  ์ƒˆ๋กœ์šด Pod๋ฅผ replicas๋งŒํผ ์ƒ์„ฑ
  • pod๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ตฌ๊ฐ„์ด ์ƒ๊ธธ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
  • ์„œ๋น„์Šค down time์ด ์žˆ์„ ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๋ฐฉ๋ฒ•
  • ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์„œ๋น„์Šค ์šด์˜ ๋‹จ๊ณ„์—์„œ๋Š” ์œ ์˜ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

image

Deployment ๋กค์•„์›ƒ ์ „๋žต2 - RollingUpdate ๋ฐฐํฌ

  • ๋ชจ๋“  ์ด์ „ Pod๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€, ์ƒˆ๋กœ์šด Pod ์ƒ์„ฑ๊ณผ ์ด์ „ Pod ์ข…๋ฃŒ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜๋Š” ๋ฐฉ์‹
  • pod๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ตฌ๊ฐ„์ด ์—†์œผ๋ฏ€๋กœ service down time ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ๋ฒ„์ „์˜ ์‘๋‹ต๊ณผ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์‘๋‹ต์ด ํ˜ผํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค.

image

Recreate vs Rollingupdate

  • Recreate
    • ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ์ด์ „ ๋ฒ„์ „์ด ์ฆ‰์‹œ ์ข…๋ฃŒ
    • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹œ์ž‘๋˜๊ธฐ ์ „๊นŒ์ง€ ์„œ๋น„์Šค๋ฅผ ๋ชปํ•จ
    • replicas ์ˆ˜๋งŒํผ์˜ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ํ•„์š”
    • ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์œ ์šฉ
  • RollingUpdate
    • ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๋ฉด์„œ ์ด์ „ ๋ฒ„์ „์„ ์ข…๋ฃŒ
    • ์„œ๋น„์Šค ๋‹ค์šด ํƒ€์ž„ ์ตœ์†Œํ™”
    • ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” Pod์˜ ๊ฐœ์ˆ˜๊ฐ€ replicas๋ฅผ ๋„˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ๋” ๋งŽ์ด ํ•„์š”

RollingUpdate ์†๋„ ์ œ์–ด ์˜ต์…˜ - maxUnavailable

  • ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์œ ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ์ตœ์†Œ Pod์˜ ๋น„์œจ(์ˆ˜)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ตœ์†Œ Pod ์œ ์ง€ ๋น„์œจ = 100 - maxUnavailable ๊ฐ’
  • ์˜ˆ) replicas: 10, maxUnavailable: 30%
    • ์ด์ „ ๋ฒ„์ „์˜ Pod๋ฅผ replicas ์ˆ˜์˜ ์ตœ๋Œ€ 30%๊นŒ์ง€ ์ฆ‰์‹œ Scale Down ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • replicas๋ฅผ 10์œผ๋กœ ์„ ์–ธ ํ–ˆ์„ ๋•Œ, ์ด์ „ ๋ฒ„์ „์˜ Pod๋ฅผ 3๊ฐœ๊นŒ์ง€ ์ฆ‰์‹œ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ Pod ์ƒ์„ฑ๊ณผ ์ด์ „ ๋ฒ„์ „์˜ Pod ์ข…๋ฃŒ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ replicas ์ˆ˜์˜ 70% ์ด์ƒ์˜ Pod๋ฅผ ํ•ญ์ƒ Running ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

RollingUpdate ์†๋„ ์ œ์–ด ์˜ต์…˜ - maxSurge

  • ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Pod์˜ ๋น„์œจ(์ˆ˜)๋ฅผ ์ง€์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ตœ๋Œ€ Pod ํ—ˆ์šฉ ๋น„์œจ = maxSurge ๊ฐ’
  • ์˜ˆ) replicas: 10, maxSurge 30%
    • ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ Pod๋ฅผ replicas ์ˆ˜์˜ ์ตœ๋Œ€ 30%๊นŒ์ง€ ์ฆ‰์‹œ Scale Up ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ Pod๋ฅผ 3๊ฐœ๊ฐ€์ง€ ์ฆ‰์‹œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ Pod ์ƒ์„ฑ๊ณผ ์ด์ „ ๋ฒ„์ „์˜ Pod ์ข…๋ฃŒ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ด Pod์˜ ์ˆ˜๊ฐ€ replicas์ˆ˜์˜ 130%๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

maxUnavailable, maxSurge ์˜ˆ์‹œ

  • ์˜ˆ) replicas: 3, maxUnavailable: 1, maxSurge: 0
    • ํ•œ ์‹œ์ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ Pod: 2
    • ํ•œ ์‹œ์ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Pod: 3
  • ์˜ˆ) replicas: 3, maxUnavailable: 1, maxSurge: 1
    • ํ•œ ์‹œ์ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ Pod: 2
    • ํ•œ ์‹œ์ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Pod: 4
  • ์˜ˆ) replicas: 3, maxUnavailable: 1, maxSurge: 2
    • ํ•œ ์‹œ์ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ Pod: 2 (replicas - maxUnavailable)
    • ํ•œ ์‹œ์ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Pod: 5 (replicas + maxSurge)

maxUnavailable, maxSurge ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ๊ธฐ์กด์— ์‹คํ–‰ ์ค‘์ธ Pod๋ฅผ ์ผ์‹œ์— ์ œ๊ฑฐํ•˜๋ฉด ์ƒˆ๋กœ์šด Pod๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ๊นŒ์ง€ ์„œ๋น„์Šค ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“  Old Pod์„ New Pod๋กœ ์ „ํ™˜ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด Pod๋ฅผ replicas ์ˆ˜๋งŒํผ ๋ฏธ๋ฆฌ ๋ฐฐํฌํ•œ๋‹ค๋ฉด ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค. (์•ฝ 2๋ฐฐ ๋ฆฌ์†Œ์Šค ํ™•๋ณด ํ•„์š”)
  • ๊ทธ๋ž˜์„œ maxUnavailable์„ ์ด์šฉํ•ด์„œ ์ตœ์†Œ ์„œ๋น„์Šค ์šด์˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์„ ๋งŒํผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” Pod๋ฅผ ์„ ์–ธ ํ•ด์•ผ ํ•œ๋‹ค.
  • maxSurge๋กœ ์–ด๋–ค ์‹œ์ ์— ๋™์‹œ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Pod ์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ๋ฐฐํฌ ์†๋„๋ฅผ ์กฐ์ ˆํ•จ๊ณผ ๋™์‹œ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์œ ์ง€ํ•ด์•ผํ•  Pod ์ˆ˜์˜ ์ƒํ•œ์„ ๊ณผ ํ•˜ํ•œ์„ ์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ด๋‹ค.

Deployment ๋กค๋ฐฑ ์ „๋žต - Revision

  • Deployment๋Š” ๋กค์•„์›ƒ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ Revision # ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
  • Revision ํŠน์ • ๋ฒˆํ˜ธ์— ๋Œ€ํ•ด์„œ ๋ฐฐํฌ๋˜์—ˆ๋˜ Pod Template ์ •๋ณด๋ฅผ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
Pod Template:
  Labels: app=my-app
          version=v1
          pod-template-hash=65464c57f5 # ๋ฒ„์ „๋งˆ๋‹ค pod Template์˜ ํ•ด์‹œ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๊ฐ™์€ pod Template์œผ๋กœ ๋ฐฐํฌํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  Annotations: kubernetes.io/change-cause: v1 ๋ฐฐํฌ
  Containers:
    my-app:
      image: nginx: 1.16.1
      Port: 80/TCP
  • Revision #๋ฅผ ์ด์šฉํ•œ ์†์‰ฌ์šด ๋กค๋ฐฑ
kubectl rollout undo deployment <deployment-name> --to-revision=1 # ํ˜„์žฌ๋ฒ„์ „์ด 3์ธ ์ƒํ™ฉ.

Deployment์˜ replicas ๋ณ€๊ฒฝ

  • ์ƒˆ๋กœ์šด replicaSet์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด๋ฏธ ์ƒ์„ฑํ•œ replicaSet์ด ์ƒˆ๋กœ์šด Pod๋ฅผ 'desired - current' replicas๋งŒํผ ์ถ”๊ฐ€ ์ƒ์„ฑํ•œ๋‹ค.

Deployment ์ด๋ฒคํŠธ ํ™•์ธ ๋ช…๋ น์–ด

kubectl describe deployment <deployment-name>

Deployment๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ Pod ์ƒํƒœ ๋ณ€ํ™” ํ™•์ธ

kubectl get deployment -w 

Deployment ๋ฐฐํฌ ์ง„ํ–‰์ค‘/์™„๋ฃŒ ์ƒํƒœ ํ™•์ธ

kubectl rollout status deployment <deployment-name>

Deployment์˜ Pod replicas ๋ณ€๊ฒฝ

kubectl scale deployment <deployment-name> --replicas=<number-of-pod>

ReplicaSet ์ด๋ฒคํŠธ ํ™•์ธ

kubectl descripbe rs <replicaset-name>

ReplicaSet์ด ์ƒ์„ฑํ•œ Pod ์ƒํƒœ ๋ณ€ํ™” ํ™•์ธ

kubectl get rs -w

label selector๋กœ ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

kubectl delete all -l <label-key>=<label-value>

Deployment ๋ฐฐํฌ ๋ฐ replicas ๋ณ€๊ฒฝ ์˜ˆ์‹œ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080 
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch5/deployment.yaml # ๋ฐฐํฌ
kubectl describe deployment my-app # deployment ์ด๋ฒคํŠธ ํ™•์ธ 
kubectl rollout status deployment/my-app # ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ 
kubectl scale deployment my-app --replicas=5 # pod replicas ๋ณ€๊ฒฝ 
kubectl describe deployment my-app # deployment ์ด๋ฒคํŠธ ํ™•์ธ 
kubectl port-forward deployment/my-app 8080:8080 # ํฌํŠธํฌ์›Œ๋”ฉ
kubectl delete all -l app=my-app # pod, replicaSet ์‚ญ์ œ -> deployment๊ฐ€ ๋‚จ์•„์„œ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐํฌ๋จ 
kubectl delete deployment my-app # deployment ๊นŒ์ง€ ๊ฐ™์ด ์ œ๊ฑฐ (pod, replicaSet ๋ชจ๋‘ ์ œ๊ฑฐ ) 

Deployment์˜ Pod Template ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ & ๋ ˆ์ด๋ธ” ๋ณ€๊ฒฝ ๊ณผ์ •

  1. Deployment๊ฐ€ ์ƒˆ๋กœ์šด ReplicaSet์„ ์ƒ์„ฑํ•œ๋‹ค
  2. ์ด์ „ ReplicaSet์€ ์ž์‹ ์ด ๊ด€๋ฆฌํ•˜๋Š” Pod๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ ํ•œ๋‹ค.
  3. ์ƒˆ๋กœ์šด ReplicaSet์€ ์ƒˆ๋กœ์šด Pod๋ฅผ replicas ์ˆ˜ ๋งŒํผ ์ƒ์„ฑํ•œ๋‹ค.

Deployment Pod Template ์˜ˆ์‹œ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        project: fastcampus
        env: production
    spec:
      containers:
      - name: my-app
        image: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch6/deployment.yaml # ๋ฐฐํฌ
kubectl describe deployment my-app # deployment ์ด๋ฒคํŠธ ํ™•์ธ 
kubectl rollout status deployment/my-app # ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ 
kubectl set image deployment my-app my-app=yoonjeong/my-app:2.0 # ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ / ํ˜น์€ label๋ณ€๊ฒฝ ํ˜น์€ ์ถ”๊ฐ€ ํ›„ ์žฌ ๋ฐฐํฌ  
kubectl describe rs/<old-replicaset-name> # old ReplicaSet์˜ Pod ์ด๋ฒคํŠธ 
kubectl describe rs/<new-replicaset-name> # new ReplicaSet์˜ Pod ์ด๋ฒคํŠธ 
kubectl port-forward deployment/my-app 8080:8080 # ํฌํŠธ ํฌ์›Œ๋”ฉ 
curl localhost:8080 # ์š”์ฒญ  -> 2.0๋ฒ„์ „์œผ๋กœ ์ž˜ ํ˜ธ์ถœ๋˜๋Š”๊ฒƒ์„ํ™•์ธ 
kubectl delete all -l app=my-app # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์‚ญ์ œ 

Deployment Recreate ์ „๋žต ์˜ˆ์‹œ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: Recreate # Recreate ์ „๋žต 
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"
kubectl get rs -w  # ReplicaSet์ด ์ƒ์„ฑํ•œ Pod ์ƒํƒœ ๋ณ€ํ™” ํ™•์ธ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch7/recreate.yaml # ๋ฐฐํฌ 

# recrea.yaml ํŒŒ์ผ์—์„œ image: yoonjeong/my-app:2.0 ์œผ๋กœ ๋ณ€๊ฒฝ 

kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch7/recreate.yaml # ์žฌ๋ฐฐํฌ 
kubectl delete all -l app=my-app

Deployment RollingUpdate ์ „๋žต ์˜ˆ์‹œ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 5 
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
      maxSurge: 1 
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app 
        image: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"
kubectl get rs -w  # ReplicaSet์ด ์ƒ์„ฑํ•œ Pod ์ƒํƒœ ๋ณ€ํ™” ํ™•์ธ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch8/rollingupdate.yaml # ๋ฐฐํฌ 

# rollingupdate.yaml ํŒŒ์ผ์—์„œ image: yoonjeong/my-app:2.0 ์œผ๋กœ ๋ณ€๊ฒฝ 

kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch8/rollingupdate.yaml # ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜
kubectl delete all -l app=my-app

Deployment Revision ๋ชฉ๋ก ๊ฐ„๋‹จ ์กฐํšŒ

kubectl rollout history deployment/my-app

Deployment Revision ์ƒ์„ธ ์กฐํšŒ

kubectl rollout history deployment/my-app --revision=2

Deployment ๋กค๋ฐฑ

kubectl rollout undo deployment/my-app # ์ง์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ 
kubectl rollout undo deployment/my-app --to-revision=1 # 1 ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ 

Deployment ๋กค๋ฐฑ ์‚ฌ์œ  ๋‚จ๊ธฐ๊ธฐ

kubectl annotate deployment/my-app kubernetes.io/change-cause="image reverted to 1.0 for a few bugs"

Deployment ๋กค๋ฐฑ ์˜ˆ์‹œ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
  annotations:
    "kubernetes.io/change-cause": "initial image 1.0"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: my-app
        project: fastcampus
        env: production
    spec:
      containers:
      - name: my-app
        image: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch9/rollback.yaml # ๋ฐฐํฌ 

kubectl set image deployment/my-app my-app=yoonjeong/my-app:2.0 # ๋ฒ„์ „ ๋ณ€๊ฒฝ 

kubectl get deployment my-app -o wide # ๋ฒ„์ „ ํ™•์ธ 

kubectl annotate deployment/my-app kubernetes.io/change-cause="image updated to 2.0" # ๋ฒ„์ „ ๋ณ€๊ฒฝ ์‚ฌ์œ  ๋‚จ๊ธฐ๊ธฐ 

kubectl rollout history deployment/my-app # ๋ฒ„์ „ ๋ฐ ์‚ฌ์œ  ํ™•์ธ 

kubectl rollout undo deployment/my-app # ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ 

kubectl annotate deployment/my-app kubernetes.io/change-cause="rollbacked to 1.0 for a few bugs" # ๋กค๋ฐฑ ์‚ฌ์œ  ๋‚จ๊ธฐ๊ธฐ 

kubectl rollout history deployment/my-app # ๋ฒ„์ „ ๋ฐ ์‚ฌ์œ  ํ™•์ธ 

kubectl delete all -l app=my-app

8. service

Pod ํ•œ๊ณ„์  - ํด๋ผ์ด์–ธํŠธ Pod IP ๋ชฉ๋ก์„ ์ตœ์‹  ์ƒํƒœ๋กœ ๊ด€๋ฆฌ ํ•„์š”

  • ๋ณ€๊ฒฝ์ด ์žฆ์€ Pod IP ๋ชฉ๋ก์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํŒŒ๋“œ ํด๋ผ์ด์–ธํŠธ
  • ํŒŒ๋“œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ตœ์‹  ์ƒํƒœ์˜ ๋ชจ๋“  Pod IP๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•จ
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • Pod IP๋กœ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์˜ Pod์— ์ ‘๊ทผํ–ˆ๋‹ค๋ฉด ์š”์ฒญ์€ ์‹คํŒจํ•œ๋‹ค.

Pod ํ•œ๊ณ„์  - Pod๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

  • Pod IP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.
  • kubectl port-forward ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Service ๊ฐœ๋… - Pod ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋‹จ์ผ ์—”๋“œ ํฌ์ธํŠธ ์ƒ์„ฑ

  • ์œ„์—์„œ ์„ค๋ช…ํ•œ Pod์˜ ํ•œ๊ณ„์ ๋“ค์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์˜ค๋ธŒ์ ํŠธ
  • Service๋Š” ํŒŒ๋“œ ์ถ”์ƒํ™”์ด๋‹ค == ํŒŒ๋“œ๋“ค์˜ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ + ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ
  • ํŒŒ๋“œ ํด๋ผ์ด์–ธํŠธ๋Š” Service IP:Port๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ๋“œ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Service๋Š” Selector์— ์˜ํ•ด ์„ ํƒ๋œ ํŒŒ๋“œ ์ง‘ํ•ฉ ์ค‘ ์ž„์˜์˜ ํŒŒ๋“œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•œ๋‹ค.

Service ์˜ค๋ธŒ์ ํŠธ ์„ ์–ธ

apiVersion: v1
kind: Service
metadata:
  name: order
  namespace: snackbar
  labels:
    app: order
spec:
  selector:
    app: order # ์œ ์ž…๋œ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•  ํŒŒ๋“œ ์ง‘ํ•ฉ 
  ports:
    - port: 80 # ๋…ธ์ถœํ•  ์„œ๋น„์Šค ํฌํŠธ 
      targetPort: 8080 # ์„œ๋น„์Šค ํฌํŠธ์™€ ์—ฐ๊ฒฐํ•  ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ, containerPort์™€ ์ผ์น˜ํ•ด์•ผ ๋จ 

Service์™€ Endpoints - ์ตœ์‹  Pod IP ๋ชฉ๋ก ๊ด€๋ฆฌ

  • EndPoints: Service๊ฐ€ ๋…ธ์ถœํ•˜๋Š” Pod IP์™€ Port์˜ ์ตœ์‹  ๋ชฉ๋ก
  • Service ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Service์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ Endpoints ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋จ
  • Service์— ์„ ์–ธํ•œ Selector์˜ ํŒŒ๋“œ ์ง‘ํ•ฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค Endpoints ๋ชฉ๋ก๋„ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค
  • Service๊ฐ€ ๋ฐ›์€ ํŠธ๋ž˜ํ”ฝ์„ Endpoints ์ค‘์— ํ•˜๋‚˜๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค.

Service์™€ ํ†ต์‹ ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  1. ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์„ค์ •๋œ Service IP์™€ Port๋ฅผ ์ด์šฉ
  2. Service ์ด๋ฆ„์œผ๋กœ DNS ์„œ๋ฒ„์— ์งˆ์˜ํ•˜์—ฌ Service IP๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•

Service์™€์˜ ํ†ต์‹  - ํ™˜๊ฒฝ๋ณ€์ˆ˜

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋ชจ๋“  Service IP์™€ Port๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
  • OOO_SERVICE_HOST, OOO_SERVICE_PORT
  • ์ฃผ์˜1) Service๋ฅผ ํด๋ผ์ด์–ธํŠธ Pod๋ณด๋‹ค ๋จผ์ € ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค
  • ์ฃผ์˜2) ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” Service ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

Service์™€์˜ ํ†ต์‹  - DNS

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ DNS ์„œ๋ฒ„ IP ์ฃผ์†Œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ /etc/resolve.conf ํŒŒ์ผ์— ๋“ฑ๋กํ•œ๋‹ค
  • Service ์ด๋ฆ„์œผ๋กœ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๋ฉด DNS ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ Service IP๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

Service์˜ ์ข…๋ฅ˜

  • ClusterIP, NodePort, LoadBalancer ํƒ€์ž…์ด ์žˆ๋‹ค.
  • Service ํƒ€์ž…์— ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Service์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„๋‹ค.
  • LoadBalancer ํƒ€์ž…์€ NodePort, ClusterIP ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํฌํ•จํ•œ๋‹ค.

Service - ClusterIP

  • ๊ธฐ๋ณธ Service ํƒ€์ž…
  • Pod IP ์ฒ˜๋Ÿผ ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” IP๋ฅผ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค
  • Server IP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ํ†ต์‹ ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๊ตณ์ด ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

Service - NodePort

  • ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” External IP๊ฐ€ ์•„๋‹ˆ๋ผ NodePort๋ฅผ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค
  • ํ• ๋‹น๋ฐ›์€ ๋…ธ๋“œ Port๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ํŠธ๋ž˜ํ”ฝ์„ ํŒŒ๋“œ ์ง‘ํ•ฉ์œผ๋กœ ํฌ์›Œ๋”ฉํ•œ๋‹ค (ํŠน์ • ๋…ธ๋“œ์˜ IP๋กœ ํ†ต์‹ ์„ ํ•ด์•ผ๋จ)
  • ํ•œ๊ณ„์ 
    • ์ง€์ •ํ•œ ๋…ธ๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ผ๋ฉด -> ์•ž๋‹จ์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฑด๊ฐ•ํ•œ ์ƒํƒœ์˜ ๋…ธ๋“œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์•ผ๋จ.

Service - LoadBalancer

  • ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์˜ Load Balancer๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ  External IP๋ฅผ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค
  • ํด๋ผ์ด์–ธํŠธ๋Š” Load Balancer IP๋ฅผ ํ†ตํ•ด ํŠน์ • ์„œ๋น„์Šค๋กœ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ํฌ์›Œ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Load Balancer์—์„œ Node Port๋ฅผ ํ†ตํ•ด์„œ ์„œ๋น„์Šค๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

Service๋ฅผ ์ด์šฉํ•œ Pod ๋…ธ์ถœ

  • Service ๋ฆฌ์†Œ์Šค๋Š” ํŒŒ๋“œ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณต
  • ClusterIP Service๋ฅผ ์ด์šฉํ•ด์„œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ Pod ๊ฐ„ ํ†ต์‹ ์— ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
  • NodePort/LoadBalancer Service๋ฅผ ์ด์šฉํ•ด์„œ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ Pod๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค
  • Pod ์•ˆ์—์„œ๋Š” Service ์ด๋ฆ„๊ณผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์„ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ Pod์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” Pod) :
    • ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” Pod) :.

๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์กฐํšŒ

kubectl get all -n <namespace-name>

Endpoints์˜ ๋ฆฌ์†Œ์Šค ์กฐํšŒ

  • ๋งŒ์•ฝ Service IP๋กœ ์š”์ฒญ์— ์‹คํŒจํ•œ๋‹ค๋ฉด, Service EndPoints ๊ตฌ์„ฑ์„ ํ™•์ธํ•œ๋‹ค.
kubectl get endpoints -n <namespace-name>

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ ๋ช…๋ น์–ด

kubectl create namespace <namespace-name>

๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ Service ์ƒ์„ธ ์กฐํšŒ

kubectl get svc <service-name> -o wide -n <namespace>

Service ClusterIP ์กฐํšŒ

kubectl get svc <service-name> -o jsonpath="{.spec.clusterIP}" -n <namespace>

ClusterIP Service ๋ฐฐํฌ ์˜ˆ์‹œ

kubectl create namespace snackbar # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์กฐํšŒ 
kubectl get svc order -o wide -n snackbar # service ์ƒ์„ธ ์กฐํšŒ 
kubectl get svc payment -o wide -n snackbar # service ์ƒ์„ธ ์กฐํšŒ 
kubectl get endpoints -n snackbar # endpoints ์กฐํšŒ 
kubectl get pod -o wide -n snackbar # pod ์กฐํšŒ 
kubectl get svc order -o json -n snackbar # clusterIP ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ „์ฒด ์กฐํšŒ 
kubectl get svc order -o jsonpath="{.spec.clusterIP}" -n snackbar # clusterIP ์กฐํšŒ -> "10.80.9.122"

curl 10.80.9.122 # ์—ฐ๊ฒฐ์•ˆ๋จ -> clusterIP์ด๋ฏ€๋กœ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ 

kubectl port-forward service/order -n snackbar 8080:80 # ํฌํŠธํฌ์›Œ๋”ฉ

Pod ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ช…๋ น์–ด ์ „๋‹ฌ

kubectl exec <pod-name> -n <namespace> -- <cmd>

Pod ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ

kubectl exec <pod-name> -n <namespace> -- env | grep <pattern>

ClusterIP Service ๋ผ๋ฆฌ ํ†ต์‹  ์˜ˆ์‹œ - ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™œ์šฉ

kubectl create namespace snackbar # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์กฐํšŒ 

kubectl get pod -n snackbar # order pod ์กฐํšŒ

# order ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ 
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- env | grep PAYMENT

# payment ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ
kubectl exec payment-646db46775-5fc9k -n snackbar -- env | grep ORDER

# snackbar ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” order ์ปจํ…Œ์ด๋„ˆ ์‰˜ ์ ‘์† 
kubectl exec -it order-5d45bf5796-8qr4n -n snackbar -- sh

# payment Service ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด order -> payment ํŒŒ๋“œ ์š”์ฒญ/์‘๋‹ต ํ™•์ธ 
curl $PAYMENT_SERVICE_HOST:$PAYMENT_SERVICE_PORT

for i in `seq 1 10`; do curl -s $PAYMENT_SERVICE_HOST:$PAYMENT_SERVICE_PORT; done # payment ์„œ๋น„์Šค์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํ™•์ธ 

ClusterIP Service ๋ผ๋ฆฌ ํ†ต์‹  ์˜ˆ์‹œ - DNS ์„œ๋ฒ„ ํ™œ์šฉ

  • order pod ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์„ค์ • ๋˜์–ด ์žˆ๋Š” nameserver๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ์š”์ฒญ์„ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ, DNS ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์„œ๋น„์Šค IP๋ฅผ ์กฐํšŒํ•ด์˜ค๊ณ  ์‹ค์ œ๋กœ payment pod๋กœ ์š”์ฒญ์ด ๋œ๋‹ค.
  • order pod ์—์„œ payment pod๋กœ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ง„ํ–‰ ๋œ๋‹ค.
    1. order ์ปจํ…Œ์ด๋„ˆ์˜ /etc/hosts, /etc/resolv.conf ํŒŒ์ผ ํ™•์ธ
    2. Service์ด๋ฆ„ 'payment'๋กœ Payment ํ˜ธ์ถœ, ์‘๋‹ต ํ™•์ธ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„ ๊ทœ์น™ - FQDN(Fully Qualified Domain Name)
    • FQDN == payment.snackbar.svc.cluster.local == ..svc.cluster.local
kubectl create namespace snackbar # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์กฐํšŒ 

kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s payment:80 # ์‘๋‹ต ์„ฑ๊ณต ํ™•์ธ. 


# ์—ฌ๊ธฐ์—๋Š” payment ๋„๋ฉ”์ธ์ด ๋“ฑ๋ก๋˜์ง€ ์•Š๋‹ค๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ dns๋กœ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- cat /etc/hosts 

# kubernetes์˜ dns ์„œ๋ฒ„ ์กฐํšŒ 
kubectl get all -n kube-system | grep kube-dns # ClusterIP: 10.80.0.10

# nameserver ํ™•์ธ
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- cat /etc/resolv.conf # nameserver 10.80.0.10 (์ฆ‰ kubernetes dns๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์Œ)

kubectl exec -it order-5d45bf5796-8qr4n -n snackbar -- sh # order pod ์ ‘์† 

for i in `seq 1 10`; do curl -s payment:80; done # ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ํ™•์ธ 

curl payment.snackbar.svc.cluster.local # payment ์‘๋‹ต ํ™•์ธ 

curl payment.snackbar # payment ์‘๋‹ต ํ™•์ธ 

curl payment # payment ์‘๋‹ต ํ™•์ธ 

project=snackbar ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ฆฌ์†Œ์Šค ์กฐํšŒ

kubectl get all -l project=snackbar --all-namespaces

proejct=snackbar ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ Service Endpoints ์กฐํšŒ

kubectl get endpoints -l project=snackbar --all-namespaces

๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ project=snackbar ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ

kubectl delete all -l project=snackbar --all-namespaces

ClusterIP Service - ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ์„œ๋น„์Šค ํ˜ธ์ถœ

  1. fancy-snackbar ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— delivery Service์™€ Deployment ๋ฐฐํฌ
  2. order ์ปจํ…Œ์ด๋„ˆ์—์„œ delivery ์„œ๋น„์Šค์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์š”์ฒญ ์‹คํ–‰
  3. order ์ปจํ…Œ์ด๋„ˆ์—์„œ delivery ์„œ๋น„์Šค ClusterIP๋กœ ์š”์ฒญ ์‹คํ–‰
  4. order ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl create namespace snackbar # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์กฐํšŒ 

kubectl create namespace fancy-snackbar # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch10/service2.yaml # ๋ฐฐํฌ


kubectl get all -l project=snackbar --all-namespaces # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์กฐํšŒ 
kubectl get endpoints -l project=snackbar --all-namespaces # ์—”๋“œํฌ์ธํŠธ ์กฐํšŒ 


kubectl get pod -n snackbar # ํŒŒ๋“œ ์กฐํšŒ 
kubectl get svc -n fancy-snackbar # cluster-ip ์กฐํšŒ -> 10.80.0.32

kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s 10.80.0.32 # delivery pod ์š”์ฒญ ์„ฑ๊ณต
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s delivery.fancy-snackbar # delivery pod ์š”์ฒญ ์„ฑ๊ณต
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s delivery # delivery pod ์š”์ฒญ ์‹คํŒจ. (๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ์‹คํŒจ)


kubectl exec order-5d45bf5796-8qr4n -n snackbar -- env | grep delivery # ์กฐํšŒ์•ˆ๋จ, delivery๋Š” ๋‚˜์ค‘์— ๋ฐฐํฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ €์ƒ์„ฑ๋œ order์—๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

kubectl delete all -l project=snackbar --all-namespaces # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์‚ญ์ œ 

Service ClusterIP์˜ ํŠน์ง•

  • Service๋Š” ํŒŒ๋“œ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ƒ์„ฑ
  • Service๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ClusterIP๊ฐ€ ํ• ๋‹น๋œ๋‹ค
  • ClusterIP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘์† ๊ฐ€๋Šฅ

Service ClusterIP๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ Pod์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

  • ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ๋“œ๋ฅผ ์œ„ํ•ด ๋ฐฐํฌ๋œ Service ์ด๋ฆ„์„ ์•Œ์•„๋‚ธ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ~~~_SERVICE_HOST ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ Service IP๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ, Pod ๋ณด๋‹ค ๋Šฆ๊ฒŒ ์ƒ์„ฑํ•œ Service ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค
  • ๋‹จ, ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ Service๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ServiceIP ๋Œ€์‹  Service ์ด๋ฆ„์„ ๋„๋ฉ”์ธ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ Service Port๋Š” ~~~_SERVICE_PORT ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.

์™ธ๋ถ€์—์„œ NodePort๋กœ ๋ฐฉํ™”๋ฒฝ ํ•ด์ œ ์„ค์ •

gcloud compute firewall-rules create <firewall-name> --allow tcp:31593 # ์ถ”๊ฐ€ 

gcloud compute firewall-rules delete <firewall-name> # ์‚ญ์ œ 

gcloud compute firewall-rules list # ์ •์ฑ… ์กฐํšŒ

Service NodePort ํƒ€์ž… ๋ฐฐํฌ ์˜ˆ์‹œ

kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch11/se
rvice.yaml  # ๋ฐฐํฌ 

kubectl get svc -l project=snackbar -n snackbar -o wide # service type ์กฐํšŒ 

curl 10.80.10.210:31433 # ์š”์ฒญ ์‹คํŒจ. 

gcloud compute firewall-rules create order --allow tcp:31433 # ๋ฐฉํ™”๋ฒฝ ์ถ”๊ฐ€ 

kubectl get nodes -o wide # ๋…ธ๋“œ External IP ์กฐํšŒ -> ์กฐํšŒํ•œ ๋…ธ๋“œ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ IP๋ฅผ export

export ORDER=34.71.118.169:31433 # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ถ”๊ฐ€ 

echo $ORDER # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ 

curl http://$ORDER/menus # ์š”์ฒญ ์„ฑ๊ณต 

# ์ฃผ๋ฌธ -> ์˜์ˆ˜์ฆ ์ถœ๋ ฅ  
curl --request POST http://$ORDER/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
    "Pizza": 1,
    "Coke": 1,
    "Burger": 0,
    "Juice": 0
}' 

gcloud compute firewall-rules delete order # ๋ฐฉํ™”๋ฒฝ ์‚ญ์ œ 

kubectl delete all -l project=snackbar -n snackbar # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ข…๋ฃŒ 

Service NodePort ํŠน์ง•

  • ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ๋…ธ๋“œ์— ํฌํŠธ ํ• ๋‹น์€ Service๋ฅผ NodePort ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ ํ–ˆ์„ ๋•Œ ์ผ์–ด๋‚œ๋‹ค
  • ๋…ธ๋“œ์˜ External IP์™€ ์„œ๋น„์Šค NodePort๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋น„์Šค ClusterIP๋„ ์—ฌ์ „ํžˆ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Service NodePort๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ Pod์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

  • ์„œ๋น„์Šค๋ฅผ NodePort๋กœ ์ƒ์„ฑํ•œ๋‹ค
  • NodePort์— ๋Œ€ํ•œ ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ ํ—ˆ์šฉ ์ •์ฑ…์„ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์— ์„ค์ •ํ•œ๋‹ค
  • ๋…ธ๋“œ IP์™€ NodePort๋ฅผ ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” ํŒŒ๋“œ ์ง‘ํ•ฉ์— ์š”์ฒญ์„ ์‹คํ–‰ํ•œ๋‹ค
  • ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๋‹ค๋ฅธ ํŒŒ๋“œ์˜ ์‘๋‹ต์ด ํ•„์š”ํ•˜๋ฉด ๊ทธ ํŒŒ๋“œ์˜ ์„œ๋น„์Šค ์ด๋ฆ„๊ณผ ์„œ๋น„์Šค ํฌํŠธ๋ฅผ ์ด์šฉํ•œ๋‹ค
  • ์„œ๋น„์Šค ์ด๋ฆ„์„ ๋„๋ฉ”์ธ ๋„ค์ž„์œผ๋กœ DNS ์„œ๋ฒ„์— IP๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

LoadBalancer ํƒ€์ž…์˜ Service๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • NodePort๋ฅผ ์ด์šฉํ•ด์„œ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ,
  • ํŠน์ • ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์„œ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ง€์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋  ํ…๋ฐ,
  • ๊ทธ ์„ ํƒํ•œ ๋…ธ๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ์—๋Š” ํ†ต์‹ ์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•ž๋‹จ์—์„œ LoadBalancer ํƒ€์ž…์˜ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • NodePort์™€์˜ ๋‹ค๋ฅธ์ ์€ Order ์„œ๋น„์Šค์˜ ํƒ€์ž…์„ LoadBalancer๋กœ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

Service LoadBalancer ํƒ€์ž… ๋ฐฐํฌ ์˜ˆ์‹œ

kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch12/service.yaml  # ๋ฐฐํฌ 

kubectl get svc -l project=snackbar -n snackbar -
o wide # ๋ฆฌ์†Œ์Šค ์กฐํšŒ 

export ORDER=35.225.59.229 # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

curl http://$ORDER/menus # ๋ฉ”๋‰ด ์กฐํšŒ 

# ์ฃผ๋ฌธ ์š”์ฒญ 
curl --request POST http://$ORDER/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
    "Pizza": 1,
    "Burger": 2,
    "Coke": 0,
    "Juice": 0
}' 

kubectl delete all -l project=snackbar -n snackbar # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ 

Service LoadBalancer ํŠน์ง•

  • LoadBalancer ํƒ€์ž…์˜ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์‹คํ–‰ ๋œ๋‹ค
  • ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ IP๊ฐ€ Service์˜ External IP๋กœ ํ• ๋‹น ๋œ๋‹ค
  • Service์˜ EXternal IP์ด์ž ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP๋กœ ์™ธ๋ถ€์—์„œ ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์„œ๋น„์Šค ClusterIP, NodePort์˜ ๊ธฐ๋Šฅ๋„ ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Service LoadBalancer๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ Pod์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

  • ์„œ๋น„์Šค๋ฅผ LoadBalancer๋กœ ์ƒ์„ฑํ•œ๋‹ค
  • ์„œ๋น„์Šค์˜ External IP๋ฅผ ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” ํŒŒ๋“œ ์ง‘ํ•ฉ์— ์š”์ฒญ์„ ์‹คํ–‰ํ•œ๋‹ค
  • ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๋‹ค๋ฅธ ํŒŒ๋“œ์˜ ์‘๋‹ต์ด ํ•„์š”ํ•˜๋ฉด ๊ทธ ํŒŒ๋“œ์˜ ์„œ๋น„์Šค ์ด๋ฆ„๊ณผ ์„œ๋น„์Šค ํฌํŠธ๋ฅผ ์ด์šฉํ•œ๋‹ค
  • ์„œ๋น„์Šค ์ด๋ฆ„์„ ๋„๋ฉ”์ธ ๋„ค์ž„์œผ๋กœ DNS ์„œ๋ฒ„์—๊ฒŒ IP๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

9. ingress์™€ ingress controller

ingress์˜ ํ•„์š”์„ฑ

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์ˆ˜๋งŽ์€ LoadBalancer์˜ IP๋ฅผ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค.

ingress๋ž€

  • Service ์ถ”์ƒํ™”
  • ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค
  • ํŠธ๋ž˜ํ”ฝ์„ Service๋กœ ๋ถ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์šฐํŒ… ๊ทœ์น™ ๋ชจ์Œ
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜ธ์ถœํ•œ Host ํ—ค๋”๋‚˜ path๋ฅผ ํ†ตํ•ด Service๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ํฌ์›Œ๋”ฉํ•œ๋‹ค

ingress controller๋ž€

  • Ingress ๊ทœ์น™์— ๋”ฐ๋ผ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ œ๊ณต์ž๊ฐ€ ๊ตฌํ˜„ํ•œ Ingress Controller๋งˆ๋‹ค ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅด๋‹ค
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ง€์› Ingress Controller: https://bit.ly/3GkpoZq
  • Ingress ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด GKE๊ฐ€ Google Cloud load balancer๋ฅผ Ingress Controller๋กœ ์ƒ์„ฑํ•œ๋‹ค.

Ingress ์˜ค๋ธŒ์ ํŠธ ์„ ์–ธ - ๊ธฐ๋ณธ

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: 
  name: snackbar
  namespace: snackbar
  labels: 
    project: snackbar

Ingress ์˜ค๋ธŒ์ ํŠธ ์„ ์–ธ - ์—ฌ๋Ÿฌ Host๋กœ ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌ

# Host: order.fast-snackbar.com ์„ Service์— ๋งคํ•‘ 
spec:
  rules:
  - host: order.fast-snackbar.com # Host ํ—ค๋”๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์š”์ฒญ๋งŒ ๋งค์นญ 
    http:
      paths:
        - pathType: Prefix # /๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋งค์นญ 
          path: /
          backend: # order ์„œ๋น„์Šค์˜ 80 ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉ 
            service:
              name: order
              port:
                number: 80
# Host: payment.fast-snackbar.com ์„ Service์— ๋งคํ•‘
spec:
  rules:
  - host: payment.fast-snackbar.com # Host ํ—ค๋”๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์š”์ฒญ๋งŒ ๋งค์นญ 
    http:
      paths:
        - pathType: Prefix # /๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋งค์นญ 
          path: / 
          backend: # payment ์„œ๋น„์Šค์˜ 80 ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉ 
            service:
              name: payment
              port:
                number: 80

Ingress ์˜ค๋ธŒ์ ํŠธ ์„ ์–ธ - URL patfh ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌ

# ํ•˜๋‚˜์˜ host์— URL Path๋ณ„๋กœ ์„œ๋น„์Šค ๋งคํ•‘ 
rules:
- http:
  path:
  - pathType: Prefix
    path: /order # /order๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ์„ ์‹คํ–‰ 
    backend: # order ์„œ๋น„์Šค์˜ 80ํฌํŠธ๋กœ ์—ฐ๊ฒฐ 
      service:
        name: order
        port:
          number: 80
  - pathType: Prefix
    path: /payment # /payment๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ์„ ์‹คํ–‰
    backend: # payment ์„œ๋น„์Šค์˜ 80ํฌํŠธ๋กœ ์—ฐ๊ฒฐ 
      service:
        name: payment
        port:
          number: 80

Ingress ์˜ค๋ธŒ์ ํŠธ ์„ ์–ธ - ๋งค์น˜๋˜์ง€ ์•Š์€ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ

# defaultBackend ์„ค์ • 
spec:
  defaultBackend: # defaultBackend๋Š” Ingress์— ์ •์˜๋˜์ง€ ์•Š๋Š” ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์ฒ˜๋ฆฌํ•œ๋‹ค. 
    service:
      name: order
      port:
        number: 80 
  • Ingress์— ์ •์˜๋˜์ง€ ์•Š์€ ์š”์ฒญ์ด๋ž€
    • ์ •์˜ํ•˜์ง€ ์•Š์€ host ํ—ค๋” ์š”์ฒญ์„ ๋ฐ›์€ ๊ฒฝ์šฐ
    • path ํ‘œํ˜„์‹๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

Ingress Controller๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ณผ์ •

image

  1. Ingress๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•ด์„œ Ingress Controller๋กœ ๋งŒ๋“ฌ
  2. Ingress Controller๊ฐ€ ๋“ค์–ด์˜จ ์š”์ฒญ์˜ host ํ—ค๋” ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ํŠธ๋ž˜ํ”ฝ์„ ๋‚ด๋ถ€์— ์žˆ๋Š” ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค.
  3. ๋ผ์šฐํŒ…๊ทœ์น™์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ Ingress๋ฅผ ๋ณด๊ณ  ํŒ๋‹จํ•œ๋‹ค.

Ingress ํŠน์ง•

  • ํด๋ผ์ด์–ธํŠธ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์žˆ๋Š” ์—ฌ๋Ÿฌ Service๋ฅผ ํ•˜๋‚˜์˜ IP๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์กด์žฌํ•˜๋Š” Service ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์„ ์–ธํ•œ๋‹ค
  • Ingress Controller๊ฐ€ ๋ฐ›์€ HTTP Request์™€ Host ํ—ค๋” ์ •๋ณด๋‚˜ URL Path์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Ingress IP์™€ Port ํ™•์ธ

kubectl get ingress snackbar -n snackbar

์ธ๊ทธ๋ ˆ์Šค ์กฐํšŒ

kubectl get ingress <ingress-name> -n <namespace>

์ธ๊ทธ๋ ˆ์ด์Šค์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP ์กฐํšŒ

kubectl get ingress <ingress-name> -n <namespace> \
-o jsonpath="{.status.loadBalancer.ingress[0].ip}"

Multiple Host ๋ฐฉ์‹์œผ๋กœ Ingress๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ๋ฐฐํฌ

image

# delivery, home ๋“ฑ ์ „๋ถ€ ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch13/backend 

# ingress ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch13/ingress-multiple-hosts.yaml 

# endpoint ์กฐํšŒ 
kubectl get endpoints -n snackbar

# ingress ์กฐํšŒ (IP ๋“ฑ )
kubectl get ingress snackbar -n snackbar

# Ingress IP ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
export INGRESS_IP=$(kubectl get ingress snackbar -n snackbar -o jsonpath="{.status.loadBalancer.ingress[0].ip}")

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ 
echo $INGRESS_IP

# ์ฃผ๋ฌธ ํ™ˆ ์š”์ฒญ 
curl -H "Host: order.fast-snackbar.com" --request GET $INGRESS_IP

# ์ฃผ๋ฌธ ๋ฉ”๋‰ด ์กฐํšŒ 
curl -H "Host: order.fast-snackbar.com" --request GET $INGRESS_IP/menus

# ์ฃผ๋ฌธ ์š”์ฒญ
curl -H "Host: order.fast-snackbar.com" --request POST $INGRESS_IP/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
    "Pizza": 1,
    "Burger": 2,
    "Coke": 0,
    "Juice": 0
}'



# ๊ฒฐ์ œ ํ™ˆ
curl -H "Host: payment.fast-snackbar.com" --request GET $INGRESS_IP

# ๊ฒฐ์ œ ์ •๋ณด ์กฐํšŒ
curl -H "Host: payment.fast-snackbar.com" -s --request POST $INGRESS_IP/receipt \
--header 'Content-Type: application/json' \
--data-raw '{
    "Pizza": 1,
    "Burger": 2,
    "Coke": 0,
    "Juice": 0
}' | json_pp



# ๋ฐฐ๋‹ฌ ํ™ˆ
curl -H "Host: delivery.fast-snackbar.com" $INGRESS_IP

# ๋””ํดํŠธ ๋ฐฑ์—”๋“œ - ์„ ์–ธํ•˜์ง€ ์•Š์€ Host ํ—ค๋”์™€ Path๋กœ ์š”์ฒญ ์‹คํ–‰ 
curl -H "Host: wrong.fast-snackbar.com" $INGRESS_IP
curl -H "Host: wrong.fast-snackbar.com" $INGRESS_IP/ab

# snackbar ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— project=snackbar ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ
kubectl delete all -l project=snackbar -n snackbar

Single Host ๋ฐฉ์‹์œผ๋กœ Ingress๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ๋ฐฐํฌ

image

# delivery, home ๋“ฑ ์ „๋ถ€ ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch13/backend 

# ingress ๋ฐฐํฌ single-hosts๋Š” host๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์Œ.
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch13/ingress-single-hosts.yaml 

# ์ฃผ๋ฌธ ํ™ˆ
curl --request GET $INGRESS_IP/order

# ์ฃผ๋ฌธ ๋ฉ”๋‰ด ์กฐํšŒ 
curl --request GET $INGRESS_IP/order/menus

# ์ฃผ๋ฌธ ์š”์ฒญ
curl --request POST $INGRESS_IP/order/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
    "Pizza": 1,
    "Burger": 2,
    "Coke": 0,
    "Juice": 0
}'

# ๊ฒฐ์ œ ํ™ˆ
curl --request GET $INGRESS_IP/payment

# ๊ฒฐ์ œ ์ •๋ณด ์กฐํšŒ
curl -s --request POST $INGRESS_IP/payment/receipt \
--header 'Content-Type: application/json' \
--data-raw '{
    "Pizza": 1,
    "Burger": 2,
    "Coke": 0,
    "Juice": 0
}' | json_pp

# ์„ ์–ธํ•˜์ง€ ์•Š์€ Path๋กœ ์š”์ฒญ ์‹คํ–‰ 
curl $INGRESS_IP/not-found

# ๋ฉ”๋‰ด์กฐํšŒ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํ™•์ธ
for i in {1..10};
do curl $INGRESS_IP/order/menus;
done

# snackbar ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— project=snackbar ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ
kubectl delete all -l project=snackbar -n snackbar

10. liveness probe

libenessProbe ํ•„์š”์„ฑ

  • ํŒŒ๋“œ๋Š” ์ƒ์„ฑํ–ˆ์ง€๋งŒ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋– ํ•œ ์ด์œ ๋กœ ์‹คํŒจํ•˜๊ณ  ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์„ ๋•Œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค kubelet์ด ์•Œ์•„์•ผ ํ•˜๋Š” ์ •๋ณด

  • ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•(Probe)
  • ์–ธ์ œ ์žฌ์‹œ์ž‘ ํ•  ๊ฒƒ์ธ์ง€ ๊ธฐ์ค€

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค kubelet์ด ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ณผ์ •

  1. kubelet์ด pod๊ฐ€ ๋ฐฐํฌ๋˜๊ณ , ๋„์ปค์— ์˜ํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ด ๋˜๋ฉด, ์ฃผ๊ธฐ์ ์œผ๋กœ endpoint๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ƒ์‚ฌ๋ฅผ ์ฒดํฌํ•œ๋‹ค.
  2. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‘๋‹ต์„ ์ฃผ๋Š”๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์ž„๊ณ„์น˜๋ฅผ ๋„˜์–ด์„  ์‹คํŒจ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŒŒ๋“œ ๋‚ด์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒ ์‹œํ‚จ๋‹ค.
  3. ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

ํŒŒ๋“œ์˜ livenessProbe

  • liveness: ์‚ด์•„์žˆ์Œ
  • probe: ์ˆ˜์‚ฌ
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ผ์ • ์ˆ˜์ค€ ์ด์ƒ ์—ฐ์†ํ•ด์„œ ์‹คํŒจํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘.

HttpGet livenessProbe ์„ ์–ธ

  • HTTP status code๋กœ ์‚ด์•„์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•
spec:
  containers:
  - name: myapp
    image: yoonjeong/my-app:1.0
    ports:
    - containerPort: 8080
    livenessProbe:
      httpGet: # probe ์—”๋“œํฌ์ธํŠธ 
        path: /health
        port: 8080
      initialDelaySeconds: 3  # ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ํ›„ ๋ช‡ ์ดˆํ›„์— probe๋ฅผ ์‹œ์ž‘ ํ•  ๊ฒƒ์ธ๊ฐ€ 
      periodSeconds: 1        # probe ์‹คํ–‰ ์ฃผ๊ธฐ 
      successThreshold: 1     # ๋ช‡ ๊ฐœ ์„ฑ๊ณต ์‹œ ์‹คํŒจ ํšŸ์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ์ธ๊ฐ€ 
      failureThreshold: 1     # ์—ฐ์†์œผ๋กœ ๋ช‡ ๋ฒˆ ์‹คํŒจ ํ–ˆ์„ ๋•Œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ ํ•  ๊ฒƒ์ธ๊ฐ€
      timeoutSeconds: 3       # ์‘๋‹ต์„ ๋ช‡ ์ดˆ ๋งŒ์— ๋ฐ›์•„์•ผ ํ•˜๋Š”๊ฐ€ 

HttpGet livenessProbe ๋ฐฐํฌ ์˜ˆ์‹œ

# ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch14/pod-liveness-probe.yaml 

# ๋ชจ๋‹ˆํ„ฐ๋ง -> RESTARTS ํšŸ์ˆ˜๊ฐ€ ๊ณ„์† ๋Š˜์–ด๋‚จ 
kubectl get pod -w

# Pod ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฌธ์ œ ์›์ธ ํ™•์ธ 
kubectl describe pod/unhealthy

# ์ œ๊ฑฐ 
kubectl delete pod healthy
kubectl delete pod unhealthy

11. readiness probe

readinessProbe ํ•„์š”์„ฑ

  • ํŒŒ๋“œ๋Š” ์ƒ์„ฑํ–ˆ์ง€๋งŒ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์‚ฌ์šฉ

readinessProbe ๋™์ž‘ ๊ณผ์ •

  1. Kubelet์ด ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ๊ณ„์† ์ฒดํฌํ•˜๋ฉด์„œ readinessProbe๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  2. ์‘๋‹ต์œผ๋กœ 500์ด๋‚˜ ํƒ€์ž„์•„์›ƒ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ์ฝ”๋“œ๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
  3. ์–ด๋Š์ •๋„ ์‹คํŒจ ์ž„๊ณ„์น˜๋ฅผ ๋„˜์–ด์„œ๋ฉด pod ๋ชฉ๋ก์œผ๋กœ๋ถ€ํ„ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” pod๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  4. ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จ์ด ์„œ๋ฉด, ๋‹ค์‹œ ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ์— pod๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•œ๋‹ค.

readniessProbe๋ž€

  • readiness: ์ค€๋น„์„ฑ
  • probe: ์ˆ˜์‚ฌ
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ผ์ • ์ˆ˜์ค€ ์ด์ƒ ์—ฐ์†ํ•ด์„œ ์‹คํŒจํ•˜๋ฉด ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ์—์„œ ํŒŒ๋“œ๋ฅผ ์ œ๊ฑฐ

exec readinessProbe ์„ ์–ธ

  • process exit status code๋กœ ์ค€๋น„ ์ƒํƒœ๋ฅผ ํ™•์ธ ํ•˜๋Š” ๋ฐฉ๋ฒ•
spec:
  containers:
    - name: myapp
      image: yoonjeong/my-app:1.0
      ports:
      - containerPort: 8080
      readinessProbe:
        exec:                   # ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด probe
          command:
          - ls
          - /var/ready
      initialDelaySeconds: 3    # ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ํ›„ ๋ช‡ ์ดˆ ํ›„์— probe๋ฅผ ์‹œ์ž‘ํ•  ๊ฒƒ์ธ๊ฐ€ 
      periodSeconds: 1          # probe ์‹คํ–‰ ์ฃผ๊ธฐ 
      successThreshold: 1       # ๋ช‡ ๊ฐœ ์„ฑ๊ณต ์‹œ ์‹คํŒจ ํšŸ์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ์ธ๊ฐ€ 
      failureThreshold: 1       # ์—ฐ์†์œผ๋กœ ๋ช‡ ๋ฒˆ ์‹คํŒจ ํ–ˆ์„ ๋•Œ ํŒŒ๋“œ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ‘œ์‹œํ•  ๊ฒƒ์ธ๊ฐ€
      timeoutSeconds: 3         # ์‘๋‹ต์„ ๋ช‡ ์ดˆ ๋งŒ์— ๋ฐ›์•„์•ผ ํ•˜๋Š”๊ฐ€ 

readinessProbe ๋ฐฐํฌ ์˜ˆ์‹œ

# ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch15/service.yaml 

# ์„œ๋น„์Šค ExternalIP ํ™•์ธ
kubectl get svc -w

# ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜ SERVICE๋กœ ์ €์žฅ
export SERVICE=$(kubectl get svc myapp -o jsonpath="{.status.loadBalancer.ingress[0].ip}")

# healthy, unhealthy ํŒŒ๋“œ ์ƒ์„ฑ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch15/pod-readinessProbe-probe.yaml

# ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ด€์ฐฐ
kubectl get endpoints -w

# ํŒŒ๋“œ READY๋ฅผ ๊ด€์ฐฐ, ๋ช‡ ์ดˆ๊ฐ€ ํ๋ฅธ ๋’ค...
kubectl get pod -o wide -w

# Pod ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฌธ์ œ ์›์ธ ํ™•์ธ
kubectl describe pod/unhealthy

# ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋กœ ์š”์ฒญ ์‹คํ–‰
for i in {0..5};
do curl -v $SERVICE;
done

# unhealthy ํŒŒ๋“œ์— ์ ‘์†ํ•˜์—ฌ /var/ready ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
kubectl exec -it unhealthy -- mkdir /var/ready 

# ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ, ํŒŒ๋“œ READY ์ƒํƒœ๋ฅผ ๊ด€์ฐฐ

# ์„œ๋น„์Šค, ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete all -l app=myapp

readniessProbe, livenessProbe, startupProbe

  • startupProbe๋Š” ์‹œ์ž‘๋  ๋•Œ๋งŒ ์‹คํ–‰๋จ
  • readniessProbe๋Š” ๋งค๋ฒˆ ํ™•์ธ ํ•ด์„œ ์ •์ƒ๋™์ž‘์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž„.
  • Probe๋ชจ๋‘ ํ•ด๋‹น๋˜๋Š” ์ด์•ผ๊ธฐ์ธ๋ฐ
    • pod์•ˆ์— container๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด,
    • container์•ˆ์— Probe์„ค์ •์„ ๋ชจ๋‘ ํ•œ๋‹ค๊ณ  ์น˜๋ฉด
    • ๊ทธ ์ค‘์— ํ•˜๋‚˜๋ผ๋„ Probe์— ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋ฉด pod๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋„์›Œ์ง€์ง€ ์•Š๋Š”๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.

12. config map

config map ์ด๋ž€

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋„์ปค ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์„ค์ • ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” Pod๋กœ๋ถ€ํ„ฐ ์„ค์ •ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
  • ConfigMap ์˜ค๋ธŒ์ ํŠธ๋กœ ์„ค์ • ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ  Pod์™€ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Pod์—์„œ ConfigMap์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Pod์˜ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ configmap์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Pod ๋ณผ๋ฅจ์œผ๋กœ ConfigMap์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ConfigMap ์žฅ์ 

  • pod๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋”๋ผ๋„ ๋™์ผํ•œ Pod ๋ฉ”๋‹ˆํŽ˜์ŠคํŠธ์—๋Š” ๋™์ผํ•œ ConfigMap์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ค์ • ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ConfigMap ์ด๋ฆ„์œผ๋กœ ์„ค์ •๊ฐ’๋“ค์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ค์ •๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์ž์œ ๋กญ๋‹ค

ConfigMap ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑ

  • key=value๋ฅผ ์ง์ ‘ ์ปค๋งจ๋“œ๋ผ์ธ์— ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
kubectl create configmap <name> --from-literal=key=value

kubectl create configmap greeting-config \ 
--from-literal=STUDENT_NAME=๊ฒฝ๋• \
--from-literal=MESSAGE=HI 

Config ์ƒ์„ฑ ํ™•์ธ

kubectl get configmap greetng-config -o yaml

ConfigMap์„ ์ฐธ์กฐํ•ด์„œ ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๊ธฐ

spec:
  containers:
    env:
      - name: STUDENT_NAME
        valueFrom:
          configMapKeyRef:
            name: greeting-config
            key: STUDENT_NAME
      - name: MESSAGE
        valueFrom:
          configMapKeyRef:
            name: greeting-config
            key: MESSAGE
      - name: GREETING
        value: $(MESSAGE)! $(STUDENT_NAME)

์œ„์•„๋ž˜ ๊ฐ™์Œ

spec:
  containers:
    envFrom:
      - configMapRef:
        name: greeting-config
    env:
      - name: GREETING
        value: $(MESSAGE)! $(STUDENT_NAME)

ConfigMap ๋ฆฌํ„ฐ๋Ÿด + env ์˜ˆ์‹œ

# ConfigMap ์ƒ์„ฑ
kubectl create configmap greeting-config --from-literal=STUDENT_NAME=๊ฒฝ๋• --from-literal=MESSAGE=์•ˆ๋…•

# ์ƒ์„ฑํ•œ ConfigMap ํ™•์ธ
kubectl get configmap greeting-config -o yaml

# ํŒŒ๋“œ ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch16/hello-app.yaml 

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ GREETING ์ถœ๋ ฅ ํ™•์ธ - ํฌํŠธํฌ์›Œ๋”ฉ 8080:8080 
kubectl port-forward hello-app 8080:8080

# ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ 
localhost:8080

# ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod hello-app

ConfigMap ๋ฆฌํ„ฐ๋Ÿด + envFrom ์˜ˆ์‹œ

# hello-app ํŒŒ๋“œ ์ƒ์„ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch16/hello-app-envFrom.yaml 

# Pod ํ™•์ธ
kubectl get pod

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ GREETING ์ถœ๋ ฅ ํ™•์ธ - ํฌํŠธํฌ์›Œ๋”ฉ 8080:8080 
kubectl port-forward hello-app 8080:8080

# ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ 
localhost:8080

# ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod hello-app

kubectl delete configmap greeting-config

์„ค์ • ํŒŒ์ผ๋กœ ConfigMap์„ ์ƒ์„ฑ

kubectl create configmap <name> --from-file=ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ 

์˜ˆ์‹œ

# configmap ์ƒ์„ฑ 
kubectl create configmap greeting-config-from-file --from-file=til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch16/configs

# ConfigMap ํ™•์ธ 
kubectl get configmap greeting-config-from-file -o yaml

# hello-app ํŒŒ๋“œ ์ƒ์„ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch16/hello-app-file.yaml 

# Pod ํ™•์ธ
kubectl get pod

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ GREETING ์ถœ๋ ฅ ํ™•์ธ - ํฌํŠธํฌ์›Œ๋”ฉ 8080:8080 
kubectl port-forward hello-app 8080:8080

# ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ 
localhost:8080

# ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod hello-app

kubectl delete configmap greeting-config-from-file

Pod ๋ณผ๋ฅจ์œผ๋กœ ConfigMap ์‚ฌ์šฉ

  • ConfigMap ํƒ€์ž…์˜ ๋ณผ๋ฅจ์„ Pod์— ์„ ์–ธ
  • ConfigMap ์ด๋ฆ„์œผ๋กœ ๋ณผ๋ฅจ์„ ์ฐธ์กฐ
  • Pod์— ์„ ์–ธํ•œ ConfigMap ํƒ€์ž…์˜ ๋ณผ๋ฅจ์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋งˆ์šดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค. image
spec:
  volumes:                             # Pod์—์„œ ์‚ฌ์šฉํ•  ๋ณผ๋ฅจ ๋ชฉ๋ก ์„ ์–ธ                         
  - name: app-config                   # ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐธ์กฐํ•  ๋ณผ๋ฅจ ์ด๋ฆ„ 
    configMap:
      name: nginx-config               # ์ฐธ์กฐํ•  configmap ์ด๋ฆ„ 
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:                     # ์ปจํ…Œ์ด๋„ˆ์—์„œ Pod ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์„ ์–ธ 
    - name: app-config                # ๋งˆ์šดํŒ…ํ•  Pod ๋ณผ๋ฅจ ์ด๋ฆ„ 
      mountPath: /etc/nginx/conf.d    # ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋งˆ์šดํŒ…ํ•  ๊ฒฝ๋กœ 

Pod ๋ณผ๋ฅจ์œผ๋กœ ConfigMap ์‚ฌ์šฉ ์˜ˆ์‹œ

image

# nginx-config๋ผ๋Š” ConfigMap์„ configs ๋””๋ ‰ํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ
kubectl create configmap nginx-config --from-file=til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch17/configs

# nginx-config๋ผ๋Š” ConfigMap ํ™•์ธ 
kubectl get configmap nginx-config -o yaml

# hello-app ํŒŒ๋“œ ์ƒ์„ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch17/web-server.yaml

# server.conf์— ์„ค์ •ํ•œ๋Œ€๋กœ nginx ์›น์„œ๋ฒ„๊ฐ€ /myapp ์š”์ฒญ์„ my-app ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ผ์šฐํŒ… ํ•˜๋Š”์ง€ ํ™•์ธ - ํฌํŠธํฌ์›Œ๋”ฉ 8080:80 
kubectl port-forward web-server 8080:80

# ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ 
localhost:8080/myapp

# nginx ์ ‘์† ๋กœ๊ทธ ํ™•์ธ
kubectl exec web-server -- tail -10f /var/log/nginx/host.access.log

# ์ปจํ…Œ์ด๋„ˆ์˜ ๋งˆ์šดํŒ… ๊ฒฝ๋กœ /etc/nginx/conf.d์—์„œ ConfigMap ํŒŒ์ผ ํ™•์ธ 
kubectl exec web-server -c nginx -- ls /etc/nginx/conf.d
kubectl exec web-server -c nginx -- cat /etc/nginx/conf.d/server.conf

# ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod web-server
kubectl delete pod my-app
kubectl delete svc my-app
kubectl delete configmap nginx-config

13. secret

Secret ๊ฐœ๋…

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • ํŒŒ์ผ์—๋Š” ์„œ๋ฒ„ ์ ‘์†์„ ์œ„ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ, ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ public/private key ๋“ฑ ๋…ธ์ถœ์ด ๋˜๋ฉด ์•ˆ๋˜๋Š” ๋ฏผ๊ฐ ์ •๋ณด๋„ ์žˆ๋‹ค.
  • ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” Secret์ด๋‹ค.
  • ConfigMap์ฒ˜๋Ÿผ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Key/Value ์Œ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ Secret ๊ฐ’์„ Base64๋กœ ์ธ์ฝ”๋”ฉํ•ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์—์„œ Secret ๊ฐ’์„ ์ฝ์„ ๋•Œ์—๋Š” ๋””์ฝ”๋”ฉ๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.
  • Pod ์„ ์–ธ ์‹œ Secret ๋ณผ๋ฅจ์ด๋‚˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ Secret ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋””์ฝ”๋”ฉํ•  ํ•„์š” ์—†๋‹ค.
  • Secret ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ์ด ์–ด๋ ต๋‹ค.

Secret ์‚ฌ์šฉ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€

  1. Pod์˜ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ Secret์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. Pod ๋ณผ๋ฅจ์œผ๋กœ Secret์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰

  1. ์ปจํ…Œ์ด๋„ˆ env.valueFrom.secretMapKeyRef ์‚ฌ์šฉ
  2. ์ปจํ…Œ์ด๋„ˆ envFrom.secretRef ์‚ฌ์šฉ
  3. Secret์„ Pod ๋ณผ๋ฅจ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋งˆ์šดํŠธ

Secret ํƒ€์ž…์˜ ๋ณผ๋ฅจ์„ Pod์— ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•

spec:
  volumes:          # Pod์—์„œ ์‚ฌ์šฉํ•  ๋ณผ๋ฅจ ๋ชฉ๋ก ์„ ์–ธ 
  - name: tls       # ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐธ์กฐํ•  ๋ณผ๋ฅจ ์ด๋ฆ„ 
    secret:
      secretName: tls-config    # ์ฐธ์กฐํ•  Secret ์ด๋ฆ„
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:                 # ์ปจํ…Œ์ด๋„ˆ์—์„œ Pod ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์„ ์–ธ 
    - name: tls                   # ๋งˆ์šดํŒ…ํ•  Pod ๋ณผ๋ฅจ ์ด๋ฆ„
      mountPath: /etc/nginx/tls   # ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋งˆ์šดํŒ…ํ•  ๊ฒฝ๋กœ 

Secret ํ™œ์šฉ ์˜ˆ์‹œ

image

# tls-config๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ genericํƒ€์ž…์˜ secret ์ƒ์„ฑ 
ubectl create secret generic tls-config --from-file=til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch18/secrets

# tls-config ๋ผ๋Š” Secret ์กฐํšŒ 
kubectl get secret tls-config -o yaml

# nginx ์ปจํ…Œ์ด๋„ˆ๊ฐ€ https ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก TLS ์ธ์ฆ์„œ์™€ private key์˜ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•จ - server.conf ์„ค์ •
kubectl create configmap nginx-config --from-file=til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch18/configs

# ๋ฐฐํฌ 
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch18/web-server.yaml

# ์ƒ์„ฑํ•œ ํŒŒ๋“œ ํ™•์ธ
kubectl get pod

# www.fastcampus-kubernetes.com ๋„๋ฉ”์ธ ์š”์ฒญ์„ ์œ„ํ•œ /etc/hosts ํŒŒ์ผ ์ˆ˜์ • -> ๋งจ๋ฐ‘์— ์ถ”๊ฐ€ 
sudo vi /etc/hosts
127.0.0.1 www.fastcampus-kubernetes.com

# nginx ์›น์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธํฌ์›Œ๋”ฉ 8443:443 
kubectl port-forward web-server 8443:443

# https ์š”์ฒญ ์ „์†ก - curl์ด ์„œ๋ฒ„ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ์‹คํ–‰ํ•œ๋‹ค -> ๊ฒฐ๊ณผ: ์‹คํŒจ 
curl -sv https://www.fastcampus-kubernetes.com:8443/myapp

# curl ํด๋ผ์ด์–ธํŠธ๊ฐ€ nginx ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž์ฒด ์„œ๋ช…ํ•œ ์ธ์ฆ์„œ(secrets/https.cert)๋ฅผ ์„œ๋ฒ„ ์ธ์ฆ์„œ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
curl --cacert til-by-topic/kubernetes/3.Kubernetes์™€-Docker๋กœ-ํ•œ-๋ฒˆ์—-๋๋‚ด๋Š”-์ปจ ํ…Œ์ด๋„ˆ-๊ธฐ๋ฐ˜-MSA/ch18/secrets/https.cert -sv https://www.fastcampus-kubernetes.com:8443/myapp
# ๊ฒฐ๊ณผ - ์ •์ƒ ์‘๋‹ต


# ์ปจํ…Œ์ด๋„ˆ์˜ ๋งˆ์šดํŒ… ๊ฒฝ๋กœ /etc/nginx/conf.d, /etc/nginx/tls ํ™•์ธ
kubectl exec web-server -c nginx -- ls /etc/nginx/conf.d
kubectl exec web-server -c nginx -- ls /etc/nginx/tls
kubectl exec web-server -c nginx -- cat /etc/nginx/tls/https.cert # Base64 ๋””์ฝ”๋”ฉ 

# ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod web-server
kubectl delete pod my-app
kubectl delete svc my-app
kubectl delete configmap nginx-config
kubectl delete secret tls-config

14. infrastructure as code

IAC ์˜ ์žฅ์ 

  1. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ทธ๋Œ€๋กœ ์ˆ˜๋™๊ฐœ์ž…์„ ํ”ผํ•จ์œผ๋กœ์จ, ์ธํ”„๋ผ์˜ ๋ฐฐํฌ๊ฐ€ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๋‹ค.
  2. ๊นƒํ—™๊ณผ ๊ฐ™์€ ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ์„ ํ†ตํ•ด iac ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ๋™์ผํ•œ ์ธํ”„๋ผ์—์„œ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Terraform ์ด๋ž€

  • iac ์ข…๋ฅ˜์ค‘ ํ•˜๋‚˜
  • ์„ ์–ธ์  ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ, ์ธํ”„๋ผ์™€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ธํ”„๋ผ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ธํ”„๋ผ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋” ๋‚˜์€ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ ํด๋ผ์šฐ๋“œ๋ณ„ ํ”„๋กœ๋ฐ”์ด๋” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ๋ผํผ์˜ API๋ฅผ ํ†ตํ•ด ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ๋ฐ ๊ธฐํƒ€ ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐํฌ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ”„๋กœ๋ฐ”์ด๋”์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋“ˆ์ด๋ผ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ…Œ๋ผํผ ๊ตฌ์„ฑ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์ผ๊ด€๋œ ์–ธ์–ด๋‚˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

15. eks

AWS EKS ๋ž€

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค์ด๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ๋˜๋Š” control plane์„ ์„ค์น˜ ๋ฐ ์ž‘๋™ ๋“ฑ ๋ณ„๋„์˜ ๊ด€๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•ด์ค€๋‹ค.
  • ์—ฌ๋Ÿฌ AWS ๊ฐ€์šฉ ์˜์—ญ์— ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋†’์€ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ถ€ํ•˜์— ๋”ฐ๋ผ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์ธ์Šคํ„ด์Šค ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ํ”Œ๋ ˆ์ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์›Œ์ปค๋…ธ๋“œ ์˜์—ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ์˜คํ† ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž๋™ํ™”๋œ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ๋ฐ ํŒจ์น˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ AWS ์„œ๋น„์Šค์™€ ํ†ตํ•ฉํ•ด์„œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ํ™•์žฅ์„ฑ๊ณผ ๋ณด์•ˆ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ตœ์‹ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

aws eks ๊ตฌ์„ฑ ์˜ˆ์‹œ

image

16. ์‹ค์ „

k8s์—์„œ ๋‘ ์„œ๋ฒ„์˜ ๋ฐฐํฌ sync ๋งž์ถ”๊ธฐ

A,B ์„œ๋ฒ„๊ฐ€ ์ด๋ฏธ ๋ฐฐํฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •

  1. A ์„œ๋ฒ„ canary ๋ฐฐํฌ
  2. B ์„œ๋ฒ„ canary ๋ฐฐํฌ (์‹ ๊ทœ A์„œ๋ฒ„๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก)
  3. ๊ธฐ์กด B ํŠธ๋ž˜ํ”ฝ์„ ์‹ ๊ทœ A๋กœ ๋ณ€๊ฒฝ
  4. A, B ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ
  5. ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌ
  6. canary ๋ฐฐํฌ๋ณธ ์‚ญ์ œ

ECK์˜ ์žฅ์ 

  1. ๋ฐฐํฌ ์•ˆ์ •์„ฑ
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์€ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • Pod๋งŒ ์ข…๋ฃŒ๋๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒค๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ๋น„์šฉ๋„ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ํŠน์ • ๋…ธ๋“œ๋กœ ์ƒค๋“œ๊ฐ€ ๋ชฐ๋ฆฌ๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐฐํฌ ์‹œ๊ฐ„๋„ ํฌ๊ฒŒ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์†์‰ฌ์šด ๋ฐฐํฌ
    • ECK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ˆ„๊ตฌ๋‚˜ ESํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ† ํฌ๋‚˜์ด์ € ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด ํด๋Ÿฌ์Šคํ„ฐ ๋ฐฐํฌ๋ฅผ ํ•ด์•ผ ํ•  ๋•Œ ๋ˆ„๊ตฌ๋‚˜ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์†์‰ฌ์šด ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ
    • minor ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • YAML manifest์—์„œ sepc.version๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ECK๊ฐ€ ์•Œ์•„์„œ ๋กค๋ง ๋ฐฐํฌ๋ฅผ ํ†ตํ•œ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ ์šฉํ•œ๋‹ค.
  4. AutoScaling ์ ์šฉ
    • ECK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HPA(HorizontalPodAutoscaler)๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜ ๋น„์šฉ๋„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฒ€์ƒ‰ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์˜ ์ƒํƒœ๋Š” ECK๊ฐ€ ์•Œ์•„์„œ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.
  5. ์—ญํ• ๊ณผ ์ฑ…์ž„ ๋ถ„๋ฆฌ
    • ECK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด AWS๋ฐ ์ธํ”„๋ผ์— ๋Œ€ํ•œ ์šด์˜์€ DEVOPSํŒ€์— ์œ„์ž„ํ•˜๊ณ 
    • ๊ฒ€์ƒ‰ํŒ€์€ ๊ฒ€์ƒ‰ ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜๊ณผ ๊ฒ€์ƒ‰ ์„œ๋น„์Šค์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

Volume ์ค„์ด๊ธฐ?

  • kubernetes ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋ชจ๋‘๋‹ค์— ํ•ด๋‹นํ•˜๋Š”๋ฐ, ํ• ๋‹น๋œ ๋ธ”๋ก์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์ด์ฆˆ ์ค„์ด๋Š”๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • block ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ• ๋‹น ํ•ด์ค„ ๋•Œ ํ•ด๋‹น block์˜ ์–ด๋–ค ์˜์—ญ์„ ์‚ฌ์šฉํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฑด os๋ ˆ๋ฒจ์ด๋ผ์„œ
  • ์ธํ”„๋ผ ๋ ˆ๋ฒจ์—์„œ๋Š” ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜๋Š” ์žˆ์–ด๋„
  • ์ค„์ผ ๋•Œ ์–ด๋”œ ์ค„์ผ์ง€๋Š” ๊ฒฐ์ •ํ•  ์ˆ˜์—†๋‹ค.

pod ํ•˜๋‚˜๋ฅผ debugํ•˜๊ธฐ

  1. label์„ debug๋กœ override
  2. ํŠธ๋ž˜ํ”ฝ์ด ์•ˆ์ „ํ•˜๊ฒŒ ๋น ์ง„๊ฑธ ํ™•์ธํ›„ thread dump๋ฅผ ๋œฌ๋‹ค.
  3. ๋””๋ฒ„๊น… ์ง„ํ–‰(๋ฉ”๋ชจ๋ฆฌ ๋ฆญ ๋“ฑ ํ™•์ธ)

argocd ํŒ

  1. refresh ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฐ”๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  2. app detail์—์„œ ์•ฑ์˜ cluster ๋“ฑ ๊ฐ์ข… ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. app detail์—์„œ enable auto sync ์„ค์ •์„ ํ†ตํ•ด์„œ ์ž๋™ ๋ฐฐํฌ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.