Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Virtual IPs and Service Proxies

๊ฐ€์ƒ IP ๋ฐ ์„œ๋น„์Šค ํ”„๋ก์‹œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” kube-proxy๋ฅผ ์‹คํ–‰ํ•œ๋‹ค(kube-proxy๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ง์ ‘ ๋ฐฐํฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด).

kube-proxy๋Š” ExternalName ์™ธ์˜ type์˜ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฐ€์ƒ IP ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•œ๋‹ค.

ํ•ญ์ƒ ๋ฐœ์ƒํ•˜๋Š” ์งˆ๋ฌธ์€, ์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก์‹œ์— ์˜์กดํ•˜๋Š”๊ฐ€ ํ•˜๋Š” ์ ์ด๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์ด ์žˆ๋Š”๊ฐ€? ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ A ๊ฐ’ (๋˜๋Š” IPv6์˜ ๊ฒฝ์šฐ AAAA)์„ ๊ฐ€์ง„ DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๋ผ์šด๋“œ-๋กœ๋นˆ ์ด๋ฆ„ ํ™•์ธ ๋ฐฉ์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

There are a few reasons for using proxying for Services:

  • ๋ ˆ์ฝ”๋“œ TTL์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ , ๋งŒ๋ฃŒ๋œ ์ด๋ฆ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๋Š” DNS ๊ตฌํ˜„์— ๋Œ€ํ•œ ์˜ค๋ž˜๋œ ์—ญ์‚ฌ๊ฐ€ ์žˆ๋‹ค.
  • ์ผ๋ถ€ ์•ฑ์€ DNS ๊ฒ€์ƒ‰์„ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฌด๊ธฐํ•œ์œผ๋กœ ์บ์‹œํ•œ๋‹ค.
  • ์•ฑ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ ์ ˆํžˆ ์žฌ-ํ™•์ธ์„ ํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, DNS ๋ ˆ์ฝ”๋“œ์˜ TTL์ด ๋‚ฎ๊ฑฐ๋‚˜ 0์ด๋ฉด DNS์— ๋ถ€ํ•˜๊ฐ€ ๋†’์•„ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋ณธ ํŽ˜์ด์ง€์˜ ๋’ท ๋ถ€๋ถ„์—์„œ ๋‹ค์–‘ํ•œ kube-proxy ๊ตฌํ˜„์ด ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  ์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฒƒ์€, kube-proxy๋ฅผ ๊ตฌ๋™ํ•  ๋•Œ, ์ปค๋„ ์ˆ˜์ค€์˜ ๊ทœ์น™์ด ์ˆ˜์ •(์˜ˆ๋ฅผ ๋“ค์–ด, iptables ๊ทœ์น™์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Œ)๋  ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” ๋•Œ๋กœ๋Š” ๋ฆฌ๋ถ€ํŠธ ์ „๊นŒ์ง€ ์ •๋ฆฌ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ, kube-proxy๋Š” ์ปดํ“จํ„ฐ์—์„œ ์ €์ˆ˜์ค€์˜, ํŠน๊ถŒ์„ ๊ฐ€์ง„(privileged) ๋„คํŠธ์›Œํ‚น ํ”„๋ก์‹œ ์„œ๋น„์Šค๊ฐ€ ๊ตฌ๋™๋จ์œผ๋กœ์จ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ด€๋ฆฌ์ž์— ์˜ํ•ด์„œ๋งŒ ๊ตฌ๋™๋˜์–ด์•ผ ํ•œ๋‹ค. ๋น„๋ก kube-proxy ์‹คํ–‰ ํŒŒ์ผ์ด cleanup ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์ด ๊ธฐ๋Šฅ์€ ๊ณต์‹์ ์ธ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„๋œ ๊ทธ๋Œ€๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 3๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํ…Œ์ดํŠธ๋ฆฌ์Šค ์ด๋ฏธ์ง€-์ฒ˜๋ฆฌ ๋ฐฑ์—”๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ด๋Ÿฌํ•œ ๋ ˆํ”Œ๋ฆฌ์นด๋Š” ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฑ์—”๋“œ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ๋ฐฑ์—”๋“œ ์„ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‹ค์ œ ํŒŒ๋“œ๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ์ธ์‹ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๋ฐฑ์—”๋“œ ์„ธํŠธ ์ž์ฒด๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•  ํ•„์š”๋„ ์—†๋‹ค.

ํ”„๋ก์‹œ ๋ชจ๋“œ๋“ค

kube-proxy๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ๊ธฐ๋™๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ™˜๊ฒฝ ์„ค์ •์— ๋”ฐ๋ผ ๊ฒฐ์ •๋จ์— ์œ ์˜ํ•œ๋‹ค.

  • kube-proxy์˜ ๊ตฌ์„ฑ์€ ์ปจํ”ผ๊ทธ๋งต(ConfigMap)์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น kube-proxy๋ฅผ ์œ„ํ•œ ์ปจํ”ผ๊ทธ๋งต์€ ์‹คํšจ์„ฑ์žˆ๊ฒŒ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ kube-proxy์˜ ํ”Œ๋ž˜๊ทธ์˜ ํ–‰์œ„๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • kube-proxy๋ฅผ ์œ„ํ•œ ํ•ด๋‹น ์ปจํ”ผ๊ทธ๋งต์€ ๊ธฐ๋™ ์ค‘ ๊ตฌ์„ฑ์˜ ์žฌ์ ์šฉ(live reloading)์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • kube-proxy๋ฅผ ์œ„ํ•œ ์ปจํ”ผ๊ทธ๋งต ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ธฐ๋™ ์‹œ์— ๊ฒ€์ฆ์ด๋‚˜ ํ™•์ธ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šด์˜ ์ฒด๊ณ„๊ฐ€ iptables ๋ช…๋ น์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํ‘œ์ค€ ์ปค๋„ kube-proxy ๊ตฌํ˜„์ฒด๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

iptables ํ”„๋ก์‹œ ๋ชจ๋“œ

์ด ๋ชจ๋“œ์—์„œ๋Š”, kube-proxy๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์„œ๋น„์Šค, ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ๋ฅผ ๊ฐ์‹œํ•œ๋‹ค. ๊ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•ด, ์„œ๋น„์Šค์˜ clusterIP ๋ฐ port์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•˜๊ณ  ํ•ด๋‹น ํŠธ๋ž˜ํ”ฝ์„ ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ ์„ธํŠธ ์ค‘ ํ•˜๋‚˜๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(redirect)ํ•˜๋Š” iptables ๊ทœ์น™์„ ์„ค์น˜ํ•œ๋‹ค. ๊ฐ ์—”๋“œํฌ์ธํŠธ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด, ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” iptables ๊ทœ์น™์„ ์„ค์น˜ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ, iptables ๋ชจ๋“œ์˜ kube-proxy๋Š” ๋ฐฑ์—”๋“œ๋ฅผ ์ž„์˜๋กœ ์„ ํƒํ•œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด iptables๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“œ๋Š”๋ฐ, ์œ ์ €์ŠคํŽ˜์ด์Šค์™€ ์ปค๋„ ์ŠคํŽ˜์ด์Šค ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•  ํ•„์š”์—†์ด ๋ฆฌ๋ˆ…์Šค ๋„ทํ•„ํ„ฐ(netfilter)๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๋‹ค.

kube-proxy๊ฐ€ iptables ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ด๊ณ  ์„ ํƒ๋œ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋“œ๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด, ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•œ๋‹ค. ์ด๋Š” ์ด์ „์˜ userspace ๋ชจ๋“œ์™€ ๋‹ค๋ฅด๋‹ค. ์ด์ „์˜ userspace ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š”, kube-proxy๋Š” ์ฒซ ๋ฒˆ์งธ ํŒŒ๋“œ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ–ˆ์Œ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๋กœ ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„ํ•œ๋‹ค.

ํŒŒ๋“œ ์ค€๋น„์„ฑ ํ”„๋กœ๋ธŒ(readiness probe)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, iptables ๋ชจ๋“œ์˜ kube-proxy๋Š” ์ •์ƒ์œผ๋กœ ํ…Œ์ŠคํŠธ๋œ ๋ฐฑ์—”๋“œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์ด kube-proxy๋ฅผ ํ†ตํ•ด ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ํŒŒ๋“œ๋กœ ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

iptables ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ์„œ๋น„์Šค ๊ฐœ์š” ๋‹ค์ด์–ด๊ทธ๋žจ

์˜ˆ์‹œ

๋‹ค์‹œ ํ•œ๋ฒˆ, ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณ ๋ คํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ๊ฐ€์ƒ IP ์ฃผ์†Œ(์˜ˆ : 10.0.0.1)๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ์„œ๋น„์Šค ํฌํŠธ๋ฅผ 1234๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  kube-proxy ์ธ์Šคํ„ด์Šค๋Š” ์ƒˆ ์„œ๋น„์Šค์˜ ์ƒ์„ฑ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ก์‹œ๊ฐ€ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ฐ€์ƒ IP ์ฃผ์†Œ์—์„œ ์„œ๋น„์Šค-๋ณ„ ๊ทœ์น™์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋˜๋Š” ์ผ๋ จ์˜ iptables ๊ทœ์น™์„ ์„ค์น˜ํ•œ๋‹ค. ์„œ๋น„์Šค-๋ณ„ ๊ทœ์น™์€ ํŠธ๋ž˜ํ”ฝ์„ (๋ชฉ์ ์ง€ NAT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) ๋ฐฑ์—”๋“œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ-๋ณ„ ๊ทœ์น™์— ์—ฐ๊ฒฐํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค์˜ ๊ฐ€์ƒ IP ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•˜๋ฉด iptables ๊ทœ์น™์ด ์‹œ์ž‘ํ•œ๋‹ค. (์„ธ์…˜ ์–ดํ”ผ๋‹ˆํ‹ฐ(Affinity)์— ๋”ฐ๋ผ ๋˜๋Š” ๋ฌด์ž‘์œ„๋กœ) ๋ฐฑ์—”๋“œ๊ฐ€ ์„ ํƒ๋˜๊ณ , ํŒจํ‚ท์˜ ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ๋ฐฑ์—”๋“œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ์ด ๋…ธ๋“œ-ํฌํŠธ ๋˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ์—๋„, ์ด์™€ ๋™์ผํ•œ ๊ธฐ๋ณธ ํ๋ฆ„์ด ์‹คํ–‰๋˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ IP๋Š” ๋ณ€๊ฒฝ๋œ๋‹ค.

IPVS ํ”„๋ก์‹œ ๋ชจ๋“œ

ipvs ๋ชจ๋“œ์—์„œ, kube-proxy๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค์™€ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค๋ฅผ ๊ฐ์‹œํ•˜๊ณ , netlink ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ทธ์— ๋”ฐ๋ผ IPVS ๊ทœ์น™์„ ์ƒ์„ฑํ•˜๊ณ  IPVS ๊ทœ์น™์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค ๋ฐ ์—”๋“œํฌ์ธํŠธ์Šฌ๋ผ์ด์Šค์™€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•œ๋‹ค. ์ด ์ œ์–ด ๋ฃจํ”„๋Š” IPVS ์ƒํƒœ๊ฐ€ ์›ํ•˜๋Š” ์ƒํƒœ์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค. ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋ฉด, IPVS๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ๋ณด๋‚ธ๋‹ค.

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

IPVS๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ๋กœ ๋ฐธ๋Ÿฐ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ทธ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • rr: ๋ผ์šด๋“œ-๋กœ๋นˆ
  • lc: ์ตœ์†Œ ์—ฐ๊ฒฐ (๊ฐ€์žฅ ์ ์€ ์ˆ˜์˜ ์—ด๋ ค์žˆ๋Š” ์—ฐ๊ฒฐ)
  • dh: ๋ชฉ์ ์ง€ ํ•ด์‹ฑ
  • sh: ์†Œ์Šค ํ•ด์‹ฑ
  • sed: ์ตœ๋‹จ ์˜ˆ์ƒ ์ง€์—ฐ (shortest expected delay)
  • nq: ํ ๋ฏธ์‚ฌ์šฉ (never queue)

IPVS ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ์„œ๋น„์Šค ๊ฐœ์š” ๋‹ค์ด์–ด๊ทธ๋žจ

์„ธ์…˜ ์–ดํ”ผ๋‹ˆํ‹ฐ

์ด๋Ÿฌํ•œ ํ”„๋ก์‹œ ๋ชจ๋ธ์—์„œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค/์„œ๋น„์Šค/ํŒŒ๋“œ์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ชจ๋ฅด๋”๋ผ๋„ ์„œ๋น„์Šค์˜ IP:ํฌํŠธ๋กœ ํ–ฅํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์€ ์ ์ ˆํ•œ ๋ฐฑ์—”๋“œ๋กœ ํ”„๋ก์‹œ๋œ๋‹ค.

ํŠน์ • ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์ด ๋งค๋ฒˆ ๋™์ผํ•œ ํŒŒ๋“œ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ํ•˜๋ ค๋ฉด, ์„œ๋น„์Šค์˜ .spec.sessionAffinity๋ฅผ ClientIP๋กœ ์„ค์ •ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ธ์…˜ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ None)

์„ธ์…˜ ๊ณ ์ •(Session stickiness) ํƒ€์ž„์•„์›ƒ

์„œ๋น„์Šค์˜ .spec.sessionAffinityConfig.clientIP.timeoutSeconds๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ์ตœ๋Œ€ ์„ธ์…˜ ๊ณ ์ • ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ 10800์œผ๋กœ, ์ด๋Š” 3์‹œ๊ฐ„์— ํ•ด๋‹น๋จ)

์„œ๋น„์Šค์— IP ์ฃผ์†Œ ํ• ๋‹น

๊ณ ์ •๋œ ๋ชฉ์ ์ง€๋กœ ์‹ค์ œ๋กœ ๋ผ์šฐํŒ…๋˜๋Š” ํŒŒ๋“œ IP ์ฃผ์†Œ์™€ ๋‹ฌ๋ฆฌ, ์„œ๋น„์Šค IP๋Š” ์‹ค์ œ๋กœ๋Š” ๋‹จ์ผ ํ˜ธ์ŠคํŠธ์—์„œ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹ ์—, kube-proxy๋Š” ํŒจํ‚ท ์ฒ˜๋ฆฌ ๋กœ์ง(์˜ˆ: ๋ฆฌ๋ˆ…์Šค์˜ iptables)์„ ์‚ฌ์šฉํ•˜์—ฌ, ํ•„์š”์— ๋”ฐ๋ผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋˜๋Š” ๊ฐ€์ƒ IP ์ฃผ์†Œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ VIP์— ์—ฐ๊ฒฐํ•˜๋ฉด, ํŠธ๋ž˜ํ”ฝ์ด ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†ก๋œ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ์„œ๋น„์Šค ์šฉ DNS๋Š” ์‹ค์ œ๋กœ๋Š” ์„œ๋น„์Šค์˜ ๊ฐ€์ƒ IP ์ฃผ์†Œ (๋ฐ ํฌํŠธ)๋กœ ์ฑ„์›Œ์ง„๋‹ค.

์ถฉ๋Œ ๋ฐฉ์ง€ํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ฃผ์š” ์ฒ ํ•™ ์ค‘ ํ•˜๋‚˜๋Š”, ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒƒ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์— ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค ์„ค๊ณ„ ์‹œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํฌํŠธ ์„ ํƒ๊ณผ ์ถฉ๋Œํ•  ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ด ์ž์‹ ์˜ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๊ฒฉ๋ฆฌ ์‹คํŒจ์ด๋‹ค.

์„œ๋น„์Šค์— ๋Œ€ํ•œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด, ๋‘ ๊ฐœ์˜ ์„œ๋น„์Šค๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” API ์„œ๋ฒ„์— ์„ค์ •๋˜์–ด ์žˆ๋Š” service-cluster-ip-range CIDR ๋ฒ”์œ„์—์„œ ๊ฐ ์„œ๋น„์Šค์— ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค.

๊ฐ ์„œ๋น„์Šค๊ฐ€ ๊ณ ์œ ํ•œ IP๋ฅผ ๋ฐ›๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋‚ด๋ถ€ ํ• ๋‹น๊ธฐ๊ฐ€ etcd์—์„œ ๊ธ€๋กœ๋ฒŒ ํ• ๋‹น ๋งต์„ ์›์ž์ ์œผ๋กœ(atomically) ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์„œ๋น„์Šค๊ฐ€ IP ์ฃผ์†Œ ํ• ๋‹น์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋งต ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์— ์‹คํŒจํ•œ๋‹ค.

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

์„œ๋น„์Šค ๊ฐ€์ƒ IP ์ฃผ์†Œ์˜ IP ์ฃผ์†Œ ๋ฒ”์œ„

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.25 [beta]

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” min(max(16, cidrSize / 16), 256) ๊ณต์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์–ด์ง„ service-cluster-ip-range์˜ ํฌ๊ธฐ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ClusterIP ๋ฒ”์œ„๋ฅผ ๋‘ ๋Œ€์—ญ์œผ๋กœ ๋‚˜๋ˆ„๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ด ๊ณต์‹์€ 16 ์ด์ƒ 256 ์ดํ•˜์ด๋ฉฐ, ๊ทธ ์‚ฌ์ด์— ๊ณ„๋‹จ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Œ ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋™์  IP ํ• ๋‹น ์‹œ ์ƒ์œ„ ๋Œ€์—ญ์—์„œ ์šฐ์„ ์ ์œผ๋กœ ์„ ํƒํ•˜๋ฉฐ, ์ด๋Š” ๊ณง ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ type: ClusterIP ์„œ๋น„์Šค์— ํŠน์ • IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•˜์œ„ ๋Œ€์—ญ์—์„œ ๊ณจ๋ผ์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ํ• ๋‹น ์‹œ ์ถฉ๋Œ์˜ ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ServiceIPStaticSubrange ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” type: ClusterIP ์„œ๋น„์Šค์— ๋Œ€ํ•ด ์ˆ˜๋™ ๋ฐ ๋™์  ํ• ๋‹น IP ์ฃผ์†Œ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๊ณต์œ ๋˜๋Š” ํ’€์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ

.spec.internalTrafficPolicy ๋ฐ .spec.externalTrafficPolicy ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์–ด๋–ป๊ฒŒ ์ •์ƒ(healthy, โ€œreadyโ€) ๋ฐฑ์—”๋“œ๋กœ ๋ผ์šฐํŒ…ํ• ์ง€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๋ถ€ ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.22 [beta]

spec.internalTrafficPolicy ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋‚ด๋ถ€ ์†Œ์Šค์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์–ด๋–ป๊ฒŒ ๋ผ์šฐํŠธ๋ ์ง€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ•„๋“œ๋Š” Cluster ๋˜๋Š” Local๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„๋“œ๋ฅผ Cluster๋กœ ์„ค์ •ํ•˜๋ฉด ๋‚ด๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ค€๋น„ ์ƒํƒœ์˜ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŠธํ•˜๋ฉฐ, Local๋กœ ์„ค์ •ํ•˜๋ฉด ์ค€๋น„ ์ƒํƒœ์˜ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋กœ๋งŒ ๋ผ์šฐํŠธํ•œ๋‹ค. ๋งŒ์•ฝ ํŠธ๋ž˜ํ”ฝ ์ •์ฑ…์ด Local๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ, kube-proxy๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋“œ๋กญ์‹œํ‚จ๋‹ค.

์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ

spec.externalTrafficPolicy ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์™ธ๋ถ€ ์†Œ์Šค์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์–ด๋–ป๊ฒŒ ๋ผ์šฐํŠธ๋ ์ง€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ•„๋“œ๋Š” Cluster ๋˜๋Š” Local๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„๋“œ๋ฅผ Cluster๋กœ ์„ค์ •ํ•˜๋ฉด ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ค€๋น„ ์ƒํƒœ์˜ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŠธํ•˜๋ฉฐ, Local๋กœ ์„ค์ •ํ•˜๋ฉด ์ค€๋น„ ์ƒํƒœ์˜ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋กœ๋งŒ ๋ผ์šฐํŠธํ•œ๋‹ค. ๋งŒ์•ฝ ํŠธ๋ž˜ํ”ฝ ์ •์ฑ…์ด Local๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ ๋…ธ๋“œ-๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ, kube-proxy๋Š” ์—ฐ๊ด€๋œ ์„œ๋น„์Šค๋กœ์˜ ํŠธ๋ž˜ํ”ฝ์„ ํฌ์›Œ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ข…๋ฃŒ ์ค‘์ธ ์—”๋“œํฌ์ธํŠธ๋กœ ๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.26 [beta]

kube-proxy์— ๋Œ€ํ•ด ProxyTerminatingEndpoints ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ  ํŠธ๋ž˜ํ”ฝ ํด๋ฆฌ์‹œ๊ฐ€ Local์ด๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ kube-proxy๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์„ ํƒํ•  ๋•Œ ์ข€ ๋” ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด, kube-proxy๋Š” ๋…ธ๋“œ๊ฐ€ ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ '์ข…๋ฃŒ ์ค‘'์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋ชจ๋“  ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ข…๋ฃŒ ์ค‘์ด๋ฉด, kube-proxy๋Š” ์ข…๋ฃŒ ์ค‘์ธ ํ•ด๋‹น ์—”๋“œํฌ์ธํŠธ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•œ๋‹ค. ์ด์™ธ์˜ ๊ฒฝ์šฐ, kube-proxy๋Š” ์ข…๋ฃŒ ์ค‘์ด ์•„๋‹Œ ์—”๋“œํฌ์ธํŠธ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋Š” ํŽธ์„ ์„ ํ˜ธํ•œ๋‹ค.

์ข…๋ฃŒ ์ค‘์ธ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ํฌ์›Œ๋”ฉ ์ •์ฑ… ๋•๋ถ„์—, externalTrafficPolicy: Local์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— NodePort ๋ฐ LoadBalancer ์„œ๋น„์Šค๊ฐ€ ์—ฐ๊ฒฐ๋“ค์„ ์ž๋น„๋กญ๊ฒŒ(gracefully) ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๋กค๋ง ์—…๋ฐ์ดํŠธ๋  ๋•Œ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋’ค์— ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ํ•ด๋‹น ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ N๊ฐœ์—์„œ 0๊ฐœ ๊ฐ–๋„๋ก ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ถ€ ๊ฒฝ์šฐ์—, ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํ—ฌ์Šค ์ฒดํฌ ํ”„๋กœ๋ธŒ ์‚ฌ์ด์˜ ๊ธฐ๊ฐ„์— ๋ ˆํ”Œ๋ฆฌ์นด 0๊ฐœ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. ์ข…๋ฃŒ ์ค‘์ธ ์—”๋“œํฌ์ธํŠธ๋กœ์˜ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ผ ๋‹ค์šด ์ค‘์ธ ๋…ธ๋“œ๊ฐ€ ํ•ด๋‹น ์ข…๋ฃŒ ์ค‘์ธ ํŒŒ๋“œ๋กœ์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ž๋น„๋กญ๊ฒŒ ์ˆ˜์‹  ๋ฐ ๋“œ๋ ˆ์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ๋“œ ์ข…๋ฃŒ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์ด๋ฏธ ๋…ธ๋“œ์˜ ํ—ฌ์Šค ์ฒดํฌ๊ฐ€ ์‹คํŒจํ–ˆ์Œ์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฑ์—”๋“œ ํ’€์—์„œ ์™„์ „ํžˆ ์ œ๊ฑฐํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด, ์„œ๋น„์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ฐ๊ฒฐ์„ ์ฝ์–ด ๋ณธ๋‹ค.

๋˜ํ•œ,

์ตœ์ข… ์ˆ˜์ • June 07, 2023 at 5:58 PM PST: [ko] Update links in dev-1.26-ko.1 (00461e0912)