Featured image of post Cilium NetworkPolicy - ๋„คํŠธ์›Œํฌ์— ๊ทœ์น™ ์ ์šฉํ•˜๊ธฐ

Cilium NetworkPolicy - ๋„คํŠธ์›Œํฌ์— ๊ทœ์น™ ์ ์šฉํ•˜๊ธฐ


๐Ÿง‘โ€โš–๏ธ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์˜ ์ข…๋ฅ˜

๋„คํŠธ์›Œํฌ ์ •์ฑ…์€ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๋ฌด์Šจ ํŠธ๋ž˜ํ”ฝ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์ •ํ•˜๋„๋ก ํ•œ๋‹ค.
์ „ํ†ต์ ์ธ ๋ฐฉํ™”๋ฒฝ์€ source IP ๋˜๋Š” destination IP ๋ฐ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ permit ๋˜๋Š” deny๋ฅผ ์‹œ์ผฐ์ง€๋งŒ, Cilium์€ label selector, namespace name, FQDN๋“ฑ๊ณผ ๊ฐ™์€ ์‹ ์›์œผ๋กœ ๋ฃฐ์„ ์ƒ์„ฑํ•ด์„œ ์–ด๋–ค ํŠธ๋ž˜ํ”ฝ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€ ๊ฐ™์ด IP์ฃผ์†Œ๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๊ณ  Pod๊ฐ€ ๊ณ„์† ์‚ด์•„๋‚˜๊ณ  ์ฃฝ๋Š” ํ™˜๊ฒฝ์—์„œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ง“๊ธฐ ์ข‹๊ฒŒ ํ•ด์ค€๋‹ค.

Cilium์„ Kubernetes์—์„œ ์‹คํ–‰ํ•  ๋•Œ, Kubernetes Resource๋กœ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
Cilium Agent๋Š” ๋„คํŠธ์›Œํฌ ์ •์ฑ…์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด Kubernetes APIserver๋ฅผ ๊ด€์ฐฐํ•˜๋ฉฐ, ์ค‘์š”ํ•œ eBPF ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋”ฉํ•˜์—ฌ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ •์ฑ…์˜ ๊ตฌํ˜„์ด ๋˜๋„๋ก ํ•œ๋‹ค.

Kubernetes์—์„œ, Cilium์€ ์„ธ ๊ฐ€์ง€ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์ด ๊ฐ€๋Šฅํ•˜๋‹ค:

  • L3/L4๊ณ„์ธต ์ •์ฑ…์„ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธ Kubernetes์˜ NetworkPolicy
  • L3/L4/L7๊ณ„์ธต ์ •์ฑ…์„ ์ง€์›ํ•˜๋Š” CiliumNetworkPolicy
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฒ—์–ด๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ์ •์ฑ…์„ ์œ„ํ•œ CiliumClusterwideNetworkPolicy

Cilium์€ ์ด ์„ธ ๊ฐ€์ง€ ์ •์ฑ…์„ ๋™์‹œ์— ์ง€์›ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, ๋‹ค์–‘ํ•œ ์ •์ฑ… ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์ •์ฑ… ํƒ€์ž…๋“ค ๊ฐ„์˜ ํ—ˆ์šฉ๋œ ํŠธ๋ž˜ํ”ฝ๋“ค์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์„ธ์‹ฌํ•œ ์ฃผ์˜๊ฐ€ ์—†๋‹ค๋ฉด, ์˜๋„์น˜ ์•Š์€ ์ •์ฑ…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

networkpolicy.io์˜ ์‹œ๊ฐํ™” ๋„๊ตฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ •์ฑ… ์ •์˜๊ฐ€ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ณด๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.


๐Ÿ“ NetworkPolicy ๋ฆฌ์†Œ์Šค

NetworkPolicy ์ž์›์€ IP์ฃผ์†Œ ๋˜๋Š” ํฌํŠธ ๋ ˆ๋ฒจ์—์„œ์˜ ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” L3/L4 ๊ณ„์ธต์˜ ์ „ํ†ต์ ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž์›์ด๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค:

  • Label Matching์„ ์ด์šฉํ•œ L3/L4 Ingress ๋ฐ Egress ์ •์ฑ…
  • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์˜ L3 IP/CIDR์— ๋Œ€ํ•œ L3 IP/CIDR Ingress ๋ฐ Egress์ •์ฑ…
  • L4 TCP ๋ฐ ICMP ํฌํŠธ์— ๋Œ€ํ•œ Ingress ๋ฐ Egress ์ •์ฑ…

๐Ÿ“ CiliumNetworkPolicy ๋ฆฌ์†Œ์Šค

CiliumNetworkingPolicy๋Š” ํ‘œ์ค€ NetworkPolicy์˜ ํ™•์žฅ์ด๋‹ค. ๋‹ค์Œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค:

  • Ingress์™€ Egress๋ฅผ ํŠน์ • HTTP path๋กœ ์ œํ•œํ•˜๋Š” L7 HTTP ํ”„๋กœํ† ์ฝœ ์ •์ฑ… ๋ฃฐ
  • DNS, Kafka, gRPC๋“ฑ์˜ ์ถ”๊ฐ€์ ์ธ L7 ํ”„๋กœํ† ์ฝœ ์ง€์›
  • ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ํ†ต์‹ ์—์„œ์˜ Service์ด๋ฆ„ ๊ธฐ๋ฐ˜์˜ Egress ์ •์ฑ…
  • ํŠน๋ณ„ํ•œ Entity๋ฅผ ์œ„ํ•œ Entity matching์„ ์“ฐ๋Š” L3/L4 Ingress ๋ฐ Egress ์ •์ฑ…
  • DNS FQDN ๋งค์นญ์„ ์‚ฌ์šฉํ•˜๋Š” L3 Ingress ๋ฐ Egress ์ •์ฑ…

Cilium project documentation์—์„œ ์ผ๋ถ€ YAML ์‚ฌ์šฉ์‚ฌ๋ก€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
YAML๋งŒ์„ ์ฝ๊ณ , ์–ด๋–ค ํŠธ๋ž˜ํ”ฝ์ด ํ—ˆ์šฉ๋˜๊ณ  ๊ฑฐ๋ถ€๋ ์ง€๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์ง€๋งŒ, ์ •ํ™•ํ•˜๊ฒŒ ์˜๋„๋œ ์ •์ฑ…์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ€๋งŒ ๋‘˜ ์ผ์ด ์•„๋‹ˆ๋‹ค.
๋‹คํ–‰ํžˆ๋„, networkpolicy.io์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ๋„์™€์ค€๋‹ค.


โœ๏ธ Networkpolicy.io Policy Editor

NetworkPolicy.io์˜ policy editor๋Š” L3 ๋ฐ L4 ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ฐพ์•„๋ณด๊ณ  ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
์‹œ๊ฐ์ ์ธ ์ž๋ฃŒ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ์ •์ฑ…์„ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
Policy editor๋Š” ํ‘œ์ค€ Kubernetes NetworkPolicy์™€ CiliumNetworkPolicy ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

NetworkPolicy.io์˜ Policy Editor ์œ„์—๋Š” ์ •์ฑ…๋“ค์„ ์‹œ๊ฐํ™”ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค ๋งต์ด ์žˆ๋‹ค.
์ดˆ๋ก ์ƒ‰์€ ํ—ˆ์šฉ, ๋ถ‰์€ ์ƒ‰์€ ๊ฑฐ๋ถ€์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
์ด๋Ÿฌํ•œ UI๋ฅผ ๋ณด๋ฉด์„œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์™ธ์˜ Ingress์™€ Egress ์ •์ฑ…์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค.

์ขŒ์ธก ํ•˜๋‹จ์—๋Š”, read-only YAML์ด ์žˆ๋‹ค.
ํ‘œ์ค€ Kubernetes NetworkPolicy๋˜๋Š” CiliumNetworkPolicy์ค‘์—์„œ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ ์ •์ฑ…์„ ๋‹ค์šด๋ฐ›์•„์„œ kubectl๋กœ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
๊ธฐ์กด ์กด์žฌํ•˜๋Š” policy ์ •์˜๋ฅผ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ณ , ์‹œ๊ฐํ™”๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ •์ฑ…์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ •์ฑ… ๋ฃฐ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ์›€์ง์ด๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์ข‹๋‹ค.
์šฐ์ธก ํ•˜๋‹จ์—๋Š”, ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ์˜ ์ •์ฑ…์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋“ฑ์„ ์•Œ๋ ค์ค€๋‹ค.
Hubble flow๋ฅผ ์—…๋กœ๋“œํ• ์ˆ˜๋„ ์žˆ๊ณ , Hubble์ด ๋ฌด์—‡์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
์ฃผ์˜ํ•  ์ ์€, ์•„์ง L7์ง€์›์€ ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


โœ… L7 CiliumNetworkPolicy์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ

CiliumNetworkPolicy๊ฐ€ ๊ธฐ์กด ์ •์ฑ…๊ณผ ๋‹ค๋ฅธ ์ ์€, L7 protocol์„ ์ดํ•ดํ•˜๋Š” ์ •์ฑ…์— ์žˆ๋‹ค. Cilium์—์„œ๋Š”, HTTP, Kafka, DNS๋“ฑ์˜ L7์ง€์›์ด ๊ฐ€๋Šฅํ•˜๋‹ค. L7์ •์ฑ… ๋ฃฐ์€ L4์˜ toPorts๋ฅผ ํ™•์žฅํ•˜์—ฌ networkpolicy.io์—์„œ์˜ ๋งŒ๋“ค์–ด์ง„ YAML ๋งˆ๋‹ˆํŽ˜์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋„ ์‰ฝ๋‹ค. L7 ์ •์ฑ… ๋ฃฐ์˜ ์†์„ฑ์€ Cilium์˜ ์—ฌ๋Ÿฌ ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์†์„ฑ๋“ค์„ ๊ฐ€์ง„๋‹ค. https://docs.cilium.io/en/latest/security/policy/language/#layer-7-examples์— ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” HTTP๋งŒ ๋ณผ ๊ฒƒ์ด๋‹ค.


๐Ÿ•ธ๏ธ L7 HTTP ์ •์ฑ…

L7 HTTP ์ •์ฑ…์ด ํ™œ์„ฑํ™”๋˜๋ฉด, ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๋…ธ๋“œ์˜ Cilium Agent๋Š” local-only์˜ HTTP proxy service์™€ eBPFํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์—ฌ ํŒจํ‚ท์„ local HTTP proxy์—์„œ ํฌ์›Œ๋“œ๋˜๋„๋ก ํ•œ๋‹ค.

HTTP proxy๋Š” L7 ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ๋”ฐ๋ฅด๊ณ , ์ ์ ˆํ•˜๊ฒŒ ํŒจํ‚ท์„ ์ „๋‹ฌํ•œ๋‹ค.
์ถ”๊ฐ€์ ์œผ๋กœ, HTTP ํ”„๋ก์‹œ๊ฐ€ ์žˆ๋‹ค๋ฉด, Hubble flows์—์„œ L7๊ด€์ฐฐ์„ฑ์„ ์ œ๊ณต๋ฐ›๋Š”๋‹ค.

L7 HTTP ์ •์ฑ…์„ ์ž‘์„ฑํ•  ๋•Œ, ๋‹ค์Œ์˜ ํ•„๋“œ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค:

  • Path
    URL์—์„œ POSIX์ •๊ทœํ‘œํ˜„์‹์ด ์ ์šฉ๋˜์–ด ๋งค์นญ๋œ๋‹ค.
    ๊ณต๋ฐฑ ์‹œ, ๋ชจ๋“  pathํ—ˆ์šฉ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
  • Method
    ์š”์ฒญ์˜ HTTP ๋ฉ”์„œ๋“œ์ด๋‹ค(GET, POST, PUT, PATCH, DELETE).
    ๊ณต๋ฐฑ ์‹œ, ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ—ˆ์šฉ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
  • Host
    POSIX ์ •๊ทœํ‘œํ˜„์‹์ด ๋งค์นญ๋˜์–ด ์ ์šฉ๋˜๋Š” ์š”์ฒญ์˜ host ํ—ค๋”์ด๋‹ค.
    ๊ณต๋ฐฑ ์‹œ, ๋ชจ๋“  hostํ—ˆ์šฉ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
  • Headers
    ํ•„์ˆ˜๋กœ ์š”๊ตฌํ•˜๋Š” HTTP ํ—ค๋”๋ฅผ ์ ์–ด์•ผ ํ•œ๋‹ค.
    ๊ณต๋ฐฑ ์‹œ, ํ—ค๋”์— ์ƒ๊ด€์—†์ด ํ—ˆ์šฉ๋œ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋Š” app=myService๋ผ๋Š” label์„ ๊ฐ€์ง„ ๋ชจ๋“  endpoint๋“ค์— ๋Œ€ํ•ด TCP 80๋ฒˆ L4๊ทœ์น™์„ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜์—ฌ L7๊ทœ์น™๋“ค๋กœ ํ™•์žฅํ•œ๋‹ค.
๋‹ค์Œ์˜ ํŠธ๋ž˜ํ”ฝ๋“ค๋งŒ ํ—ˆ์šฉ๋œ๋‹ค:

  • GET /v1/path1
    GET /v1/path1๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.
  • PUT /v2/path2.*
    โ€/v2/path2.*โ€๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์˜ PUT์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • Post .*/path3
    โ€/path3โ€์œผ๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  path๋ฅผ ํ—ˆ์šฉํ•˜๊ณ , HTTP ํ—ค๋”๋กœ X-My-Header๊ฐ€ true๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํŠธ๋ž˜ํ”ฝ์ด ํ—ˆ์šฉ๋œ๋‹ค.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "l7-rule"
spec:
  endpointSelector:
    matchLabels:
      app: myService
  ingress:
    - toPorts:
        - ports:
            - port: "80"
              protocol: TCP
          rules:
            http:
              - method: GET
                path: "/v1/path1"
              - method: PUT
                path: "/v2/path2.*"
              - method: POST
                path: ".*/path3"
                headers:
                  - "X-My-Header: true"

L7๊ทœ์น™์€ L4๊ทœ์น™์—์„œ ๋” ํ™•์žฅ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ ํ˜•์ƒํ•˜๊ณ  ์žˆ๋‹ค.
์ฆ‰, L7๊ทœ์น™์€ L4๊ทœ์น™์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ถ™์—ฌ๋‚˜๊ฐ€๋Š” ์‹์ด ์ข‹๋‹ค.


๐Ÿƒ ์‹ค์Šต: L4/L7 ๋„คํŠธ์›Œํฌ ์ •์ฑ…

์‹œ๋‚˜๋ฆฌ์˜ค

๋‹น์‹ ์€ Empire์˜ ํ”Œ๋žซํผ ํŒ€์ด ๋˜์–ด, IGKS(Imperial Galatic Kubernetes Service)์— Death Star API๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค.
์„œ๋น„์Šค๋Š” ์ด๋ฏธ ๋ฐฐํฌ๊ฐ€ ๋˜์–ด์žˆ์ง€๋งŒ, Empire์˜ TIE ์ „ํˆฌ๊ธฐ๋“ค๋งŒ์ด ์ฐฉ๋ฅ™ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.

์ด ์š”์ฒญ์€ HTTP POST ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฒฝ๋กœ์—์„œ๋Š” PUT ๋ฉ”์„œ๋“œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์ง€๋Š” ๋ชปํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.
๋ฌผ๋ก  TIE ํŒŒ์ผ๋Ÿฟ๋“ค์ด ์ผ๋ถ€ํ„ฐ exhaust port์— ๋ญ”๊ฐ€๋ฅผ ํ•  ์ผ์€ ์—†๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์‚ฌ๊ณ ์— ๋Œ€๋น„ํ•ด์•ผ ํ•œ๋‹ค.

CiliumNetworkPolicy๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ  ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‹ค์Šค ๋ฒ ์ด๋”๊ฐ€ ๋‹น์‹ ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ด๋‹ค.
๊ทธ์˜ ๋ถˆ์‹ ์„ ์‚ฌ๋Š” ์ˆœ๊ฐ„โ€ฆ ๊ฒฐ๊ณผ๋Š” ๋”์ฐํ•ด์ง„๋‹ค.

์ฆ‰, ๋ชฉํ‘œ๋Š” TIE ์ „ํˆฌ๊ธฐ๋“ค์ด ์˜ค์ง โ€œ์ฐฉ๋ฅ™ ์š”์ฒญโ€์„ ์œ„ํ•œ HTTP POST์š”์ฒญ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก Death Star ์„œ๋น„์Šค์— ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” CiliumNetworkPolicy ๋ฆฌ์†Œ์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์‹ค์Šต ์„ธํŒ…

์šฐ์„ , Cilium์ด ์„ค์น˜๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. Death Star ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค. Cilium Project์—๋Š” Death Star demo application์ด ์žˆ๋‹ค.

๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋งˆ๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
01:27:13 in ~
โžœ kubectl create -f https://raw.githubusercontent.com/cilium/cilium/HEAD/examples/minikube/http-sw-app.yaml
service/deathstar created
deployment.apps/deathstar created
pod/tiefighter created
pod/xwing created

์ž ๊น! X-wings๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋‹ค? ์ด๊ฒŒ ๋ฌด์Šจ ์ผ์ด์ง€?
๊ดœ์ฐฎ๋‹ค. X-wings๊ฐ€ Death Star service์— ์ ‘์†ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
Death Star ์„œ๋น„์Šค๋Š” ๋งŒ๋“ค์–ด์กŒ๊ณ , ์˜ค์ง ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‚ด๋ถ€ IP๋งŒ ๊ฐ€์ง„๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‚ด๋ถ€๋ง์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

1
2
3
4
5
01:27:31 in ~
โžœ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
deathstar    ClusterIP   10.100.242.234   <none>        80/TCP    2m44s
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   5d7h

์ถ”๊ฐ€๋กœ, Cilium Endpoint๊ฐ€ ๊ฐ Pod๋ฅผ ์œ„ํ•ด ์ƒ๊ธด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
01:30:15 in ~
โžœ kubectl get po,CiliumEndpoint
NAME                             READY   STATUS    RESTARTS   AGE
pod/deathstar-74c8f5ff5c-h6rbl   1/1     Running   0          3m11s
pod/deathstar-74c8f5ff5c-rp7rx   1/1     Running   0          3m11s
pod/tiefighter                   1/1     Running   0          3m11s
pod/xwing                        1/1     Running   0          3m11s

NAME                                                  SECURITY IDENTITY   ENDPOINT STATE   IPV4        IPV6
ciliumendpoint.cilium.io/deathstar-74c8f5ff5c-h6rbl   24949               ready            10.0.0.41
ciliumendpoint.cilium.io/deathstar-74c8f5ff5c-rp7rx   24949               ready            10.0.1.81
ciliumendpoint.cilium.io/tiefighter                   59640               ready            10.0.1.65
ciliumendpoint.cilium.io/xwing                        13885               ready            10.0.1.97

Cilium์€ ๊ฐ Death Star ๋ฒก์—”๋“œ Pod์— ํ•ด๋‹นํ•˜๋Š” Endpoint๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
X-wing๊ณผ TIE ์ „ํˆฌ๊ธฐ Pod๋“ค ์—ญ์‹œ ๊ทธ๋ ‡๋‹ค.

Note
deathstar-* ์—”๋“œํฌ์ธํŠธ๋Š” ๊ฐ™์€ IDENTITY ID๋ฅผ ๊ฐ€์ง„๋‹ค.
์ด์ „ ์ฑ•ํ„ฐ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๊ฐ™์€ Cilium์‹ ์›์„ ๊ฐ€์ง„๋‹ค.
label์˜ ์กฐํ•ฉ์ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
Cilium Agent๋Š” ์ด Identity ID๋กœ ์ ์ ˆํ•œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ๋งค์นญํ•œ๋‹ค.

์•„์ง ์•„๋ฌด๋Ÿฐ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์ด ์—†๋‹ค.
์–‘์ชฝ ๋‹ค Death Star ๋ฒก์—”๋“œ ํŒŒ๋“œ์— ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋‘˜๋‹ค ์ฐฉ๋ฅ™์„ ์‹œ์ผœ๋ณด์ž:

1
2
3
4
5
6
7
01:32:18 in ~ โ€ฆ
โžœ kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
Ship landed

01:50:48 in ~ โ€ฆ
โžœ kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
Ship landed

Death Star ์„œ๋น„์Šค์— ์ •์ฑ…์„ ์ฃผ์–ด์„œ, ์›ํ•˜๋Š” Pod๋งŒ ์ฐฉ๋ฅ™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด์ž!

Empore์˜ Ingress ํ—ˆ์šฉ ์ •์ฑ…

X-wing Pod๋“ค์ด Death Star์˜ ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ์— ์ ‘์†ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ Label๊ธฐ๋ฐ˜์˜ L3์ •์ฑ…์ด๋‹ค.
L3์ •์ฑ…์€ ๋ชจ๋“  ํฌํŠธ๋“ค์„ ๋ง‰์•„๋ฒ„๋ฆฐ๋‹ค.
ํฌํŠธ ๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ง‰๊ณ  ์‹ถ๋‹ค๋ฉด, L4๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

xwing Pod๋Š” org=alliance๋ฅผ, tiefighter Pod๋Š” org=empire label์„ ๊ฐ€์ง„๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
01:51:01 in ~ โ€ฆ
โžœ kubectl describe pod/xwing
Name:             xwing
Namespace:        default
Priority:         0
Service Account:  default
Node:             worker1/192.168.0.10
Start Time:       Sun, 28 Sep 2025 01:27:30 +0900
Labels:           app.kubernetes.io/name=xwing
                  class=xwing
                  org=alliance
01:54:55 in ~ โ€ฆ
โžœ kubectl describe pod/tiefighter
Name:             tiefighter
Namespace:        default
Priority:         0
Service Account:  default
Node:             worker1/192.168.0.10
Start Time:       Sun, 28 Sep 2025 01:27:30 +0900
Labels:           app.kubernetes.io/name=tiefighter
                  class=tiefighter
                  org=empire

TCP 80๋ฒˆ ํฌํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” L4๋„คํŠธ์›Œํฌ ์ •์ฑ…์€ org=empire๋ผ๋ฒจ์„ ํ•œ Pod๋งŒ ํ—ˆ์šฉํ•˜๊ณ , xwing Pod๋“ค์„ Death Star ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋กœ๋ถ€ํ„ฐ ์ฐจ๋‹จํ•œ๋‹ค.
์šฐ๋ฆฌ๋Š” networkpolicy.io์˜ policy editor๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์šด๋ฐ๋ฅผ ์ˆ˜์ •ํ•ด์„œ, Policy์˜ ์ด๋ฆ„์„ ๋„ฃ์–ด์ฃผ๊ณ , Endpoint selector์— deathstar์˜ label์„ ๋„ฃ์–ด์ค€๋‹ค.

Deathstar-Label

Ingress์ธก์— Namespace์ž์›์— Pod selector๋กœ org=empire, To ports์—๋Š” 80|TCP๋กœ ์ž…๋ ฅํ•œ๋‹ค.

Ingress-to-port

์ด์ œ, YAML์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-empire-in-namespace
spec:
  endpointSelector:
    matchLabels:
      org: empire
      class: deathstar
  ingress:
    - fromEndpoints:
        - matchLabels:
            org: empire
      toPorts:
        - ports:
            - port: "80"
              protocol: TCP

์ด L4์ •์ฑ…์ด deathstar-* Pod service endpoint๋‹จ์œ„์˜ ์ œ์–ด๋งŒ ํ•˜๊ณ , Death Star service, ์ฆ‰ L7์ˆ˜์ค€์˜ ์ œ์–ด๋Š” ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•˜๋ผ.

๋งŒ์•ฝ Pod์˜ Egress ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, client pod์˜ egress์ •์ฑ…์„ ์„ค์ •ํ•ด์„œ toServices์ •๋ณด๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
์ด๋ ‡๊ฒŒ๋„ ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ๊ฐ€๋Šฅ์€ ํ•˜์ง€๋งŒ, ์ด ์ƒํ™ฉ์—์„œ๋Š” Ingress๊ทœ์น™๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๋‹ค.

๋งŒ์•ฝ Pod๋งˆ๋‹ค ์–ด๋А ๊ณณ์— ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ Egress๋ฅผ ์จ์ฃผ๋Š”๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค.

์ด์ œ, ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด์ž.

1
2
3
02:34:33 in ~/cilium-lab โ€ฆ
โžœ kubectl apply -f allow-empire-in-namespace.yaml
ciliumnetworkpolicy.cilium.io/allow-empire-in-namespace created

์ด์ œ, X-Wing์€ ๋”์ด์ƒ API๋ฅผ ๋‚ ๋ฆด ์ˆ˜ ์—†๋‹ค.
ํƒ€์ž„์•„์›ƒ์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
02:39:29 in ~/cilium-lab โ€ฆ
โžœ kubectl exec xwing -- curl --connect-timeout 10 -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
command terminated with exit code 28

๊ทธ๋Ÿฌ๋‚˜, tiefigher Pod๋Š” ์„ฑ๊ณตํ•œ๋‹ค:

1
2
3
02:39:43 in ~/cilium-lab took 10.2s โ€ฆ
โžœ kubectl exec tiefighter -- curl --connect-timeout 10 -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
Ship landed

์ด์ œ X-wing Pod๋Š” ์•„๋ฌด ์•ก์„ธ์Šค๋„ ์—†๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, org=empire๋ผ๋ฉด ๋ชจ๋“  API๋ฅผ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.
์‹ค์ˆ˜๋กœ ์ž์› ๊ณ ๊ฐˆ ์š”์ฒญ์„ ๋‚ ๋ ธ๋‹ค๊ณ  ํ•ด๋ณด์ž:

1
2
3
02:40:56 in ~/cilium-lab โ€ฆ
โžœ kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port
Panic: deathstar exploded

์ด๋Ÿฐ! ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” L7์ •์ฑ…์„ ํ• ๋‹นํ•˜์—ฌ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

L7 HTTP ์ •์ฑ… ๋งŒ๋“ค๊ธฐ

๊ธฐ์กด YAML์—์„œ path๊ธฐ๋ฐ˜ ์ •์ฑ…์„ ํ™•์žฅํ•ด๋ณด์ž.
์•„๋ž˜ ๊ทœ์น™์€ org์™€ class label์„ ๋งค์นญํ•˜๋ ค๋“ ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-empire-in-namespace
spec:
  endpointSelector:
    matchLabels:
      org: empire
      class: deathstar
  ingress:
  - fromEndpoints:
    - matchLabels:
        org: empire
        class: tiefighter
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - method: "POST"
          path: "/v1/request-landing"
  - fromEndpoints:
    - matchLabels:
        org: empire
        class: maintenance-droid
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - method: "PUT"
          path: "/v1/exhaust-port"

์ €์žฅ ํ›„, ์ ์šฉํ•ด๋ณด์ž.

1
2
3
02:46:21 in ~/cilium-lab took 1m 44.9s โ€ฆ
โžœ kubectl apply -f allow-empire-in-namespace.yaml
ciliumnetworkpolicy.cilium.io/allow-empire-in-namespace configured

์ด์ œ, TIE ์ „ํˆฌ๊ธฐ๋“ค์€ ์ž์›๊ณ ๊ฐˆ API์š”์ฒญ์— ๋Œ€ํ•ด HTTP 403 ์‘๋‹ต์„ ๋ฐ›๋Š”๋‹ค.
Cilium Agent์— ๋‚ด์žฅ๋œ HTTP proxy๊ฐ€ ๋Œ€์‹  ์‘๋‹ตํ•ด์ค€ ๊ฒƒ์ด๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
02:46:25 in ~/cilium-lab โ€ฆ
โžœ kubectl exec tiefighter -- curl -v -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port
*   Trying 10.100.242.234:80...
* Connected to deathstar.default.svc.cluster.local (10.100.242.234) port 80 (#0)
> PUT /v1/exhaust-port HTTP/1.1
> Host: deathstar.default.svc.cluster.local
> User-Agent: curl/7.88.1
> Accept: */*
>
Access denied
< HTTP/1.1 403 Forbidden
< content-length: 15
< content-type: text/plain
< date: Sat, 27 Sep 2025 17:49:09 GMT
< server: envoy
<
{ [15 bytes data]
* Connection #0 to host deathstar.default.svc.cluster.local left intact

X-wing์€ L4์ •์ฑ…์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•ด์„œ HTTP ๋ฉ”์‹œ์ง€๋„ ๋ชป๋ฐ›๊ณ  ํƒ€์ž„์•„์›ƒ์ด ๋‚œ๋‹ค.
์šฐ๋ฆฌ๋Š” TIE ์ „ํˆฌ๊ธฐ๋“ค์ด ์ฐฉ๋ฅ™ ์š”์ฒญ๋งŒ ๋‚ ๋ฆด ์ˆ˜ ์žˆ๊ณ , ์ž์›๊ณ ๊ฐˆ API๋Š” ์š”์ฒญํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค.

Note
L3/4 ์ •์ฑ…๊ณผ L7์ •์ฑ…์˜ ์‘๋‹ต ์ฐจ์ด๋Š” ๊ตฌํ˜„์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
L3/4์ด์—์„œ๋Š” eBPFํ”„๋กœ๊ทธ๋žจ์ด ํŒจํ‚ท์„ ๋“œ๋กญํ•˜๊ณ , ๋„คํŠธ์›Œํฌ์˜ ๋ธ”๋ž™ํ™€์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.
L7 ๋„คํŠธ์›Œํฌ ์ •์ฑ…์€ HTTP proxy๊ฐ€ ์š”์ฒญ์— ๋Œ€ํ•ด ๊ฒฐ์ •ํ•˜๊ณ , HTTP ์ƒํƒœ ๋ฉ”์‹œ์ง€์™€ ์‚ฌ์œ ๋ฅผ ๊ฐ™์ด ์‘๋‹ตํ•˜๋ฉฐ ์‘๋‹ต์„ ๊ฑฐ์ ˆํ•œ๋‹ค.


๐Ÿ“š ๊ฒฐ๋ก 

CiliumNetworkPolicy๋Š” Pod๊ฐ„ ํ†ต์‹ ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผ์ œ์–ด๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
Pod๋“ค์˜ ํ†ต์‹ ์—์„œ ์ „์ฒด ๊ถŒํ•œ์„ ์ฃผ๊ธฐ๋ณด๋‹ค, CiliumNetworkPolicy๋ฅผ ํ†ตํ•ด์„œ ์ตœ์†Œ ๊ถŒํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
์ด๋ ‡๊ฒŒ ์ตœ์†Œ ๊ถŒํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์„œ๋น„์Šค๊ฐ€ ์˜๋„์ง€ ์•Š๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๊ณ , ๋ณด์•ˆ์—๋„ ์ข‹๋‹ค.

Hugo๋กœ ๋งŒ๋“ฆ
Jimmy์˜ Stack ํ…Œ๋งˆ ์‚ฌ์šฉ ์ค‘