ํฌ์ŠคํŠธ

๐Ÿ”ฅ ์‚ฌ์ด๋“œ์นด(Sidecar)์˜ ์‹œ๋Œ€๋Š” ๋๋‚ฌ๋‹ค: eBPF๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์˜ ๋ฐ‘๋ฐ”๋‹ฅ์„ ๋œฏ์–ด๊ณ ์น˜๋Š” ๋ฐฉ์‹

๐Ÿ”ฅ ์‚ฌ์ด๋“œ์นด(Sidecar)์˜ ์‹œ๋Œ€๋Š” ๋๋‚ฌ๋‹ค: eBPF๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์˜ ๋ฐ‘๋ฐ”๋‹ฅ์„ ๋œฏ์–ด๊ณ ์น˜๋Š” ๋ฐฉ์‹

์†”์งํžˆ ์ฒ˜์Œ ์ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ดค์„ ๋• ์˜๊ตฌ์‹ฌ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. โ€œ๋˜ CNCF(Cloud Native Computing Foundation) ์ƒํƒœ๊ณ„์—์„œ ๋ฐ€์–ด๋ถ™์ด๋Š” ๊ณผ๋Œ€๊ด‘๊ณ (Hype), ์ƒˆ๋กœ์šด ์€์ด์•Œ(Silver Bullet) ํƒ€๋ น์ธ๊ฐ€?โ€ ์‹ถ์—ˆ๊ฑฐ๋“ ์š”.

MSA(Microservices Architecture) ํ™˜๊ฒฝ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŠธ๋ž˜ํ”ฝ์„ ์ข€ ๊ตด๋ ค๋ณธ ๋ถ„๋“ค์ด๋ผ๋ฉด ๋‹ค๋“ค ๊ณต๊ฐํ•˜์‹ค ๊ฒ๋‹ˆ๋‹ค. Istio๋‚˜ Linkerd ๊ฐ™์€ ์„œ๋น„์Šค ๋ฉ”์‹œ๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ง€๋งŒ, ์•„ํ‚คํ…์ฒ˜์˜ ๊ทธ๋ฆผ์ž์—๋Š” ์—„์ฒญ๋‚œ ๋น„์šฉ์ด ์ˆจ์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋“œ(Pod)๋งˆ๋‹ค ์ฐฐ์‹น ๋‹ฌ๋ผ๋ถ™์–ด ์žˆ๋Š” ์‚ฌ์ด๋“œ์นด(Sidecar) ํ”„๋ก์‹œ๋“ค ๋•Œ๋ฌธ์— ์ธํ”„๋ผ ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ๊ฒฝํ—˜ ๋ง์ด์ฃ . OOM(Out of Memory) ํ‚ฌ๋Ÿฌ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹ˆ๋ผ ์• ๋จผ Envoy ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์ฃฝ์—ฌ๋ฒ„๋ ค์„œ ๋ฐค์ค‘์— PagerDuty ์•Œ๋žŒ ๋ฐ›๊ณ  ๊นจ์–ด๋‚œ ์ , ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค ์žˆ์ง€ ์•Š๋‚˜์š”?

๐Ÿ’ก ํ•œ ๋งˆ๋””๋กœ ์š”์•ฝํ•˜๋ฉด?

โ€œ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(User Space) ๋ฐ–์—์„œ ๋งด๋Œ๋ฉฐ ํŒจํ‚ท์„ ๋ณต์‚ฌํ•ด๋Œ€๋˜ ํ”„๋ก์‹œ๋ฅผ, ์•„์˜ˆ ์šด์˜์ฒด์ œ ์ปค๋„(Kernel Space) ์•ˆ์œผ๋กœ ์šฐ๊ฒจ๋„ฃ์–ด ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์ด TCP/IP ์Šคํƒ์„ ํƒ€๊ธฐ๋„ ์ „์— ์กฐ์ž‘ํ•ด๋ฒ„๋ฆฌ๋Š” ๋ฏธ์นœ ๋ฐœ์ƒ.โ€

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ‘๋ฐ”๋‹ฅ๊นŒ์ง€ ๋œฏ์–ด๋ณผ eBPF(Extended Berkeley Packet Filter) ๊ธฐ๋ฐ˜์˜ ์„œ๋น„์Šค ๋ฉ”์‹œ๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ง„์งœ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ Under the Hood: ์‚ฌ์ด๋“œ์นด์™€ iptables๊ฐ€ ์˜์•„ ์˜ฌ๋ฆฐ ๋ณ‘๋ชฉ, ์ปค๋„์—์„œ ๋‹ต์„ ์ฐพ๋‹ค

๊ธฐ์กด์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น๊ณผ ์‚ฌ์ด๋“œ์นด ํŒจํ„ด์€ ํŒจํ‚ท์ด ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์—„์ฒญ๋‚œ โ€˜ํ†ตํ–‰๋ฃŒโ€™๋ฅผ ์ฒญ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋“œ A์—์„œ ํŒŒ๋“œ B๋กœ ํ†ต์‹ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณผ๊นŒ์š”? ํŒจํ‚ท์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ถœ๋ฐœํ•ด ํ˜ธ์ŠคํŠธ์˜ ๋„คํŠธ์›Œํฌ ์Šคํƒ์„ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ”๋‹ค๊ฐ€, ๊ทธ ์•…๋ช… ๋†’์€ iptables ์ฒด์ธ์„ ๊ฑฐ์น˜๊ณ , ๋‹ค์‹œ ์‚ฌ์ด๋“œ์นด(Envoy)๋กœ ์˜ฌ๋ผ์™”๋‹ค๊ฐ€(User Space ์ „ํ™˜), ๋‹ค์‹œ ์ปค๋„ ์Šคํƒ์„ ํƒ€๊ณ  ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌด์ˆ˜ํ•œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(Context Switching)๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ๋น„์šฉ์€ ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆด ๋•Œ ๋ ˆ์ดํ„ด์‹œ ์ŠคํŒŒ์ดํฌ์˜ ์ฃผ๋ฒ”์ด ๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ kube-proxy๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” iptables๋Š” ์„ ํ˜• ํƒ์ƒ‰(O(N))์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ 5,000๊ฐœ๋กœ ๋Š˜์–ด๋‚˜๋ฉด iptables ๋ฃฐ์€ 50,000๊ฐœ ์ด์ƒ์œผ๋กœ ํญ์ฆํ•˜๊ณ , ํŒจํ‚ท ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ด ๋ฃฐ์„ ์œ„์—์„œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์–ด ๋‚ด๋ ค๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ์ƒ๊ธธ ์ˆ˜๋ฐ–์— ์—†๋Š” ๊ตฌ์กฐ์ฃ .

eBPF๋Š” ์ด ๋‚ก์€ ๋ฃฐ์„ ์™„์ „ํžˆ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์žฌ๋ถ€ํŒ…ํ•  ํ•„์š” ์—†์ด, ์ปค๋„์˜ ๋Ÿฐํƒ€์ž„ ์ด๋ฒคํŠธ(์†Œ์ผ“ ์ƒ์„ฑ, ํŒจํ‚ท ์ˆ˜์‹  ๋“ฑ)์— ์ƒŒ๋“œ๋ฐ•์Šคํ™”๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ๋ฅผ ํ›…(Hook)์œผ๋กœ ๊ฑธ์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. iptables๋ฅผ ๊ฑฐ์น  ํ•„์š” ์—†์ด, O(1) ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” eBPF ํ•ด์‹œ ๋งต(Hash Map)์„ ํ†ตํ•ด ๋ชฉ์ ์ง€๋ฅผ ๋‹จ๋ฒˆ์— ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

๐Ÿ“Š ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์„ฑ๋Šฅ ๋น„๊ต: ์ „ํ†ต์  ์‚ฌ์ด๋“œ์นด vs eBPF (Cilium)

๋น„๊ต ํ•ญ๋ชฉ์ „ํ†ต์  ์‚ฌ์ด๋“œ์นด (Istio + iptables)eBPF (Cilium ๊ธฐ๋ฐ˜ ๋…ธ๋“œ ๋ ˆ๋ฒจ ๋ฉ”์‹œ)
ํŒจํ‚ท ๊ฒฝ๋กœ (L3/L4)Pod -> Proxy -> iptables -> NIC -> Proxy -> PodPod -> ์ปค๋„(eBPF ๋งต) -> Pod (๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŒ…)
์ปจํ…์ŠคํŠธ ์Šค์œ„์นญํ™‰(Hop)๋‹น ์ตœ์†Œ 4~6ํšŒ ๋ฐœ์ƒ (Kernel <-> User)์ปค๋„ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌ (Zero-Copy ์šฐํšŒ)
๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œPod ์ˆ˜์— ๋น„๋ก€ํ•˜์—ฌ ์„ ํ˜• ์ฆ๊ฐ€ (์ˆ˜์‹ญ~์ˆ˜๋ฐฑ MB x N๊ฐœ)๋…ธ๋“œ๋‹น 1๊ฐœ์˜ ์—์ด์ „ํŠธ(DaemonSet) + ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ (๊ทน์†Œ๋Ÿ‰)
๋ผ์šฐํŒ… ์‹œ๊ฐ„ ๋ณต์žก๋„O(N) (iptables ์ฒด์ธ ์„ ํ˜• ํƒ์ƒ‰)O(1) (eBPF BPF_MAP_TYPE_HASH ์กฐํšŒ)
๋ณด์•ˆ ๋ฐ ๊ฐ€์‹œ์„ฑ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต(L7) ๋ฐ ํ”„๋ก์‹œ ๋กœ๊ทธ ์œ„์ฃผ์ปค๋„ ํ•จ์ˆ˜, ์‹œ์Šคํ…œ ์ฝœ(Syscall) ๋‹จ์œ„์˜ ์‹ฌ์ธต ์ถ”์  ๊ฐ€๋Šฅ

๊ณผ์—ฐ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”? eBPF๊ฐ€ ์†Œ์ผ“ ํ†ต์‹ ์„ ์–ด๋–ป๊ฒŒ ๊ฐ€๋กœ์ฑ„๋Š”์ง€ ์›๋ฆฌ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์•„์ฃผ ๊ฐ„๋žตํ•œ C ์–ธ์–ด ๊ธฐ๋ฐ˜ eBPF ์˜์‚ฌ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ฃ . ์ด ์ฝ”๋“œ๋Š” ํŒจํ‚ท์ด ๋ณต์žกํ•œ TCP/IP ์Šคํƒ์„ ์ „๋ถ€ ๊ฑฐ์น˜์ง€ ์•Š๊ณ , sockmap์„ ์ด์šฉํ•ด ๋ชฉ์ ์ง€ ์†Œ์ผ“์œผ๋กœ ๋ฐ”๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์ž…๋‹ˆ๋‹ค.

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
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

// 1. ์†Œ์ผ“ ๋งต ์ •์˜ (์ปจํ…Œ์ด๋„ˆ/ํŒŒ๋“œ ๊ฐ„์˜ ์†Œ์ผ“ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ O(1)๋กœ ์กฐํšŒ)
struct {
    __uint(type, BPF_MAP_TYPE_SOCKHASH);
    __uint(max_entries, 65535);
    __type(key, struct sock_key);
    __type(value, __u32);
} sock_map SEC(".maps");

// 2. ์†Œ์ผ“ ์ „์†ก ๊ณ„์ธต(sk_msg)์— ํ›…(Hook)์„ ๊ฑฐ๋Š” eBPF ํ”„๋กœ๊ทธ๋žจ
SEC("sk_msg")
int bpf_tcp_bypass_proxy(struct sk_msg_md *msg) {
    struct sock_key key = {};
    
    // ๋ฉ”์‹œ์ง€์—์„œ ์ถœ๋ฐœ์ง€/๋ชฉ์ ์ง€ IP์™€ Port๋ฅผ ์ถ”์ถœํ•˜์—ฌ Key ์ƒ์„ฑ
    extract_key_from_msg(msg, &key); 

    // 3. ์ปค๋„ ๋งต์—์„œ ๋ชฉ์ ์ง€ ์†Œ์ผ“์„ ์ฐพ์•„ ๋„คํŠธ์›Œํฌ ์Šคํƒ์„ ์šฐํšŒํ•˜์—ฌ ๋‹ค์ด๋ ‰ํŠธ๋กœ ๊ฝ‚์•„๋ฒ„๋ฆผ
    if (bpf_sock_hash_update(msg, &sock_map, &key, BPF_ANY) == 0) {
        // BPF_F_INGRESS ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ๋ชฉ์ ์ง€ ์ˆ˜์‹  ๋ฒ„ํผ๋กœ ํŒจํ‚ท์„ ์ฆ‰์‹œ ์ „๋‹ฌ
        return bpf_msg_redirect_hash(msg, &sock_map, &key, BPF_F_INGRESS);
    }
    
    // ๋งต์— ๋ชฉ์ ์ง€ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ์ •์ƒ์ ์ธ TCP/IP ์Šคํƒ์„ ํƒ€๋„๋ก ํŒจ์Šค
    return SK_PASS; 
}

์œ„ ์ฝ”๋“œ๊ฐ€ JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ปค๋„์— ๋กœ๋“œ๋˜๋Š” ์ˆœ๊ฐ„, ๊ฐ™์€ ๋…ธ๋“œ ๋‚ด์˜ ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹ ์€ ๋ณต์žกํ•œ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์„ ๊นก๊ทธ๋ฆฌ ๋ฌด์‹œํ•˜๊ณ  ์ถœ๋ฐœ์ง€ ์†Œ์ผ“์—์„œ ๋ชฉ์ ์ง€ ์†Œ์ผ“์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ์—†์ด ๋‹ค์ด๋ ‰ํŠธ๋กœ ๊ฝ‚ํž™๋‹ˆ๋‹ค. โ€œ์„ฑ๋Šฅ์ด ์ข‹๋‹คโ€๋Š” ์‹์˜ ์ถ”์ƒ์ ์ธ ์นญ์ฐฌ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์ˆ ์ ์œผ๋กœ ์•„์˜ˆ ์ง€๋‚˜๊ฐ€์•ผ ํ•  ํ†จ๊ฒŒ์ดํŠธ ์ž์ฒด๋ฅผ ์ฒ ๊ฑฐํ•ด๋ฒ„๋ฆฐ ์…ˆ์ด์ฃ .


๐ŸŽฏ ํ˜„์—… 100% ๋ฐ€์ฐฉ ์‹œ๋‚˜๋ฆฌ์˜ค: ๊ณผ์—ฐ ํ˜„์—…์—์„œ๋„ ์ž˜ ๋จนํž๊นŒ์š”?

์ด๋ก ์ด ํ›Œ๋ฅญํ•œ ๊ฑด ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ์žฅ์•  ์ƒํ™ฉ์ด๋‚˜ ๋ ˆ๊ฑฐ์‹œ ์—ฐ๋™ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์–ด๋–จ๊นŒ์š”?

1. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ์ŠคํŒŒ์ดํฌ: ๋ธ”๋ž™ ํ”„๋ผ์ด๋ฐ์ด ๋ฐฉ์–ด์ „๊ณผ XDP ์ดˆ๋‹น ์ˆ˜์‹ญ๋งŒ ๊ฑด์˜ ์•…์˜์ ์ธ ๋ด‡ ํŠธ๋ž˜ํ”ฝ์ด๋‚˜ ์ด๋ฒคํŠธ ์š”์ฒญ์ด ์Ÿ์•„์งˆ ๋•Œ, ๊ธฐ์กด ํ™˜๊ฒฝ์—์„œ๋Š” ์•„๋ฌด๋ฆฌ iptables๋กœ ๋“œ๋กญ(Drop) ๋ฃฐ์„ ๊ฑธ์–ด๋„ ํŒจํ‚ท์ด ์ด๋ฏธ ์ปค๋„์˜ sk_buff(์†Œ์ผ“ ๋ฒ„ํผ) ๊ตฌ์กฐ์ฒด๋กœ ํ• ๋‹น๋œ ์ดํ›„์— ๋ฒ„๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— CPU ์Šค๋กœํ‹€๋ง์„ ํ”ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ eBPF์˜ XDP(eXpress Data Path) ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. XDP๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์นด๋“œ(NIC) ๋“œ๋ผ์ด๋ฒ„ ๋ ˆ๋ฒจ์—์„œ, ์ฆ‰ ํŒจํ‚ท์ด ํ˜ธ์ŠคํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ œ๋Œ€๋กœ ์˜ฌ๋ผ์˜ค๊ธฐ๋„ ์ „์— ์ปค์Šคํ…€ BPF ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ํŒจํ‚ท์„ ๋“œ๋กญ์‹œํ‚ค๊ฑฐ๋‚˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๋…ธ๋“œ ํ•˜๋‚˜๊ฐ€ ํŒจํ‚ท ์†์‹ค ์—†์ด ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” RPS(Requests Per Second)๊ฐ€ ๊ธฐ์กด ๋Œ€๋น„ 3~4๋ฐฐ ๋›ฐ๋Š” ๋งˆ๋ฒ•์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ข€๋น„ ํŒŒ๋“œ(Zombie Pod) ๋””๋ฒ„๊น…๊ณผ TCP ๋คํ”„์˜ ์ €์ฃผ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๊ฐ„ํ—์ ์œผ๋กœ 502 Bad Gateway๋‚˜ ํƒ€์ž„์•„์›ƒ์ด ๋‚˜๋Š”๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚จ๋Š” ์ƒํ™ฉ. ์ธํ”„๋ผํŒ€์€ tcpdump ๋œจ๊ณ  Wireshark๋กœ PCAP ํŒŒ์ผ ๋’ค์ ๊ฑฐ๋ฆฌ๋‹ค๊ฐ€ ๋ˆˆ์ด ๋น ์ง€๋ ค ํ•˜๊ณ , ๊ฐœ๋ฐœํŒ€์€ โ€œ์ฝ”๋“œ์—” ๋ฌธ์ œ์—†๋‹คโ€๊ณ  ๋ฐฉ์–ดํ•˜๋Š” ํ”ผ ๋ง๋ฆฌ๋Š” ํ•‘ํ ๊ฒŒ์ž„, ์ต์ˆ™ํ•˜์‹œ์ฃ ? eBPF๋ฅผ ํ™œ์šฉํ•œ Hubble(Cilium์˜ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ๋„๊ตฌ) ๊ฐ™์€ ํˆด์„ ๋„์ž…ํ•˜๋ฉด, ์ปค๋„๋‹จ์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  TCP ์žฌ์ „์†ก(Retransmission), ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€(RST), ํŒจํ‚ท ๋“œ๋กญ ๋‚ด์—ญ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์ˆ˜์ • 1์ค„ ์—†์ด ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฝ‘์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€œ10์‹œ 43๋ถ„์— Pod A์—์„œ Pod B๋กœ ๊ฐ€๋˜ ํŒจํ‚ท์ด ๋„ทํ•„ํ„ฐ(Netfilter) ๋ฃฐ์— ์˜ํ•ด ๋“œ๋กญ๋˜์—ˆ๋‹คโ€๋Š” ์ปค๋„ ๋ ˆ๋ฒจ์˜ ์ฆ๊ฑฐ๊ฐ€ ๋ช…ํ™•ํžˆ ๋‚˜์˜ค๋‹ˆ, ์žฅ์•  ์›์ธ ํŒŒ์•…(MTTR) ์‹œ๊ฐ„์ด ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.


๐Ÿ’€ ์‹œ๋‹ˆ์–ด์˜ ๊น๊นํ•œ ์‹œ์„ : ๋ฒค๋” ๋ฝ์ธ๊ณผ ์ˆจ๊ฒจ์ง„ ํ•จ์ •๋“ค

์ด์ฏค ๋˜๋ฉด ๋‹น์žฅ ๋‚ด์ผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐˆ์•„์—Ž๊ณ  ์‹ถ์œผ์‹œ๊ฒ ์ง€๋งŒ, ์ง„์งœ ์‹ค๋ฌด๋ฅผ ๋›ฐ๋Š” ์—”์ง€๋‹ˆ์–ด ์ž…์žฅ์—์„œ ๋ฐ˜๋“œ์‹œ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ์น˜๋ช…์ ์ธ ๋‹จ์ ๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฌด์‹œ๋ฌด์‹œํ•œ ์ปค๋„ ๋ฒ„์ „ ์˜์กด์„ฑ: eBPF์˜ ๊ฐ•๋ ฅํ•œ ์ตœ์‹  ๊ธฐ๋Šฅ(BPF ํŠธ๋žจํŽ„๋ฆฐ, ๋ง ๋ฒ„ํผ ๋“ฑ)์„ ์˜จ์ „ํžˆ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ตœ์‹  Linux ์ปค๋„(์ตœ์†Œ 4.19, ๊ถŒ์žฅ 5.x ์ด์ƒ)์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค. ๋ณด์ˆ˜์ ์ธ ๊ธˆ์œต๊ถŒ์ด๋‚˜ ์ž์ฒด ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ง์—์„œ ์•„์ง๋„ CentOS 7(์ปค๋„ 3.10)์ด๋‚˜ ๊ตฌํ˜• Ubuntu LTS๋ฅผ ๋Œ๋ฆฌ๊ณ  ์žˆ๋‹ค๋ฉด? ๊ธฐ์ˆ  ๋„์ž… ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ปค๋„ ์—…๊ทธ๋ ˆ์ด๋“œ๋ผ๋Š” ๊ฑฐ๋Œ€ํ•œ ์‚ฐ์„ ๋จผ์ € ๋„˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. L7 ํ”„๋ก์‹œ์˜ ์™„์ „ํ•œ ๋Œ€์ฒด๋Š” ์•„์ง ์‹œ๊ธฐ์ƒ์กฐ: eBPF๋Š” ์ปค๋„ ์ŠคํŽ˜์ด์Šค์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— L3/L4(IP, TCP/UDP) ๊ณ„์ธต์„ ๋‹ค๋ฃจ๋Š” ๋ฐ๋Š” ์‹ ์˜ ๊ฒฝ์ง€์— ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ HTTP/2 ํ—ค๋” ๊ธฐ๋ฐ˜์˜ ๋ณต์žกํ•œ ์นด๋‚˜๋ฆฌ ๋ฐฐํฌ ๋ผ์šฐํŒ…, gRPC ๋ฆฌํŠธ๋ผ์ด ๋กœ์ง, mTLS ์ธ์ฆ์„œ ๊ตํ™˜ ๊ฐ™์€ L7 ์˜์—ญ์˜ ๋ฌด๊ฑฐ์šด ์ž‘์—…์€ ๊ฒฐ๊ตญ ์ปค๋„ ์•ˆ์—์„œ ํŒŒ์‹ฑํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์œ„ํ—˜ํ•˜๊ณ  ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ Cilium ๊ฐ™์€ ์„ ๋‘ ์ฃผ์ž๋„ L7 ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋…ธ๋“œ๋‹น ํ•˜๋‚˜์˜ Envoy ํ”„๋ก์‹œ(DaemonSet ํ˜•ํƒœ)๋ฅผ ๋„์›Œ๋‘๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์˜ฌ๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰, ํŒŒ๋“œ๋งˆ๋‹ค ์กด์žฌํ•˜๋˜ ํ”„๋ก์‹œ๋ฅผ ๋…ธ๋“œ๋‹น ํ•˜๋‚˜๋กœ ์ค„์ธ ๊ฒƒ์ด์ง€, โ€˜100% Envoy-Freeโ€™๋Š” ์•„์ง ์ ˆ๋ฐ˜์˜ ์ง„์‹ค์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

  3. ๋””๋ฒ„๊น…์˜ ๋‚œํ•ดํ•จ (BPF Verifier์˜ ํšกํฌ): ํ˜น์‹œ๋ผ๋„ ์‚ฌ๋‚ด์˜ ๋…ํŠนํ•œ ๋„คํŠธ์›Œํฌ ์š”๊ตฌ์‚ฌํ•ญ ๋•Œ๋ฌธ์— ์ปค์Šคํ…€ eBPF ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์งœ์•ผ ํ•œ๋‹ค๋ฉด, ๋‹จ๋‹จํžˆ ๊ฐ์˜คํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋„ ํŒจ๋‹‰์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” BPF ๊ฒ€์ฆ๊ธฐ(Verifier)๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋‚˜ ์•ฝ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์นจ๋ฒ” ๊ฐ€๋Šฅ์„ฑ๋งŒ ๊ฐ์ง€ํ•ด๋„ ์ปดํŒŒ์ผ๊ณผ ๋กœ๋“œ ์ž์ฒด๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์•„์ฃผ ๊น๊นํ•œ Rust ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์‹ธ์šฐ๋Š” ๊ธฐ๋ถ„์ด๋ž„๊นŒ์š”? C ์–ธ์–ด๋กœ ํฌ์ธํ„ฐ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๋ณด๋‹ค ์ด ๊ฒ€์ฆ๊ธฐ ๋‹ฌ๋ž˜์„œ ์ปค๋„์— ์ฝ”๋“œ๋ฅผ ๋ฐ€์–ด ๋„ฃ๋Š” ๊ฒŒ ๋” ํž˜๋“ค๋‹ค๋Š” ๋ณผ๋ฉ˜์†Œ๋ฆฌ๊ฐ€ ๋‚˜์˜ค๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.


๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ: ์šฐ๋ฆฌ์˜ ์Šคํƒ ์Šค๋Š”?

eBPF๋Š” ๋‹จ์ˆœํ•œ ์œ ํ–‰์„ ๋„˜์–ด, ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๋„คํŠธ์›Œํ‚น๊ณผ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ์˜ โ€˜์ƒˆ๋กœ์šด ์šด์˜์ฒด์ œ(OS)โ€™๋กœ ๋น ๋ฅด๊ฒŒ ์ž๋ฆฌ ์žก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. โ€œ๊ณผ์—ฐ ๋„์ž…ํ•ด์•ผ ํ• ๊นŒ?โ€๋ผ๋Š” ์งˆ๋ฌธ์€ ์ด๋ฏธ ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ๊ณ ๋ฏผํ•ด์•ผ ํ•  ์‹œ์ ์ด์ฃ .

ํ•˜์ง€๋งŒ ๋งน๋ชฉ์ ์ธ ๊ธฐ์ˆ  ๋„์ž…์€ ๋Š˜ ์žฌ์•™์„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์˜ ๋ณ‘๋ชฉ์ด ์ง„์งœ โ€˜์‚ฌ์ด๋“œ์นด ํ”„๋ก์‹œ์˜ ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œโ€™ ๋•Œ๋ฌธ์ธ์ง€, ์•„๋‹ˆ๋ฉด โ€˜์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„ํšจ์œจ์ ์ธ DB N+1 ์ฟผ๋ฆฌโ€™ ๋•Œ๋ฌธ์ธ์ง€ ๋จผ์ € APM ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๊ฐ๊ด€์ ์ธ ์ง€ํ‘œ๋กœ ํ™•์ธํ•˜์„ธ์š”. ๋ฉ”ํŠธ๋ฆญ ๊ฒ€์ฆ ์—†๋Š” ์ธํ”„๋ผ ๊ต์ฒด๋Š” ๋ˆˆ์„ ๊ฐ€๋ฆฌ๊ณ  ์•„์šฐํ† ๋ฐ˜์„ ๋‹ฌ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ์‹ค์ œ๋กœ ๋กœ์ปฌ kind ํด๋Ÿฌ์Šคํ„ฐ์— Cilium์„ ์˜ฌ๋ ค์„œ, iptables ๋ชจ๋“œ์™€ eBPF ๋ชจ๋“œ์ผ ๋•Œ์˜ Nginx ๋ฒค์น˜๋งˆํฌ ๋ ˆ์ดํ„ด์‹œ ์ˆ˜์น˜๋ฅผ ๋ˆˆ์œผ๋กœ ์ง์ ‘ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Stay tuned! ๐Ÿ”ฅ

References

  • https://ebpf.io/what-is-ebpf/
  • https://cilium.io/blog/2021/12/01/cilium-service-mesh/
  • https://github.com/cilium/cilium
  • https://isovalent.com/blog/post/2021-12-ebpf-service-mesh/
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

ยฉ CAMORIX. ์ผ๋ถ€ ๊ถŒ๋ฆฌ ๋ณด์œ 

Powered by Jekyll with Chirpy theme