refactor: 문서 개선 중

This commit is contained in:
donghyeon-ka
2026-09-21 14:30:55 +09:00
parent c93cdea150
commit 805a18f486
1497 changed files with 525837 additions and 59152 deletions
@@ -0,0 +1,230 @@
{
"version": "1.1",
"id": "two-l7-hops-entry-recursion",
"title": "L7 두 홉과 진입점 이중화 재귀",
"question": "요청은 왜 nginx와 Traefik이라는 두 L7 홉을 지나며, nginx를 두 대로 늘리면 왜 다시 selector가 필요한가",
"type": "architecture",
"direction": "LR",
"audience": [
"실험대의 nginx와 Traefik 역할을 구분하려는 개발자",
"진입점 이중화가 왜 새 SPOF를 만드는지 이해하려는 운영자"
],
"summary": "정상 요청은 브라우저에서 edge nginx, Traefik, Pod 순으로 흐르고 두 L7 홉은 서로 다른 라우팅 범위를 맡는다. edge nginx를 두 대로 늘리면 어느 nginx를 고를 selector가 필요해지고 그 selector가 다시 단일 장애점이 된다.",
"alt": "브라우저에서 edge nginx와 Traefik을 거쳐 Pod로 가는 두 L7 홉과, edge nginx를 두 대로 늘릴 때 앞단 selector가 새 단일 장애점이 되는 재귀를 함께 보여 주는 흐름도.",
"long_description": "왼쪽의 정상 경로는 브라우저가 TLS를 edge nginx에서 종료하고 고정 노드 IP로 전달한 뒤, Traefik이 동적으로 Pod를 고르는 흐름이다. 아래쪽 이중화 경로는 nginx-1과 nginx-2 앞에 selector를 두면 어느 nginx로 갈지 정할 수 있지만 selector 자체가 새 SPOF가 되어 같은 질문이 반복된다는 점을 보여 준다. VRRP·DNS·BGP·클라우드 LB 같은 재귀 종료 방식의 상세 비교는 본문 표에 남기고 그림에는 넣지 않는다.",
"source_context": {
"document": "docs/virtualization/final/document.md",
"document_sha256": "8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210",
"anchor": {
"kind": "heading",
"value": "261. 진입점 자체가 죽으면 — 로드밸런서의 재귀 문제",
"line": 15796
}
},
"composition": {
"profile": "component-flow",
"diagram_only": true,
"reference_ids": [
"payment-event-flow"
],
"rationale": "핵심은 요청과 선택 경로의 방향성이다. 비교표보다 엣지를 지웠을 때 의미가 더 크게 사라지므로 component-flow로 그린다.",
"focus_node": "edge-nginx"
},
"groups": [],
"nodes": [
{
"id": "browser",
"label": "Browser",
"kind": "actor",
"role": "source",
"shape": "actor",
"description": "외부 요청의 시작점.",
"evidence": [
{
"start_line": 15860,
"end_line": 15864
}
],
"assumption": false
},
{
"id": "edge-nginx",
"label": "edge nginx",
"kind": "service",
"role": "service",
"emphasis": "primary",
"details": [
"L7",
"TLS 종료",
"고정 노드 선택"
],
"description": "클러스터 밖 진입점. TLS와 인증서, forwarded header, 어느 노드로 보낼지를 맡는다.",
"evidence": [
{
"start_line": 15860,
"end_line": 15882
}
],
"assumption": false
},
{
"id": "traefik",
"label": "Traefik",
"kind": "service",
"role": "service",
"details": [
"L7",
"Ingress",
"동적 Pod 선택"
],
"description": "클러스터 안에서 Service/Ingress 상태를 따라 어느 Pod로 보낼지 정한다.",
"evidence": [
{
"start_line": 15872,
"end_line": 15882
}
],
"assumption": false
},
{
"id": "pod",
"label": "Pod",
"kind": "runtime",
"role": "sink",
"description": "Traefik이 선택한 실제 워크로드.",
"evidence": [
{
"start_line": 15860,
"end_line": 15864
}
],
"assumption": false
},
{
"id": "selector",
"label": "앞단 selector",
"kind": "service",
"role": "service",
"details": [
"edge redundancy"
],
"description": "nginx를 여러 머신으로 이중화했을 때 어느 nginx로 갈지 정하는 새 앞단.",
"evidence": [
{
"start_line": 15941,
"end_line": 15945
}
],
"assumption": false
},
{
"id": "nginx-pair",
"label": "nginx-1 · nginx-2",
"kind": "service",
"role": "service",
"details": [
"서로 다른 머신"
],
"description": "진짜 이중화를 위해 머신을 늘린 edge nginx 쌍.",
"evidence": [
{
"start_line": 15934,
"end_line": 15944
}
],
"assumption": false
},
{
"id": "new-spof",
"label": "selector가 새 SPOF",
"kind": "result",
"role": "sink",
"description": "selector를 하나 더 두면 같은 단일 장애점 질문이 한 단계 앞으로 이동한다.",
"evidence": [
{
"start_line": 15941,
"end_line": 15952
}
],
"assumption": false
}
],
"edges": [
{
"id": "browser-edge",
"from": "browser",
"to": "edge-nginx",
"label": "HTTPS",
"kind": "request",
"evidence": [
{
"start_line": 15860,
"end_line": 15864
}
],
"assumption": false
},
{
"id": "edge-traefik",
"from": "edge-nginx",
"to": "traefik",
"label": "노드 선택 · HTTP",
"kind": "request",
"evidence": [
{
"start_line": 15872,
"end_line": 15882
}
],
"assumption": false
},
{
"id": "traefik-pod",
"from": "traefik",
"to": "pod",
"label": "Ingress routing",
"kind": "request",
"evidence": [
{
"start_line": 15860,
"end_line": 15882
}
],
"assumption": false
},
{
"id": "selector-pair",
"from": "selector",
"to": "nginx-pair",
"label": "nginx 선택",
"kind": "request",
"style": "dashed",
"evidence": [
{
"start_line": 15941,
"end_line": 15945
}
],
"assumption": false
},
{
"id": "selector-spof",
"from": "selector",
"to": "new-spof",
"label": "단일 selector",
"kind": "result",
"style": "dashed",
"evidence": [
{
"start_line": 15941,
"end_line": 15952
}
],
"assumption": false
}
],
"legend": [],
"metadata": {
"rationale": "두 L7 홉의 역할 차이와 진입점 이중화 재귀만 남겼다. VRRP의 상세 동작은 별도 본문 설명이므로 그림에서 제외한다."
}
}