Files
project-infra/presentation/diagrams/s15-ingress-to-gatewayapi.drawio

141 lines
15 KiB
Plaintext

<mxfile host="app.diagrams.net" modified="2026-05-08T00:00:00.000Z" agent="Mozilla/5.0" version="24.0.0" type="device">
<diagram name="s15-ingress-to-gatewayapi" id="gatewayapi">
<mxGraphModel dx="1600" dy="900" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="900" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="title" value="기술 진화 — Ingress → Gateway API" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=26;fontStyle=1;fontFamily=Pretendard,Helvetica;" vertex="1" parent="1">
<mxGeometry x="60" y="36" width="1500" height="40" as="geometry" />
</mxCell>
<mxCell id="subtitle" value="annotation 의존 단일 객체 → 역할 분리된 3 객체 (GatewayClass · Gateway · HTTPRoute) + vendor 표준화" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=15;fontFamily=Pretendard,Helvetica;fontColor=#57606A;" vertex="1" parent="1">
<mxGeometry x="60" y="76" width="1500" height="22" as="geometry" />
</mxCell>
<mxCell id="grp-before" value="Before — Ingress (annotation 의존)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FEE2E2;strokeColor=#B91C1C;strokeWidth=2;fontSize=16;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#B91C1C;align=left;verticalAlign=top;spacingLeft=14;spacingTop=10;" vertex="1" parent="1">
<mxGeometry x="40" y="120" width="740" height="660" as="geometry" />
</mxCell>
<mxCell id="ingress-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#B91C1C;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="80" y="170" width="660" height="320" as="geometry" />
</mxCell>
<mxCell id="ingress-title" value="kind: Ingress · apiVersion: networking.k8s.io/v1" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#B91C1C;spacingLeft=14;spacingTop=8;" vertex="1" parent="1">
<mxGeometry x="80" y="170" width="660" height="22" as="geometry" />
</mxCell>
<mxCell id="yaml-pre" value="metadata:&#xa; name: a-com&#xa; annotations:" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;fontSize=11;fontFamily=monospace;fontColor=#24292F;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="80" y="198" width="660" height="60" as="geometry" />
</mxCell>
<mxCell id="yaml-vendor-bg" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FECACA;strokeColor=#B91C1C;strokeWidth=1;dashed=1;" vertex="1" parent="1">
<mxGeometry x="88" y="258" width="644" height="120" as="geometry" />
</mxCell>
<mxCell id="yaml-vendor" value=" nginx.ingress.kubernetes.io/canary: &quot;true&quot;&#xa; nginx.ingress.kubernetes.io/canary-weight: &quot;30&quot;&#xa; traefik.ingress.kubernetes.io/router.middlewares: kube-system-auth@...&#xa; traefik.ingress.kubernetes.io/router.tls.options: kube-system-modern-tls@...&#xa; cert-manager.io/cluster-issuer: letsencrypt-prod" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;fontSize=11;fontFamily=monospace;fontColor=#B91C1C;fontStyle=1;spacingLeft=14;spacingTop=6;" vertex="1" parent="1">
<mxGeometry x="80" y="258" width="660" height="120" as="geometry" />
</mxCell>
<mxCell id="yaml-vendor-tag" value="◀ vendor 별 annotation soup (파편화)" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#B91C1C;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="500" y="358" width="240" height="18" as="geometry" />
</mxCell>
<mxCell id="yaml-spec" value="spec:&#xa; ingressClassName: traefik&#xa; rules:&#xa; - host: a.com&#xa; http:&#xa; paths:&#xa; - { path: /api, pathType: Prefix, backend: { service: { name: a-svc, port: 80 } } }" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;fontSize=11;fontFamily=monospace;fontColor=#24292F;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="80" y="384" width="660" height="100" as="geometry" />
</mxCell>
<mxCell id="bad1" value="✗ vendor 마다 annotation key 다름 — 같은 의도, 다른 문법 (파편화)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FECACA;strokeColor=#B91C1C;strokeWidth=2;dashed=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#7F1D1D;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="80" y="510" width="660" height="50" as="geometry" />
</mxCell>
<mxCell id="bad2" value="✗ 카나리·헤더·가중치 라우팅 → annotation 으로 우회 (spec 외 기능)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FECACA;strokeColor=#B91C1C;strokeWidth=2;dashed=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#7F1D1D;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="80" y="570" width="660" height="50" as="geometry" />
</mxCell>
<mxCell id="bad3" value="✗ 서비스 메쉬 (Istio · Linkerd) 통합 어색 — 메쉬는 별도 CRD 사용" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FECACA;strokeColor=#B91C1C;strokeWidth=2;dashed=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#7F1D1D;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="80" y="630" width="660" height="50" as="geometry" />
</mxCell>
<mxCell id="bad4" value="✗ RBAC 단위 = Ingress 객체 1 개 — 인프라/운영/개발 권한 분리 어려움" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FECACA;strokeColor=#B91C1C;strokeWidth=2;dashed=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#7F1D1D;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="80" y="690" width="660" height="50" as="geometry" />
</mxCell>
<mxCell id="grp-after" value="After — Gateway API (역할 분리 · 표준 spec)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#DCFCE7;strokeColor=#15803D;strokeWidth=2;fontSize=16;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#15803D;align=left;verticalAlign=top;spacingLeft=14;spacingTop=10;" vertex="1" parent="1">
<mxGeometry x="820" y="120" width="740" height="660" as="geometry" />
</mxCell>
<mxCell id="gc-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFE4E6;strokeColor=#BE123C;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="850" y="170" width="680" height="115" as="geometry" />
</mxCell>
<mxCell id="gc-role" value="인프라 관리자" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#BE123C;strokeColor=#BE123C;fontColor=#FFFFFF;fontSize=11;fontStyle=1;fontFamily=Pretendard,Helvetica;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="864" y="184" width="120" height="24" as="geometry" />
</mxCell>
<mxCell id="gc-title" value="kind: GatewayClass" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#BE123C;" vertex="1" parent="1">
<mxGeometry x="996" y="184" width="280" height="24" as="geometry" />
</mxCell>
<mxCell id="gc-yaml" value="spec:&#xa; controllerName: traefik.io/gateway-controller" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;fontSize=11;fontFamily=monospace;fontColor=#7F1D1D;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="864" y="216" width="500" height="40" as="geometry" />
</mxCell>
<mxCell id="gc-note" value="어떤 컨트롤러를&#xa;쓸 것인가" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#BE123C;" vertex="1" parent="1">
<mxGeometry x="1380" y="210" width="140" height="50" as="geometry" />
</mxCell>
<mxCell id="gw-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FEF3C7;strokeColor=#B45309;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="850" y="335" width="680" height="135" as="geometry" />
</mxCell>
<mxCell id="gw-role" value="클러스터 운영자" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#B45309;strokeColor=#B45309;fontColor=#FFFFFF;fontSize=11;fontStyle=1;fontFamily=Pretendard,Helvetica;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="864" y="349" width="120" height="24" as="geometry" />
</mxCell>
<mxCell id="gw-title" value="kind: Gateway" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#B45309;" vertex="1" parent="1">
<mxGeometry x="996" y="349" width="280" height="24" as="geometry" />
</mxCell>
<mxCell id="gw-yaml" value="spec:&#xa; gatewayClassName: traefik&#xa; listeners:&#xa; - { protocol: HTTPS, port: 443, hostname: a.com,&#xa; tls: { certificateRefs: [tls-a-com] } }" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;fontSize=11;fontFamily=monospace;fontColor=#7F1D1D;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="864" y="381" width="500" height="80" as="geometry" />
</mxCell>
<mxCell id="gw-note" value="IP · 인증서&#xa;리스너" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#B45309;" vertex="1" parent="1">
<mxGeometry x="1380" y="380" width="140" height="50" as="geometry" />
</mxCell>
<mxCell id="hr-bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DBEAFE;strokeColor=#1E40AF;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="850" y="520" width="680" height="135" as="geometry" />
</mxCell>
<mxCell id="hr-role" value="서비스 개발자" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1E40AF;strokeColor=#1E40AF;fontColor=#FFFFFF;fontSize=11;fontStyle=1;fontFamily=Pretendard,Helvetica;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="864" y="534" width="120" height="24" as="geometry" />
</mxCell>
<mxCell id="hr-title" value="kind: HTTPRoute" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#1E40AF;" vertex="1" parent="1">
<mxGeometry x="996" y="534" width="280" height="24" as="geometry" />
</mxCell>
<mxCell id="hr-yaml" value="spec:&#xa; parentRefs:&#xa; - { name: a-com-gw }&#xa; hostnames: [a.com]&#xa; rules:&#xa; - matches: [{ path: { type: Prefix, value: /api } }]&#xa; backendRefs: [{ name: a-svc, port: 80 }]" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;fontSize=11;fontFamily=monospace;fontColor=#1E3A8A;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="864" y="566" width="500" height="90" as="geometry" />
</mxCell>
<mxCell id="hr-note" value="어디로 보낼지&#xa;(라우팅 규칙)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#1E40AF;" vertex="1" parent="1">
<mxGeometry x="1380" y="565" width="140" height="50" as="geometry" />
</mxCell>
<mxCell id="e-gw-gc" style="endArrow=classic;html=1;strokeColor=#15803D;strokeWidth=2;dashed=1;fontFamily=Pretendard,Helvetica;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="gw-bg" target="gc-bg">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e-gw-gc-lbl" value="spec.gatewayClassName" style="text;html=1;align=center;verticalAlign=middle;fontSize=11;fontFamily=monospace;fontColor=#15803D;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="1090" y="296" width="200" height="18" as="geometry" />
</mxCell>
<mxCell id="e-hr-gw" style="endArrow=classic;html=1;strokeColor=#15803D;strokeWidth=2;dashed=1;fontFamily=Pretendard,Helvetica;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="hr-bg" target="gw-bg">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e-hr-gw-lbl" value="spec.parentRefs" style="text;html=1;align=center;verticalAlign=middle;fontSize=11;fontFamily=monospace;fontColor=#15803D;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="1110" y="481" width="160" height="18" as="geometry" />
</mxCell>
<mxCell id="good1" value="✓ vendor 중립 표준 — annotation 0, spec 1급 시민" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#BBF7D0;strokeColor=#15803D;strokeWidth=2;dashed=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#14532D;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="850" y="675" width="680" height="30" as="geometry" />
</mxCell>
<mxCell id="good2" value="✓ 역할별 RBAC 가능 — 인프라/운영/개발 권한 분리" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#BBF7D0;strokeColor=#15803D;strokeWidth=2;dashed=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#14532D;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="850" y="710" width="680" height="30" as="geometry" />
</mxCell>
<mxCell id="good3" value="✓ 카나리·헤더 매칭이 spec — 서비스 메쉬 (Istio · Linkerd) 표준 통합" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#BBF7D0;strokeColor=#15803D;strokeWidth=2;dashed=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#14532D;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="850" y="745" width="680" height="30" as="geometry" />
</mxCell>
<mxCell id="caption-bg" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F6F8FA;strokeColor=#D0D7DE;" vertex="1" parent="1">
<mxGeometry x="40" y="800" width="1520" height="44" as="geometry" />
</mxCell>
<mxCell id="caption" value="Ingress 한 객체에 모든 책임 → Gateway API 는 인프라(GatewayClass) · 운영(Gateway) · 개발(HTTPRoute) 역할별 객체 3 계층 + vendor 표준화" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#24292F;" vertex="1" parent="1">
<mxGeometry x="40" y="800" width="1520" height="44" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>