๐ฅ ์ฌ์ด๋์นด(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 -> Pod | Pod -> ์ปค๋(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) ์๊ฐ์ด ํ๊ธฐ์ ์ผ๋ก ์ค์ด๋ญ๋๋ค.
๐ ์๋์ด์ ๊น๊นํ ์์ : ๋ฒค๋ ๋ฝ์ธ๊ณผ ์จ๊ฒจ์ง ํจ์ ๋ค
์ด์ฏค ๋๋ฉด ๋น์ฅ ๋ด์ผ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์์๊ณ ์ถ์ผ์๊ฒ ์ง๋ง, ์ง์ง ์ค๋ฌด๋ฅผ ๋ฐ๋ ์์ง๋์ด ์ ์ฅ์์ ๋ฐ๋์ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ์น๋ช ์ ์ธ ๋จ์ ๊ณผ ํธ๋ ์ด๋์คํ๊ฐ ์์ต๋๋ค.
๋ฌด์๋ฌด์ํ ์ปค๋ ๋ฒ์ ์์กด์ฑ: eBPF์ ๊ฐ๋ ฅํ ์ต์ ๊ธฐ๋ฅ(BPF ํธ๋จํ๋ฆฐ, ๋ง ๋ฒํผ ๋ฑ)์ ์จ์ ํ ์ฌ์ฉํ๋ ค๋ฉด ์ต์ Linux ์ปค๋(์ต์ 4.19, ๊ถ์ฅ 5.x ์ด์)์ด ๊ฐ์ ๋ฉ๋๋ค. ๋ณด์์ ์ธ ๊ธ์ต๊ถ์ด๋ ์์ฒด ์จํ๋ ๋ฏธ์ค ๋ง์์ ์์ง๋ CentOS 7(์ปค๋ 3.10)์ด๋ ๊ตฌํ Ubuntu LTS๋ฅผ ๋๋ฆฌ๊ณ ์๋ค๋ฉด? ๊ธฐ์ ๋์ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ปค๋ ์ ๊ทธ๋ ์ด๋๋ผ๋ ๊ฑฐ๋ํ ์ฐ์ ๋จผ์ ๋์ด์ผ ํฉ๋๋ค.
L7 ํ๋ก์์ ์์ ํ ๋์ฒด๋ ์์ง ์๊ธฐ์์กฐ: eBPF๋ ์ปค๋ ์คํ์ด์ค์์ ๋์ํ๊ธฐ ๋๋ฌธ์ L3/L4(IP, TCP/UDP) ๊ณ์ธต์ ๋ค๋ฃจ๋ ๋ฐ๋ ์ ์ ๊ฒฝ์ง์ ์ฌ๋์ต๋๋ค. ํ์ง๋ง HTTP/2 ํค๋ ๊ธฐ๋ฐ์ ๋ณต์กํ ์นด๋๋ฆฌ ๋ฐฐํฌ ๋ผ์ฐํ , gRPC ๋ฆฌํธ๋ผ์ด ๋ก์ง, mTLS ์ธ์ฆ์ ๊ตํ ๊ฐ์ L7 ์์ญ์ ๋ฌด๊ฑฐ์ด ์์ ์ ๊ฒฐ๊ตญ ์ปค๋ ์์์ ํ์ฑํ๊ธฐ์๋ ๋๋ฌด ์ํํ๊ณ ๋ณต์กํฉ๋๋ค. ๊ฒฐ๊ตญ Cilium ๊ฐ์ ์ ๋ ์ฃผ์๋ L7 ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ ธ๋๋น ํ๋์ Envoy ํ๋ก์(DaemonSet ํํ)๋ฅผ ๋์๋๊ณ ํธ๋ํฝ์ ์ฌ๋ ค๋ณด๋ ๋๋ค. ์ฆ, ํ๋๋ง๋ค ์กด์ฌํ๋ ํ๋ก์๋ฅผ ๋ ธ๋๋น ํ๋๋ก ์ค์ธ ๊ฒ์ด์ง, โ100% Envoy-Freeโ๋ ์์ง ์ ๋ฐ์ ์ง์ค์ ๋ถ๊ณผํฉ๋๋ค.
๋๋ฒ๊น ์ ๋ํดํจ (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/