<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Troubleshooting on blog.212clab</title><link>https://212clab.pages.dev/troubleshooting/</link><description>Recent content in Troubleshooting on blog.212clab</description><generator>Hugo</generator><language>ko-kr</language><lastBuildDate>Mon, 20 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://212clab.pages.dev/troubleshooting/index.xml" rel="self" type="application/rss+xml"/><item><title>OTel 메트릭 대시보드 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-04-20-otel-dashboard-gateway/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-20-otel-dashboard-gateway/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;Grafana 대시보드 &amp;ldquo;애플리케이션 모니터링(Spring Boot)&amp;ldquo;에서:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;애플리케이션 드롭다운에 gateway만 표시됨&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;auth-guard, order-core, seat, queue 등 다른 서비스가 보이지 않음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http_server_requests_seconds_count{namespace=&amp;quot;dev-webs&amp;quot;}&lt;/code&gt; 쿼리 시 gateway만 결과 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="1-메트릭-수집-경로가-2가지로-분리되어-있었음"&gt;1. 메트릭 수집 경로가 2가지로 분리되어 있었음&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;경로&lt;/th&gt;
 &lt;th&gt;메트릭 이름&lt;/th&gt;
 &lt;th&gt;라벨&lt;/th&gt;
 &lt;th&gt;대상&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;PodMonitor → Prometheus 직접 스크레이핑&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http_server_requests_seconds_*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;status&lt;/code&gt;, &lt;code&gt;uri&lt;/code&gt;, &lt;code&gt;namespace&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;gateway만&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OTel Agent → OTel Collector → Remote Write&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http_server_request_duration_seconds_*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http_response_status_code&lt;/code&gt;, &lt;code&gt;http_route&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;모든 서비스&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="2-gateway만-micrometer-메트릭이-있었던-이유"&gt;2. gateway만 Micrometer 메트릭이 있었던 이유&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;gateway: Spring Cloud Gateway로 &lt;code&gt;micrometer-registry-prometheus&lt;/code&gt; 의존성 포함&lt;/li&gt;
&lt;li&gt;다른 서비스: OTel Java Agent만 사용, Micrometer 의존성 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-otel-메트릭에-namespace-라벨-누락"&gt;3. OTel 메트릭에 namespace 라벨 누락&lt;/h3&gt;
&lt;p&gt;OTel Collector의 transform processor에서 &lt;code&gt;namespace&lt;/code&gt; 라벨을 설정하려 했으나:&lt;/p&gt;</description></item><item><title>모니터링 데이터 S3 Object Storage 적재 구조</title><link>https://212clab.pages.dev/troubleshooting/2026-04-20-monitoring-s3-object-storage/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-20-monitoring-s3-object-storage/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;Staging 환경에서 Spot 인스턴스가 회수되고 새 노드가 다른 AZ에 생성되었을 때, 모니터링 Pod(Loki, Tempo 등)가 기존 PVC를 마운트하지 못하고 Pending 상태에 빠지는 문제가 발생했다.&lt;/p&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Spot 노드 회수 → 새 노드가 다른 AZ(예: ap-northeast-2a → 2c)에 프로비저닝&lt;/li&gt;
&lt;li&gt;모니터링 Pod 재스케줄 → 기존 PVC(EBS)가 이전 AZ에 고정되어 있어 마운트 실패&lt;/li&gt;
&lt;li&gt;Pod: &lt;code&gt;Pending&lt;/code&gt; → &lt;code&gt;Warning: FailedAttachVolume&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;로그/트레이스 수집 중단&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="근본-원인-ebs는-단일-az에-바인딩된다"&gt;근본 원인: EBS는 단일 AZ에 바인딩된다&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[기존 상태]
 Node (ap-northeast-2a) ← Spot
 └── Loki Pod
 └── PVC → EBS (ap-northeast-2a에 고정)

[Spot 회수 후]
 Node (ap-northeast-2c) ← 새로 프로비저닝
 └── Loki Pod (Pending)
 └── PVC → EBS (ap-northeast-2a) ← 마운트 불가!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;EBS 볼륨은 생성된 AZ에서만 사용할 수 있다. Spot 인스턴스는 가용한 AZ 어디든 뜰 수 있기 때문에 AZ 불일치가 빈번하게 발생했다.&lt;/p&gt;</description></item><item><title>환경별 모니터링 대시보드 분기처리</title><link>https://212clab.pages.dev/troubleshooting/2026-04-20-monitoring-dashboard-env-split/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-20-monitoring-dashboard-env-split/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;Dev(kubeadm)와 Staging(EKS) 환경의 인프라 구성이 달라서 모니터링 대시보드가 작동하지 않는 문제 발생.&lt;/p&gt;
&lt;h3 id="환경별-인프라-차이"&gt;환경별 인프라 차이&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구성요소&lt;/th&gt;
 &lt;th&gt;Dev (kubeadm)&lt;/th&gt;
 &lt;th&gt;Staging (EKS)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;로컬 Pod (postgres:16-alpine)&lt;/td&gt;
 &lt;td&gt;AWS RDS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;로컬 Pod (redis:7-alpine)&lt;/td&gt;
 &lt;td&gt;AWS ElastiCache&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;메트릭 수집&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Prometheus exporter&lt;/td&gt;
 &lt;td&gt;CloudWatch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;데이터소스&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Prometheus&lt;/td&gt;
 &lt;td&gt;CloudWatch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dev 환경에서 &amp;ldquo;RDS PostgreSQL 모니터링&amp;rdquo; 대시보드 → &lt;strong&gt;No data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Dev 환경에서 &amp;ldquo;ElastiCache Redis 모니터링&amp;rdquo; 대시보드 → &lt;strong&gt;No data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;원인: CloudWatch 데이터소스가 없음 (AWS 환경이 아님)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="해결"&gt;해결&lt;/h2&gt;
&lt;h3 id="1-환경별-대시보드-분리"&gt;1. 환경별 대시보드 분리&lt;/h3&gt;
&lt;p&gt;동일한 기능의 대시보드를 두 가지 버전으로 생성:&lt;/p&gt;</description></item><item><title>CloudTrail + S3 Bucket Policy 순환 의존성 문제</title><link>https://212clab.pages.dev/troubleshooting/2026-04-13-cloudtrail-s3-circular-dependency/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-13-cloudtrail-s3-circular-dependency/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;stacks/audit-security/&lt;/code&gt;에서 CloudTrail을 활성화하려고 &lt;code&gt;terraform apply&lt;/code&gt; 실행.&lt;/p&gt;
&lt;h3 id="에러"&gt;에러&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Error: creating CloudTrail Trail (playball-audit-trail): InsufficientS3BucketPolicyException: 
Incorrect S3 bucket policy is detected for bucket: playball-audit-logs
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;순환 의존성(Circular Dependency):&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CloudTrail 생성 → S3 bucket policy에 CloudTrail 쓰기 권한 필요
 ↕
S3 bucket policy → CloudTrail ARN 참조 필요 (module.cloudtrail.source_arn)
 ↕
CloudTrail ARN → CloudTrail이 생성되어야 존재
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;코드에서 &lt;code&gt;dynamic &amp;quot;statement&amp;quot;&lt;/code&gt;로 &lt;code&gt;module.cloudtrail.source_arn != null&lt;/code&gt;일 때만 policy를 추가하도록 했는데, CloudTrail이 아직 안 만들어졌으니 &lt;code&gt;source_arn = null&lt;/code&gt; → dynamic block 스킵 → policy에 CloudTrail 권한 없음 → CloudTrail 생성 실패.&lt;/p&gt;</description></item><item><title>Route53 레코드 삭제 + Secrets Manager 초기화 문제</title><link>https://212clab.pages.dev/troubleshooting/2026-04-10-external-dns-sync-secrets/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-10-external-dns-sync-secrets/</guid><description>&lt;blockquote&gt;
&lt;p&gt;2026-04-10 | Prod 팀원 apply 시 Route53 삭제, Secret 값 초기화 이슈&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Route53 레코드 삭제&lt;/strong&gt;: EKS 재기동/축소 후 Route53 레코드가 사라짐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secrets Manager 초기화&lt;/strong&gt;: &lt;code&gt;terraform apply&lt;/code&gt; 시 DB/Redis 비밀번호 등이 덮어써짐&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="원인-1-external-dns-policy-sync"&gt;원인 1: external-dns &lt;code&gt;policy: sync&lt;/code&gt;&lt;/h2&gt;
&lt;h3 id="문제"&gt;문제&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;policy&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;sync &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 레코드 삭제도 허용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;policy: sync&lt;/code&gt;는 k8s의 Ingress/Service가 삭제되면 &lt;strong&gt;해당 Route53 레코드도 삭제&lt;/strong&gt;.
EKS를 내리거나 축소하면 → Ingress 삭제 → external-dns가 Route53 레코드 삭제.&lt;/p&gt;
&lt;h3 id="흐름"&gt;흐름&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;EKS 종료/축소
 → Ingress 리소스 삭제
 → external-dns: &amp;#34;이 Ingress에 연결된 DNS 레코드 삭제해야지&amp;#34; (sync 정책)
 → Route53에서 argocd.playball.one, grafana.playball.one 등 삭제
 → 서비스 접근 불가
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="수정"&gt;수정&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# staging/prod 양쪽&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;policy&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;upsert-only &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 레코드 생성/갱신만, 삭제 안 함&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="수정-파일"&gt;수정 파일&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;파일&lt;/th&gt;
 &lt;th&gt;브랜치&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;303-goormgb-k8s-helm/staging/values/infra/values-external-dns.yaml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;develop, argocd-sync/staging&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;303-goormgb-k8s-helm/prod/values/infra/values-external-dns.yaml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;develop, argocd-sync/prod&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="upsert-only-vs-sync"&gt;upsert-only vs sync&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;sync&lt;/th&gt;
 &lt;th&gt;upsert-only&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;레코드 생성&lt;/td&gt;
 &lt;td&gt;O&lt;/td&gt;
 &lt;td&gt;O&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;레코드 갱신&lt;/td&gt;
 &lt;td&gt;O&lt;/td&gt;
 &lt;td&gt;O&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;레코드 삭제&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O (위험)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;X&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;EKS 재기동&lt;/td&gt;
 &lt;td&gt;레코드 삭제됨&lt;/td&gt;
 &lt;td&gt;레코드 유지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="참고"&gt;참고&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;upsert-only&lt;/code&gt;에서는 불필요한 레코드가 남을 수 있음 → 수동 정리 필요&lt;/li&gt;
&lt;li&gt;레코드 자동 삭제가 필요하면 &lt;code&gt;--txt-owner-id&lt;/code&gt;로 ownership 관리 후 &lt;code&gt;sync&lt;/code&gt; 사용 가능하지만, EKS가 자주 올리고 내리는 환경에서는 &lt;code&gt;upsert-only&lt;/code&gt;가 안전&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="원인-2-secrets-manager-secret_version-덮어쓰기"&gt;원인 2: Secrets Manager &lt;code&gt;secret_version&lt;/code&gt; 덮어쓰기&lt;/h2&gt;
&lt;h3 id="문제-prod"&gt;문제 (Prod)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# prod/secrets.tf (수정 전)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aws_secretsmanager_secret_version&amp;#34; &amp;#34;discord&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secret_string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;jsonencode&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;common_secrets&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;prod/monitoring/discord-webhook-alerts&amp;#34;&lt;/span&gt;])&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; # lifecycle ignore_changes 없음 → apply마다 tfvars 값으로 덮어씀
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;terraform apply&lt;/code&gt;할 때마다:&lt;/p&gt;</description></item><item><title>Istio Sidecar 시작 타이밍 (holdApplicationUntilProxyStarts)</title><link>https://212clab.pages.dev/troubleshooting/2026-04-08-istio-sidecar-startup-timing/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-08-istio-sidecar-startup-timing/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;dev-webs Pod가 1/2 Running 상태로 멈춤. readiness probe가 &lt;code&gt;context deadline exceeded&lt;/code&gt; 에러 발생.&lt;/p&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n dev-webs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# NAME READY STATUS RESTARTS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# dev-api-gateway-xxx 1/2 Running 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl describe pod dev-api-gateway-xxx -n dev-webs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Readiness probe failed: Get &amp;#34;http://10.x.x.x:8085/actuator/health/readiness&amp;#34;: context deadline exceeded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;Istio sidecar(envoy-proxy)가 완전히 시작되기 전에 앱 컨테이너가 먼저 시작됨.
앱이 외부 서비스(DB, Redis 등)에 연결하려고 하면 sidecar가 아직 준비 안 되어서 실패.&lt;/p&gt;</description></item><item><title>k6-operator MaxVUs Parallelism Error</title><link>https://212clab.pages.dev/troubleshooting/2026-04-05-k6-operator-maxvus/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-05-k6-operator-maxvus/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;4000 VU 부하테스트 실행 시 즉시 실패:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Status: error (Pod: Succeeded)
Summary not available (test may have ended too quickly)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;k6-operator 로그:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;k6 inspect: {MaxVUs:1 ...}
ERROR: Parallelism argument cannot be larger than maximum VUs in the script
{&amp;#34;maxVUs&amp;#34;: 1, &amp;#34;parallelism&amp;#34;: 2, &amp;#34;error&amp;#34;: &amp;#34;number of instances &amp;gt; number of VUs&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="k6-operator-실행-흐름"&gt;k6-operator 실행 흐름&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. TestRun CR 생성
 ↓
2. Initializer Pod 실행
 - k6 inspect: 스크립트 분석 (maxVUs 확인) ← 환경변수 없음!
 - k6 archive: 스크립트 압축
 ↓
3. Runner Pod 생성 (VUS, DURATION 환경변수 주입)
 ↓
4. 테스트 실행
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="문제-코드"&gt;문제 코드&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// scripts.go에서 생성되는 k6 스크립트
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_vus&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;K6_VUS&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; parseInt(&lt;span style="color:#a6e22e"&gt;__ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;K6_VUS&lt;/span&gt;) &lt;span style="color:#f92672"&gt;:&lt;/span&gt; (parseInt(&lt;span style="color:#a6e22e"&gt;__ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;VUS&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ↑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 기본값 1!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;단계&lt;/th&gt;
 &lt;th&gt;환경변수&lt;/th&gt;
 &lt;th&gt;_vus 값&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;k6 inspect (Initializer)&lt;/td&gt;
 &lt;td&gt;없음&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;1&lt;/strong&gt; (기본값)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;k6 run (Runner)&lt;/td&gt;
 &lt;td&gt;VUS=4000&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;4000&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;k6 inspect는 스크립트의 &lt;code&gt;export const options&lt;/code&gt;를 분석해서 maxVUs를 결정함.
환경변수가 없으면 기본값 1이 사용되어 maxVUs=1로 판단됨.&lt;/p&gt;</description></item><item><title>DiskPressure &amp; CrashLoopBackOff Troubleshooting</title><link>https://212clab.pages.dev/troubleshooting/2026-04-02-disk-pressure-crashloop/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-04-02-disk-pressure-crashloop/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mini-gmk 노드에서 argocd-repo-server 파드가 1,253개 생성됨 (Evicted 상태)&lt;/li&gt;
&lt;li&gt;DiskPressure: True&lt;/li&gt;
&lt;li&gt;여러 서비스 CrashLoopBackOff (ai-defense, seat 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="1-diskpressure-mini-gmk"&gt;1. DiskPressure (mini-gmk)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;경로&lt;/th&gt;
 &lt;th&gt;용량&lt;/th&gt;
 &lt;th&gt;원인&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;/opt/local-path-provisioner&lt;/td&gt;
 &lt;td&gt;53G&lt;/td&gt;
 &lt;td&gt;Loki chunks 40G + orphan PV&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Loki retention&lt;/td&gt;
 &lt;td&gt;없음&lt;/td&gt;
 &lt;td&gt;로그가 무한 축적&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="2-crashloopbackoff"&gt;2. CrashLoopBackOff&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;서비스&lt;/th&gt;
 &lt;th&gt;원인&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;staging ai-defense&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;imagePullSecrets: []&lt;/code&gt; 누락 (기본값 ecr-pull-secret 사용)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;dev ai-defense&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;TM_OFFLINE_LLM_AUDIT_PATH&lt;/code&gt; 누락 (PermissionError: logs/)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;dev seat&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;SPRING_KAFKA_BOOTSTRAP_SERVERS&lt;/code&gt; 누락&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="해결"&gt;해결&lt;/h2&gt;
&lt;h3 id="diskpressure-해결"&gt;DiskPressure 해결&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. orphan PV 삭제 (~8G 확보)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /opt/local-path-provisioner/pvc-*_data_cloudbeaver-data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /opt/local-path-provisioner/pvc-*_monitoring_data-prometheus-*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# (사용 중이 아닌 PV들)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. Loki chunks 삭제 (~40G 확보)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo find /opt/local-path-provisioner/pvc-*_monitoring_storage-loki-0/chunks -type f -mtime +1 -delete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /opt/local-path-provisioner/pvc-*_monitoring_storage-loki-0/chunks/*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. 시스템 로그 정리&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo journalctl --vacuum-size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;200M
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 4. Evicted 파드 기록 삭제&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl delete pods -A --field-selector&lt;span style="color:#f92672"&gt;=&lt;/span&gt;status.phase&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl delete pods -A --field-selector&lt;span style="color:#f92672"&gt;=&lt;/span&gt;status.phase&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Succeeded
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="helm-values-수정"&gt;Helm Values 수정&lt;/h3&gt;
&lt;h4 id="1-loki-retention-추가-devstaging"&gt;1. Loki retention 추가 (dev/staging)&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# dev/values/monitoring/values-loki.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;loki&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;compactor&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;retention_enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;delete_request_store&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;filesystem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;limits_config&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;retention_period&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;72h &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 3일&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-revisionhistorylimit-추가-공통-차트"&gt;2. revisionHistoryLimit 추가 (공통 차트)&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# common-charts/apps/java-service/templates/deployment.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# common-charts/apps/ai-service/templates/deployment.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;revisionHistoryLimit&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-staging-ai-defense-imagepullsecrets"&gt;3. staging ai-defense imagePullSecrets&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# staging/values/apps/values-ai-defense.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;imagePullSecrets&lt;/span&gt;: [] &lt;span style="color:#75715e"&gt;# IRSA 사용하므로 비활성화&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="4-dev-ai-defense-환경변수"&gt;4. dev ai-defense 환경변수&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# dev/values/apps/values-ai-defense.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;TM_OFFLINE_LLM_AUDIT_PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;value&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;/tmp/logs/offline_llm_audit.jsonl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="5-dev-seat-kafka-설정"&gt;5. dev seat Kafka 설정&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# dev/values/apps/values-seat.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;SPRING_KAFKA_BOOTSTRAP_SERVERS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;value&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;kafka.messaging.svc.cluster.local:9092&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="커밋"&gt;커밋&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;feat(sprint5/troubleshooting): resolve disk pressure and CrashLoopBackOff issues

- common-charts: add revisionHistoryLimit: 3
- dev/staging loki: add compactor for retention
- staging ai-defense: add imagePullSecrets: []
- dev ai-defense: add TM_OFFLINE_LLM_AUDIT_PATH
- dev seat: add Kafka bootstrap servers
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="교훈"&gt;교훈&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Loki retention 필수&lt;/strong&gt; - compactor 없으면 retention_period가 작동 안 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;local-path-provisioner orphan PV&lt;/strong&gt; - PVC 삭제해도 디렉토리는 자동 삭제 안 됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;staging은 IRSA 사용&lt;/strong&gt; - imagePullSecrets: [] 명시 필요 (기본값 override)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;revisionHistoryLimit&lt;/strong&gt; - 기본값 10은 너무 많음, 3으로 제한&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>WireGuard + Cilium IP 대역 충돌 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-03-29-wireguard-cilium-ip-conflict/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-29-wireguard-cilium-ip-conflict/</guid><description>&lt;h3 id="날짜"&gt;날짜&lt;/h3&gt;
&lt;p&gt;2026-03-29&lt;/p&gt;
&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;Cilium(eBPF) 전환 후 외부에서 WireGuard VPN 연결 실패&lt;/p&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;외부(핫스팟)에서 &lt;code&gt;ping 10.0.0.1&lt;/code&gt; 실패 (100% packet loss)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh grgb-vpn&lt;/code&gt; 연결 불가&lt;/li&gt;
&lt;li&gt;집 내부 네트워크에서는 정상 작동&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="1차-진단-tcpdump"&gt;1차 진단: tcpdump&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tcpdump -i enp3s0 udp port &lt;span style="color:#ae81ff"&gt;51820&lt;/span&gt; -n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 결과: 0 packets - 패킷이 서버까지 도달하지 않음&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;처음에는 공유기/ISP 문제로 의심했으나&amp;hellip;&lt;/p&gt;
&lt;h3 id="2차-진단-cilium-설정-확인"&gt;2차 진단: Cilium 설정 확인&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl -n kube-system get cm cilium-config -o yaml | grep cluster-pool
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cluster-pool-ipv4-cidr: 10.0.0.0/8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3차-진단-라우팅-테이블-확인"&gt;3차 진단: 라우팅 테이블 확인&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip route | grep 10.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 10.0.0.0/24 via 10.0.0.224 dev cilium_host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="근본-원인"&gt;근본 원인&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cilium이 &lt;code&gt;10.0.0.0/8&lt;/code&gt; 전체를 클러스터 네트워크로 사용&lt;/li&gt;
&lt;li&gt;WireGuard도 &lt;code&gt;10.0.0.0/24&lt;/code&gt; 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP 대역 충돌&lt;/strong&gt;으로 Cilium이 WireGuard 트래픽을 &lt;code&gt;cilium_host&lt;/code&gt;로 라우팅&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="해결"&gt;해결&lt;/h2&gt;
&lt;h3 id="wireguard-네트워크-대역-변경"&gt;WireGuard 네트워크 대역 변경&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;10.0.0.0/24&lt;/code&gt; -&amp;gt; &lt;code&gt;172.30.0.0/24&lt;/code&gt; (Cilium과 겹치지 않는 사설 IP 대역)&lt;/p&gt;</description></item><item><title>Java OOM 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-03-23-java-oom/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-23-java-oom/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;온프렘 K8s 클러스터(mini-might 워커 노드)에서 Java 앱의 메모리 부족으로 OOM Killer가 호출되어 노드가 다운된 이슈 분석 및 해결 방안.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;k9s에서 mini-might 노드의 모든 파드가 &lt;code&gt;Unknown&lt;/code&gt; 상태로 표시&lt;/li&gt;
&lt;li&gt;재부팅 후 파드들이 순차적으로 복구됨&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl describe node mini-might&lt;/code&gt; Events에서 &lt;code&gt;Rebooted&lt;/code&gt; 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;NodeNotReady 5분 전 - 노드가 죽음
Rebooted 58초 전 - 재부팅 감지
NodeReady 17초 전 - 복구 완료
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="1-dmesg에서-oom-로그-확인"&gt;1. dmesg에서 OOM 로그 확인&lt;/h3&gt;
&lt;p&gt;mini-might 노드에 SSH 접속 후:&lt;/p&gt;</description></item><item><title>ALB Elastic IP 자동 할당 이슈</title><link>https://212clab.pages.dev/troubleshooting/2026-03-22-alb-eip-auto-assign/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-22-alb-eip-auto-assign/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;발생일&lt;/strong&gt;: 2026-03-22&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;환경&lt;/strong&gt;: EKS Staging (goormgb-staging-eks)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;증상&lt;/strong&gt;: Internet-facing ALB에 Elastic IP가 자동으로 할당되어 비용 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;h3 id="발견-경위"&gt;발견 경위&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;ArgoCD를 &lt;code&gt;type: LoadBalancer&lt;/code&gt; (NLB)에서 &lt;code&gt;type: ClusterIP&lt;/code&gt; (ALB Ingress)로 변경&lt;/li&gt;
&lt;li&gt;NLB 삭제 후 EIP 2개가 남아있음을 발견&lt;/li&gt;
&lt;li&gt;EIP 연결 해제/릴리스 시도 시 권한 에러 발생&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="에러-메시지"&gt;에러 메시지&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;An error occurred (AuthFailure) when calling the DisassociateAddress operation:
You do not have permission to access the specified resource.
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="확인된-상태"&gt;확인된 상태&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws ec2 describe-network-interfaces &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --filters &lt;span style="color:#e6db74"&gt;&amp;#34;Name=addresses.private-ip-address,Values=10.0.18.47&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --query &lt;span style="color:#e6db74"&gt;&amp;#39;NetworkInterfaces[*].[Description,NetworkInterfaceId]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 결과: ELB app/k8s-stagingalb-4f414fcf8f/...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="aws-공식-답변"&gt;AWS 공식 답변&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Internet-facing ALB의 자동 EIP 할당은 정상 동작입니다.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>EKS 노드 클러스터 조인 실패 점검지</title><link>https://212clab.pages.dev/troubleshooting/2026-03-21-eks-node-join-failure/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-21-eks-node-join-failure/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;EKS 노드 그룹이 생성되었으나 클러스터에 조인되지 않음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl get nodes&lt;/code&gt; 결과 노드가 보이지 않음&lt;/li&gt;
&lt;li&gt;EC2 인스턴스는 Running 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="점검-항목"&gt;점검 항목&lt;/h2&gt;
&lt;h3 id="1-vpc-dns-설정"&gt;1. VPC DNS 설정&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;설정&lt;/th&gt;
 &lt;th&gt;필수값&lt;/th&gt;
 &lt;th&gt;확인&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;enable_dns_hostnames&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;enable_dns_support&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;확인 방법:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aws_vpc&amp;#34; &amp;#34;main&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable_dns_hostnames &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable_dns_support &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="2-서브넷-태그"&gt;2. 서브넷 태그&lt;/h3&gt;
&lt;p&gt;EKS 컨트롤러가 서브넷을 인식하려면 특정 태그 필요&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;서브넷&lt;/th&gt;
 &lt;th&gt;태그&lt;/th&gt;
 &lt;th&gt;확인&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Public&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kubernetes.io/role/elb = 1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Private&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kubernetes.io/role/internal-elb = 1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;공통&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kubernetes.io/cluster/&amp;lt;클러스터명&amp;gt; = shared&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;확인 방법:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>EKS 트러블슈팅 - Node Group 생성 실패 및 vpc-cni addon 누락</title><link>https://212clab.pages.dev/troubleshooting/2026-03-21-eks-nodegroup-creation-failure/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-21-eks-nodegroup-creation-failure/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;EKS 1.34 클러스터 구축 중 발생한 두 가지 주요 이슈와 해결 과정 정리.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-node-group-생성-실패---kubelet-라벨-문제"&gt;1. Node Group 생성 실패 - kubelet 라벨 문제&lt;/h2&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Node Group 상태: &lt;code&gt;CREATE_FAILED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;에러 메시지: &lt;code&gt;NodeCreationFailure - Unhealthy nodes in the kubernetes cluster&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;EC2 인스턴스는 실행 중이지만 클러스터에 조인 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="원인-분석"&gt;원인 분석&lt;/h3&gt;
&lt;p&gt;SSM으로 노드에 접속하여 kubelet 로그 확인:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo journalctl -u kubelet -n &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;kubelet 에러:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;unknown &amp;#39;kubernetes.io&amp;#39; or &amp;#39;k8s.io&amp;#39; labels specified with --node-labels
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="근본-원인"&gt;근본 원인&lt;/h3&gt;
&lt;p&gt;Terraform EKS 모듈에서 노드그룹 라벨에 &lt;code&gt;node-role.kubernetes.io/infra&lt;/code&gt; 사용:&lt;/p&gt;</description></item><item><title>K8s Taint vs NodeSelector 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-03-20-taint-nodeselector/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-20-taint-nodeselector/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;dev-webs의 Pod들이 &lt;code&gt;Degraded&lt;/code&gt; 상태로 ArgoCD 알림 발생:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dev-order-core&lt;/li&gt;
&lt;li&gt;dev-seat&lt;/li&gt;
&lt;li&gt;dev-queue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;앱 전용 노드(mini-might)가 리소스 부족&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;원인: Control-plane(mini-gmk)에 &lt;code&gt;node-role.kubernetes.io/control-plane:NoSchedule&lt;/code&gt; taint가 있어서, 인프라 Pod들(istio, loki, calico, coredns, metrics-server 등)이 control-plane에서 생성되지 못하고 &lt;strong&gt;앱 전용 worker 노드로 밀려옴&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mini-might (worker) 에 배치된 인프라 Pod들:
- istio-ingressgateway (2개)
- istiod
- kiali
- loki-0, loki-chunks-cache-0, loki-results-cache-0
- calico-apiserver (2개), calico-kube-controllers, calico-typha
- coredns (2개)
- metrics-server
- alloy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;→ 앱 Pod 배포 시 리소스 경합 발생, 새 Pod Pending&lt;/p&gt;</description></item><item><title>Kubernetes Service Selector &amp; Endpoints 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-03-19-service-selector-endpoints/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-19-service-selector-endpoints/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;API 요청 시 &lt;strong&gt;503 Service Unavailable&lt;/strong&gt; 에러&lt;/li&gt;
&lt;li&gt;Istio 로그: &lt;code&gt;no_healthy_upstream&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;파드는 Running 상태인데 서비스 연결 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Service selector 라벨과 Pod 라벨 불일치&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 엔드포인트 확인 - &amp;lt;none&amp;gt;이면 문제!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl -n staging-webs get endpoints api-gateway
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME ENDPOINTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api-gateway &amp;lt;none&amp;gt; 34h &lt;span style="color:#75715e"&gt;# ← 파드 IP가 없음!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="동작-원리"&gt;동작 원리&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│ Service (api-gateway) │
│ selector: │
│ app: staging-api-gateway │
│ app.kubernetes.io/part-of: staging-webs ← 필수! │
└─────────────────────────────────────────────────────────┘
 │
 ▼ selector 라벨 가진 파드 검색
┌─────────────────────────────────────────────────────────┐
│ Endpoints (자동 생성) │
│ addresses: │
│ - 10.0.20.100 (파드1 IP) │
│ - 10.0.20.101 (파드2 IP) │
└─────────────────────────────────────────────────────────┘
 │
 ▼ 트래픽 로드밸런싱
┌─────────────────────────────────────────────────────────┐
│ Pod (라벨이 selector와 매칭되어야 함) │
│ labels: │
│ app: staging-api-gateway ✓ │
│ app.kubernetes.io/part-of: staging-webs ✓ │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;핵심: Service selector의 모든 라벨이 Pod에 있어야 Endpoints에 등록됨&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java Spring Boot Probe 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-03-18-java-probe-crashloop/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-18-java-probe-crashloop/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;Staging EKS 환경에서 Java Spring Boot 앱들이 CrashLoopBackOff 상태로 계속 재시작됨.&lt;/p&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pod가 시작 후 60초 내에 SIGTERM (exit code 143) 수신&lt;/li&gt;
&lt;li&gt;liveness probe 실패로 kubelet이 컨테이너 강제 종료&lt;/li&gt;
&lt;li&gt;404 에러 (초기) → 503/500 에러 (수정 후)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="1-context-path-누락-1차-원인"&gt;1. Context Path 누락 (1차 원인)&lt;/h3&gt;
&lt;p&gt;Spring Boot 앱들이 context path를 사용:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;auth-guard: &lt;code&gt;/auth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;queue: &lt;code&gt;/queue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;seat: &lt;code&gt;/seat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;order-core: &lt;code&gt;/order&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만 probe 설정은:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;livenessProbe&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;httpGet&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/actuator/health/liveness &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 404 에러!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;실제 경로는:&lt;/p&gt;</description></item><item><title>OpenTelemetry + Istio mTLS 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-03-18-otel-istio-mtls/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-18-otel-istio-mtls/</guid><description>&lt;h2 id="문제-상황"&gt;문제 상황&lt;/h2&gt;
&lt;p&gt;EKS Staging 환경에서 Java 서비스들이 CrashLoopBackOff 상태로 시작 실패. 로그 분석 결과 OTEL (OpenTelemetry) agent가 OTEL Collector에 연결 실패하는 문제 발견.&lt;/p&gt;
&lt;h3 id="환경"&gt;환경&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;: EKS 1.34&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Istio&lt;/strong&gt;: mTLS STRICT 모드 활성화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OTEL Agent&lt;/strong&gt;: opentelemetry-javaagent v2.11.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OTEL Collector&lt;/strong&gt;: opentelemetry-collector (Deployment)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Namespace&lt;/strong&gt;: staging-webs (앱), monitoring (OTEL Collector)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="증상"&gt;증상&lt;/h3&gt;
&lt;h3 id="pod-상태"&gt;Pod 상태&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;staging-webs auth-guard-xxx 0/1 CrashLoopBackOff 17
staging-webs order-core-xxx 0/1 CrashLoopBackOff 21
staging-webs queue-xxx 0/1 CrashLoopBackOff 22
staging-webs seat-xxx 0/1 CrashLoopBackOff 21
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="에러-로그"&gt;에러 로그&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[otel.javaagent] ERROR io.opentelemetry.exporter.internal.grpc.GrpcExporter -
Failed to export metrics. Server is UNAVAILABLE.
Make sure your collector is running and reachable from this network.
Full error message: upstream connect error or disconnect/reset before headers.
retried and the latest reset reason: remote connection failure,
transport failure reason: TLS_error:|268435703:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:TLS_error_end
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="원인-분석"&gt;원인 분석&lt;/h2&gt;
&lt;h3 id="1-정상적인-istio-mtls-트래픽-흐름"&gt;1. 정상적인 Istio mTLS 트래픽 흐름&lt;/h3&gt;
&lt;p&gt;일반적인 서비스 간 통신:&lt;/p&gt;</description></item><item><title>Chrome QUIC/HTTP3 간헐적 404 트러블슈팅</title><link>https://212clab.pages.dev/troubleshooting/2026-03-17-chrome-quic-http3-detail/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-17-chrome-quic-http3-detail/</guid><description>&lt;blockquote&gt;
&lt;p&gt;홈서버(kubeadm) + SK브로드밴드 환경에서 Chrome 브라우저 간헐적 404 오류 해결&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="홈서버-인프라-환경"&gt;홈서버 인프라 환경&lt;/h2&gt;
&lt;h3 id="11-전체-네트워크-아키텍처"&gt;1.1 전체 네트워크 아키텍처&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;flowchart TB
 subgraph Internet[&amp;#34;인터넷&amp;#34;]
 CF[&amp;#34;Cloudflare Edge&amp;lt;br/&amp;gt;(서울 PoP)&amp;#34;]
 ISP[&amp;#34;SK브로드밴드&amp;lt;br/&amp;gt;공인 IP: 동적&amp;lt;br/&amp;gt;(39.119.192.15)&amp;#34;]
 end

 subgraph HomeNetwork[&amp;#34;홈 네트워크 (192.168.45.0/24)&amp;#34;]
 subgraph Router[&amp;#34;SK브로드밴드 공유기&amp;#34;]
 NAT[&amp;#34;NAT/DHCP&amp;#34;]
 FW_R[&amp;#34;방화벽&amp;#34;]
 PF[&amp;#34;포트포워딩&amp;lt;br/&amp;gt;:80 → .154:80&amp;lt;br/&amp;gt;:443 → .154:443&amp;#34;]
 DHCP_RES[&amp;#34;DHCP 예약&amp;lt;br/&amp;gt;mini-gmk: .123&amp;lt;br/&amp;gt;mini-might: .154&amp;#34;]
 end

 subgraph ControlPlane[&amp;#34;mini-gmk (Control Plane)&amp;lt;br/&amp;gt;192.168.45.123&amp;#34;]
 UFW_C[&amp;#34;ufw 방화벽&amp;lt;br/&amp;gt;22, 6443, 10250-10252&amp;lt;br/&amp;gt;2379-2380, 179&amp;#34;]
 K8S_CP[&amp;#34;Kubernetes Control Plane&amp;lt;br/&amp;gt;kube-apiserver&amp;lt;br/&amp;gt;etcd, scheduler&amp;lt;br/&amp;gt;controller-manager&amp;#34;]
 ISTIOD[&amp;#34;istiod (pilot)&amp;#34;]
 CERTM[&amp;#34;cert-manager&amp;#34;]
 DDNS[&amp;#34;ddns-cloudflare&amp;lt;br/&amp;gt;CronJob&amp;#34;]
 ESO[&amp;#34;external-secrets-operator&amp;#34;]
 CALICO_CP[&amp;#34;calico-typha&amp;lt;br/&amp;gt;calico-kube-controllers&amp;#34;]
 end

 subgraph Worker[&amp;#34;mini-might (Worker)&amp;lt;br/&amp;gt;192.168.45.154&amp;#34;]
 UFW_W[&amp;#34;ufw 방화벽&amp;lt;br/&amp;gt;22, 80, 443&amp;lt;br/&amp;gt;10250, 30000-32767&amp;#34;]
 INGRESS[&amp;#34;istio-ingressgateway&amp;lt;br/&amp;gt;externalIPs: .154&amp;#34;]
 GW[&amp;#34;java-cloud-gateway&amp;lt;br/&amp;gt;:8085&amp;#34;]
 AUTH[&amp;#34;auth-guard (x2)&amp;lt;br/&amp;gt;:8080&amp;#34;]
 APPS[&amp;#34;order-core :8083&amp;lt;br/&amp;gt;seat :8082&amp;lt;br/&amp;gt;queue :8081&amp;#34;]
 CALICO_W[&amp;#34;calico-node&amp;#34;]
 end

 subgraph VPN_Access[&amp;#34;팀원 접속&amp;#34;]
 VPN[&amp;#34;Tailscale/WireGuard&amp;lt;br/&amp;gt;VPN&amp;#34;]
 SSH[&amp;#34;SSH 터널&amp;lt;br/&amp;gt;:22&amp;#34;]
 end
 end

 subgraph Clients[&amp;#34;클라이언트&amp;#34;]
 Chrome[&amp;#34;Chrome&amp;lt;br/&amp;gt;(QUIC/HTTP3)&amp;#34;]
 Safari[&amp;#34;Safari&amp;lt;br/&amp;gt;(HTTP/2)&amp;#34;]
 Firefox[&amp;#34;Firefox&amp;lt;br/&amp;gt;(HTTP/2)&amp;#34;]
 Mobile[&amp;#34;모바일 LTE&amp;#34;]
 TeamMember[&amp;#34;팀원 (VPN)&amp;#34;]
 end

 Chrome --&amp;gt;|&amp;#34;QUIC/UDP:443&amp;lt;br/&amp;gt;❌ 간헐적 실패&amp;#34;| ISP
 Safari --&amp;gt;|&amp;#34;HTTP/2/TCP:443&amp;#34;| ISP
 Firefox --&amp;gt;|&amp;#34;HTTP/2/TCP:443&amp;#34;| ISP
 Mobile --&amp;gt;|&amp;#34;HTTP/2&amp;#34;| ISP

 Chrome --&amp;gt;|&amp;#34;QUIC/UDP:443&amp;lt;br/&amp;gt;✅ 안정적&amp;#34;| CF
 CF --&amp;gt;|&amp;#34;HTTP/2/TCP:443&amp;#34;| ISP

 ISP --&amp;gt; NAT
 NAT --&amp;gt; FW_R
 FW_R --&amp;gt; PF
 PF --&amp;gt;|&amp;#34;:443&amp;#34;| UFW_W
 UFW_W --&amp;gt; INGRESS

 INGRESS --&amp;gt; GW
 GW --&amp;gt; AUTH
 AUTH --&amp;gt; APPS

 TeamMember --&amp;gt;|&amp;#34;VPN&amp;#34;| VPN
 VPN --&amp;gt; SSH
 SSH --&amp;gt; UFW_C
 SSH --&amp;gt; UFW_W

 DDNS --&amp;gt;|&amp;#34;API 호출&amp;#34;| CF

 ISTIOD -.-&amp;gt;|&amp;#34;xDS&amp;#34;| INGRESS
 CERTM -.-&amp;gt;|&amp;#34;TLS 인증서&amp;#34;| INGRESS
 ESO -.-&amp;gt;|&amp;#34;Secret 동기화&amp;#34;| DDNS

 classDef problem fill:#ff6b6b,stroke:#c0392b,color:#fff
 classDef solution fill:#2ecc71,stroke:#27ae60,color:#fff
 classDef infrastructure fill:#3498db,stroke:#2980b9,color:#fff

 class Chrome problem
 class CF solution
 class Router,ControlPlane,Worker infrastructure
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-sk브로드밴드-공유기-설정"&gt;1.2 SK브로드밴드 공유기 설정&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;flowchart LR
 subgraph SKRouter[&amp;#34;SK브로드밴드 공유기 설정&amp;#34;]
 direction TB

 subgraph DHCP[&amp;#34;DHCP 설정&amp;#34;]
 DHCP_RANGE[&amp;#34;DHCP 범위: 192.168.45.100 ~ .200&amp;#34;]
 DHCP_RES1[&amp;#34;예약 1: mini-gmk&amp;lt;br/&amp;gt;MAC: XX:XX:XX:XX:XX:XX&amp;lt;br/&amp;gt;IP: 192.168.45.123&amp;#34;]
 DHCP_RES2[&amp;#34;예약 2: mini-might&amp;lt;br/&amp;gt;MAC: YY:YY:YY:YY:YY:YY&amp;lt;br/&amp;gt;IP: 192.168.45.154&amp;#34;]
 end

 subgraph PortForward[&amp;#34;포트포워딩&amp;#34;]
 PF_HTTP[&amp;#34;외부 :80 → 192.168.45.154:80&amp;#34;]
 PF_HTTPS[&amp;#34;외부 :443 → 192.168.45.154:443&amp;#34;]
 PF_VPN[&amp;#34;외부 :51820 → 192.168.45.123:51820&amp;lt;br/&amp;gt;(WireGuard, 선택)&amp;#34;]
 end

 subgraph Firewall[&amp;#34;방화벽 설정&amp;#34;]
 FW_IN[&amp;#34;인바운드: 80, 443 허용&amp;#34;]
 FW_OUT[&amp;#34;아웃바운드: 전체 허용&amp;#34;]
 FW_ICMP[&amp;#34;ICMP: 허용 (ping)&amp;#34;]
 end

 subgraph NAT_Config[&amp;#34;NAT 설정&amp;#34;]
 NAT_TYPE[&amp;#34;NAT 타입: 대칭형 (Symmetric)&amp;#34;]
 NAT_UDP[&amp;#34;UDP 타임아웃: 30초 (문제 원인)&amp;#34;]
 NAT_TCP[&amp;#34;TCP 타임아웃: 3600초&amp;#34;]
 end
 end

 style NAT_UDP fill:#ff6b6b,stroke:#c0392b,color:#fff
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;공유기 설정 상세:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Swagger 403, ArgoCD 대시보드, CORS 이슈 해결</title><link>https://212clab.pages.dev/troubleshooting/2026-03-11-swagger-argocd-cors/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://212clab.pages.dev/troubleshooting/2026-03-11-swagger-argocd-cors/</guid><description>&lt;blockquote&gt;
&lt;p&gt;2026-03-11 | Swagger 403, ArgoCD 대시보드, CORS 이슈 해결&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-swagger-403--oauth-로그인-리다이렉트"&gt;1. Swagger 403 → OAuth 로그인 리다이렉트&lt;/h2&gt;
&lt;h3 id="문제"&gt;문제&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;swagger.dev.goormgb.space&lt;/code&gt; 접속 시 &lt;strong&gt;403 Forbidden&lt;/strong&gt; 페이지 표시&lt;/li&gt;
&lt;li&gt;로그인 페이지로 리다이렉트 되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="원인"&gt;원인&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;브라우저에 &lt;strong&gt;stale cookie&lt;/strong&gt; (만료된 &lt;code&gt;_oauth2_proxy&lt;/code&gt; 쿠키) 존재&lt;/li&gt;
&lt;li&gt;OAuth2 Proxy가 쿠키를 검증하고 &amp;ldquo;유효하지 않음&amp;rdquo; → &lt;strong&gt;403 반환&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;정상 흐름: 쿠키 없음 → 302 리다이렉트 → 로그인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[정상 흐름 - 쿠키 없음]
사용자 → OAuth2 Proxy → 쿠키 없음 → 302 → Google 로그인

[문제 상황 - 만료된 쿠키]
사용자 → OAuth2 Proxy → 쿠키 있음 (만료됨) → 403 Forbidden
 ↑ 여기서 멈춤!
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="해결-envoyfilter로-403302-리다이렉트"&gt;해결: EnvoyFilter로 403→302 리다이렉트&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;networking.istio.io/v1alpha3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;EnvoyFilter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;swagger-403-redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;namespace&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;istio-system&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;workloadSelector&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;istio&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ingressgateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;configPatches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;applyTo&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;HTTP_FILTER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;match&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;context&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;GATEWAY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listener&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;filterChain&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;filter&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;envoy.filters.network.http_connection_manager&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;subFilter&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;envoy.filters.http.router&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;patch&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;operation&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;INSERT_BEFORE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;value&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;envoy.filters.http.lua&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;typed_config&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;@type&amp;#34;: &lt;/span&gt;&lt;span style="color:#ae81ff"&gt;type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;inlineCode&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; function envoy_on_response(response_handle)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; local host = response_handle:headers():get(&amp;#34;:authority&amp;#34;) or &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; local status = response_handle:headers():get(&amp;#34;:status&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; -- swagger 도메인의 403 응답만 처리
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; if string.find(host, &amp;#34;swagger&amp;#34;) and status == &amp;#34;403&amp;#34; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; local path = response_handle:headers():get(&amp;#34;x-original-uri&amp;#34;) or &amp;#34;/&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; local redirect_url = &amp;#34;/oauth2/start?rd=&amp;#34; .. path
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; -- 302 리다이렉트로 변경
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; response_handle:headers():replace(&amp;#34;:status&amp;#34;, &amp;#34;302&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; response_handle:headers():add(&amp;#34;location&amp;#34;, redirect_url)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; response_handle:headers():add(&amp;#34;cache-control&amp;#34;, &amp;#34;no-cache, no-store&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="핵심-포인트"&gt;핵심 포인트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;envoy_on_response&lt;/strong&gt;: 응답 단계에서 가로채기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;swagger 도메인만&lt;/strong&gt; 처리 (다른 서비스 영향 없음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;403 → 302&lt;/strong&gt; 변환 + &lt;code&gt;/oauth2/start&lt;/code&gt; 리다이렉트&lt;/li&gt;
&lt;li&gt;OAuth2 Proxy가 다시 로그인 프로세스 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-cors-에러로-프론트엔드-하얗게-터짐"&gt;2. CORS 에러로 프론트엔드 &amp;ldquo;하얗게 터짐&amp;rdquo;&lt;/h2&gt;
&lt;h3 id="문제-1"&gt;문제&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;프론트엔드에서 API 호출 시 CORS 에러&lt;/li&gt;
&lt;li&gt;브라우저 콘솔에 에러만 보이고 페이지 하얗게 터짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="원인-1"&gt;원인&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;백엔드가 &lt;strong&gt;400, 500 에러 응답에 CORS 헤더를 포함하지 않음&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[정상 응답 200]
Access-Control-Allow-Origin: https://dev.goormgb.space ✓
→ 프론트엔드가 응답 본문 읽기 가능

[에러 응답 500]
Access-Control-Allow-Origin: (없음) ✗
→ 브라우저가 응답 차단 → 프론트엔드에서 에러 원인 파악 불가
→ 에러 핸들링 불가 → 하얗게 터짐
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="왜-에러-응답에도-cors-헤더가-필요한가"&gt;왜 에러 응답에도 CORS 헤더가 필요한가?&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;브라우저 보안 정책&lt;/strong&gt;: Origin이 다르면 모든 응답에 CORS 헤더 필요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;에러 핸들링&lt;/strong&gt;: CORS 헤더 없으면 &lt;code&gt;response.json()&lt;/code&gt; 자체가 불가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UX 개선&lt;/strong&gt;: 에러 메시지를 사용자에게 보여줄 수 있음&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="해결-방안-백엔드-팀-전달"&gt;해결 방안 (백엔드 팀 전달)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Spring Boot - 에러 응답에도 CORS 헤더 포함&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CorsConfig&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; WebMvcConfigurer {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;addCorsMappings&lt;/span&gt;(CorsRegistry registry) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; registry.&lt;span style="color:#a6e22e"&gt;addMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/**&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;allowedOrigins&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;https://dev.goormgb.space&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;allowedMethods&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;allowCredentials&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 또는 @ControllerAdvice에서 모든 예외 응답에 헤더 추가&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-authtokenrefresh-404-에러"&gt;3. /auth/token/refresh 404 에러&lt;/h2&gt;
&lt;h3 id="문제-2"&gt;문제&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;프론트엔드에서 &lt;code&gt;/auth/token/refresh&lt;/code&gt; 호출 시 404&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="원인-경로-불일치"&gt;원인: 경로 불일치&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;경로&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;프론트엔드 호출&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/auth/token/refresh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API Gateway 라우팅&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Path=/auth/**&lt;/code&gt; → Auth-Guard&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Auth-Guard 실제 경로&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/token/refresh&lt;/code&gt; (클래스 레벨 @RequestMapping 없음)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;프론트: /auth/token/refresh
 ↓
API Gateway: /auth/** 매칭 → Auth-Guard로 전달
 ↓
Auth-Guard: /auth/token/refresh 받음
 ↓
404! (실제로는 /token/refresh만 존재)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="해결-방안-백엔드-팀-전달-1"&gt;해결 방안 (백엔드 팀 전달)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;옵션 1: StripPrefix 필터 추가&lt;/strong&gt; (권장)&lt;/p&gt;</description></item></channel></rss>