diff --git a/doc/monitoring-deploy-test.md b/doc/monitoring-deploy-test.md index a844151..e2c1357 100644 --- a/doc/monitoring-deploy-test.md +++ b/doc/monitoring-deploy-test.md @@ -271,21 +271,25 @@ kubectl apply -n monitoring -f manifests/helm/perses/0.21.0/files/perses-dashboa --- -## 5. 3단계 — E2E 기능 검증 +## 5. 3단계 — E2E 기능 검증 — ✅ 핵심 통과 (2026-06-25) -vm-stack `test/` 스크립트(`verify-metrics.sh`/`verify-logs.sh`) 패턴(port-forward + curl) 적응. +vm-stack `test/` 패턴(port-forward + curl) 적응. -| # | 항목 | 검증 방법 | 결과 | -|---|------|-----------|------| -| 1 | 파드 | `monitoring` 전 파드 Running | | -| 2 | 메트릭 | vmagent targets up>0, vmselect `query=count(up)`>0 | | -| 3 | 인증 라우팅 | Keycloak 토큰으로 vmauth `/api/v1/query` 성공 | | -| 4 | 로그 | otelcol→vlinsert 적재, vmauth `AccountID` 헤더로 vlselect 조회 | | -| 5 | 멀티테넌시 | accountID별 메트릭(경로)·로그(헤더) 격리 | | -| 6 | perses | Keycloak 로그인, 대시보드 4종 로드, datasource 쿼리 | | -| 7 | 알림 | vmalert 규칙 로드, 테스트 알림 → alertmanager → 채널 수신 | | +| # | 항목 | 결과 | +|---|------|------| +| 1 | 파드 | ✅ **15/15 Running** | +| 2 | 메트릭 | ✅ `count(up)`=**9**(acct0)/**36**(multitenant), status=success. vmagent 스크레이프→vminsert 적재 정상 | +| 3 | 인증 라우팅 | ✅ Keycloak `perses-vmauth` client_credentials 토큰의 `vm_access:{metrics_account_id:0,logs_account_id:0}` → vmauth가 acct0 라우팅, count=9. ⚠️ 아래 발견사항 | +| 4 | 로그 | ✅ vlselect `logsql`(AccountID:0) 데이터 존재. otelcol→vlinsert 적재 확인 | +| 5 | 멀티테넌시 | ◐ 부분 — acct0/multitenant 라우팅 확인. demo01/demo02(acct1/2)는 워크로드 없어 데이터 없음 → 격리 양성검증만, 음성검증(타 테넌트 차단)은 워크로드 필요 | +| 6 | perses | ◐ 로그인(`paasup`, global-admin)✅ + 대시보드 4종·데이터소스(victoriametrics/victorialogs) provisioning 적용✅. 인터랙티브 패널 렌더는 브라우저 로그인 필요(미실시) | +| 7 | 알림 | ✅ vmalert 규칙 **8개**(cluster-health) 로드, alertmanager Running. Discord는 **mock**이라 실발송 미검증 | -> 🔧 **수동 설정**(검증용 임시 토큰 발급/포트포워드 등 일회성 명령): 기록 → §7 +**발견사항 (E2E)** +- ⚠️ **`unauthorized_user` 폴백 → account 0 무인증 접근 가능**: 토큰 없음·무효 토큰도 HTTP 200(acct0)으로 응답. vmalert는 vmselect multitenant에 직결하므로 `unauthorized_user`가 꼭 필요하진 않음 → account 0 보호가 필요하면 **`unauthorized_user` 제거 검토**. +- perses 데이터소스/시크릿(`perses-provisioning`)은 §3.5에서 누락했다가 E2E 중 적용 → 정식 배포 시 ArgoCD 경로 또는 dip-console로 포함 필요. + +> 🔧 **수동 설정**(E2E 일회성): perses-provisioning apply(`kubectl apply -n monitoring -f .../perses-provisioning.yaml`), 검증 토큰 발급(perses-vmauth client_credentials), port-forward 다수 → §7 --- @@ -323,9 +327,14 @@ vm-stack `test/` 스크립트(`verify-metrics.sh`/`verify-logs.sh`) 패턴(port- - **일시 / 수행자**: (기입) - **환경**: (클러스터/ArgoCD/Keycloak) -- **결과**: 11 Application Synced+Healthy ( / ), E2E ( /7 PASS) +- **일시 / 수행자**: 2026-06-25 +- **환경**: dev 클러스터(192.168.1.101), ArgoCD=`platform` ns, Keycloak `paasup` realm +- **결과**: 0~3단계 통과. **11 Application Healthy**(9 Synced + 2 OutOfSync 무해), **15/15 파드 Running**, E2E 핵심 항목 PASS(메트릭·로그·JWT 라우팅·알림 규칙), perses 로그인/admin OK - **발견 이슈 / 개선사항**: - **vmcluster/vlogs 영구 OutOfSync** — StatefulSet `volumeClaimTemplates`의 `volumeMode` 자동 기본값 diff(immutable). 기능 무해. → ApplicationSet에 `ignoreDifferences`(StatefulSet `/spec/volumeClaimTemplates`) 추가 권장. - - ArgoCD 설치 위치가 `argocd`가 아니라 `platform` ns — ApplicationSet `metadata.namespace`/`template...namespace`를 `platform`으로 조정함. - - (E2E 단계에서 추가 기입) + - **`unauthorized_user` → account 0 무인증 접근** — 무토큰/무효토큰도 acct0 200. vmalert는 vmselect 직결이므로 보호 필요 시 `unauthorized_user` 제거 검토. + - **perses 데이터소스/시크릿 누락** — §3.5에서 대시보드만 적용, datasource provisioning은 E2E 중 추가. 정식 배포 시 ArgoCD 경로/ dip-console로 포함. + - **Perses OIDC login = `preferred_username`** (v0.53.1 실측) — globalAdminUsers/RoleBinding은 username 기준(앞서 "sub UUID" 가정은 오류, 정정함). + - ArgoCD 설치 위치 `platform` ns — ApplicationSet ns를 `platform`으로 조정함. - **자동화 backlog**: §7 수동 설정 목록 참조 (1단계 전부 dip-console 이관 대상) +- **미완**: 4단계 정리(teardown), 멀티테넌시 음성검증(테넌트 워크로드 필요), perses 인터랙티브 렌더(브라우저) diff --git a/manifests/applicationset/victoria-metrics/1.0.0/applicationset.yaml b/manifests/applicationset/victoria-metrics/1.0.0/applicationset.yaml index 0c503e3..2340c55 100644 --- a/manifests/applicationset/victoria-metrics/1.0.0/applicationset.yaml +++ b/manifests/applicationset/victoria-metrics/1.0.0/applicationset.yaml @@ -93,6 +93,13 @@ spec: destination: server: https://kubernetes.default.svc namespace: monitoring + # StatefulSet volumeClaimTemplates는 immutable + K8s가 volumeMode 등 기본값을 자동 주입 → + # 영구 OutOfSync 방지(vmstorage/vlstorage). VCT 변경은 어차피 적용 불가라 무시. + ignoreDifferences: + - group: apps + kind: StatefulSet + jsonPointers: + - /spec/volumeClaimTemplates syncPolicy: automated: prune: true diff --git a/manifests/applicationset/victoria-metrics/1.0.0/vmauth-values.yaml b/manifests/applicationset/victoria-metrics/1.0.0/vmauth-values.yaml index 2f1cfda..ca20e03 100644 --- a/manifests/applicationset/victoria-metrics/1.0.0/vmauth-values.yaml +++ b/manifests/applicationset/victoria-metrics/1.0.0/vmauth-values.yaml @@ -16,5 +16,4 @@ config: headers: - "AccountID: {{.LogsAccountID}}" - "ProjectID: 0" - unauthorized_user: - url_prefix: "http://vmcluster-victoria-metrics-cluster-vmselect.monitoring.svc.cluster.local:8481/select/0/prometheus" + # unauthorized_user 미설정: 미인증 요청은 401(account 0 무인증 접근 차단). diff --git a/manifests/helm/victoria-metrics-auth/0.33.0/CUSTOM-README.md b/manifests/helm/victoria-metrics-auth/0.33.0/CUSTOM-README.md index 47175ff..011fbf4 100644 --- a/manifests/helm/victoria-metrics-auth/0.33.0/CUSTOM-README.md +++ b/manifests/helm/victoria-metrics-auth/0.33.0/CUSTOM-README.md @@ -36,8 +36,7 @@ config: headers: - "AccountID: {{.LogsAccountID}}" - "ProjectID: 0" - unauthorized_user: - url_prefix: "http://...vmselect:8481/select/0/prometheus" +# unauthorized_user 미설정 — 미인증 요청은 401 (account 0 무인증 접근 차단) ``` > **vm vs vl 격리 메커니즘이 다르다**: VictoriaMetrics는 accountID를 **URL 경로**(`/select/{N}/`)로, VictoriaLogs는 **HTTP 헤더**(`AccountID`/`ProjectID`)로 받는다. 동일한 토큰의 `vm_access`가 두 차원(`metrics_account_id`/`logs_account_id`)을 함께 담고, vmauth가 `src_paths`별로 경로 치환 vs 헤더 주입을 다르게 적용한다. 즉 **테넌트별 계정을 나눌 필요 없이 단일 vmauth 항목**으로 둘 다 격리된다. @@ -59,9 +58,9 @@ JWT payload 예시: { "exp": 1771953418, "vm_access": { "metrics_account_id": 1, "logs_account_id": 1 } } ``` -### 2.3 unauthorized_user +### 2.3 unauthorized_user — 사용 안 함 -토큰 없이 들어오는 내부 서비스(vmalert 등)는 `unauthorized_user` 정책으로 accountID 0에 폴백된다. +`unauthorized_user`를 두면 **토큰 없음/무효 토큰 요청이 해당 accountID로 무인증 접근**되어 격리가 약해진다(E2E에서 acct0 200 확인). 내부 서비스(vmalert)는 vmselect multitenant에 **직결**하므로 vmauth 폴백이 불필요 → **설정하지 않는다.** 모든 vmauth 접근은 유효 JWT를 요구하며, 미인증은 **401**. ## 3. Keycloak 설정 (paasup realm) @@ -201,7 +200,8 @@ curl -s -H "Authorization: Bearer $TOKEN" \ ``` 클라이언트 ──Bearer JWT──▶ vmauth:8427 ──(vm_access.accountID)──▶ vmselect:8481 /select/{N}/prometheus └──────────────────────▶ vlselect:9471 (로그) -vmalert(내부) ──(토큰 없음)──▶ vmauth ──unauthorized_user──▶ vmselect /select/0/prometheus +vmalert(내부) ──직결──▶ vmselect /select/multitenant/prometheus (vmauth 미경유) +미인증/무효토큰 ──▶ vmauth ──▶ 401 (unauthorized_user 없음) ``` > 쓰기 경로는 별도: vmagent ──remote_write──▶ vminsert:8480 (vmauth 미경유) diff --git a/manifests/helm/victoria-metrics-auth/0.33.0/custom-values.yaml b/manifests/helm/victoria-metrics-auth/0.33.0/custom-values.yaml index 63cad4c..f1f3f89 100644 --- a/manifests/helm/victoria-metrics-auth/0.33.0/custom-values.yaml +++ b/manifests/helm/victoria-metrics-auth/0.33.0/custom-values.yaml @@ -51,6 +51,6 @@ config: # - src_paths: ["/api/v1/.*"] # url_prefix: "http://vmcluster-victoria-metrics-cluster-vmselect.monitoring.svc.cluster.local:8481/select/9000/prometheus" - # 인증 없는 내부 서비스(vmalert 등) — accountID 0으로 폴백 - unauthorized_user: - url_prefix: "http://vmcluster-victoria-metrics-cluster-vmselect.monitoring.svc.cluster.local:8481/select/0/prometheus" + # 주의: unauthorized_user를 두지 않는다. 두면 무토큰/무효토큰 요청이 해당 accountID로 + # 무인증 접근되어 격리가 약해진다(E2E에서 acct0 200 확인). vmalert는 vmselect에 직결하므로 + # vmauth 폴백이 불필요 → 모든 vmauth 접근은 유효 JWT를 요구(미인증=401).