fix(setup): 실험대에서 35편을 끝까지 밟고 어긋난 명령·결과 31건을 고친다
test-server 를 비우고 다시 세운 뒤 Setup 기록 35편(virtualization 9 ·
keycloak-session-store 26)을 문서에 적힌 명령 그대로 쳤다. 어긋난 자리를
기록과 SSOT 양쪽에 실측과 함께 넣었다.
막히던 것
- 04 의 인증서 경로가 live/hyeonworks.com 이라 nginx 가 [emerg] 로 안 떴다.
실제 계보는 live/auth.hyeonworks.com 이고 「문제가 생기면」은 진단이 거꾸로였다
- 인증서가 와일드카드가 아니다. SAN 이 auth·app1·app2 셋뿐이라 그 밖의 이름은
TLS 에서 끊기고 curl 이 exit 60 · %{http_code} 000 을 낸다. SSOT 안에서
두 문단이 서로 어긋나 있었다
- A-7 14번 ①이 kc-lab-1 에서 여섯 줄 다 실패하는데 마지막 date 만 「차단」을 찍는다
검사가 실패할 수 없던 자리
- B-1 의 세션 키 고르기는 앞 단계가 $KEY 를 채워 둬서 루프가 한 건도 못 맞혀도
통과한다. KEY= 로 비우고 키마다 1/0 을 찍게 바꿨다
- k3s-agent 유닛의 sed -i 는 패턴에 $HOME 이 들어 있어 아무 줄도 안 바꾼 채 성공한다
certbot
- renew --dry-run 의 종료 코드는 성공도 0, 실패도 0, 다른 사유의 실패는 1 이다.
본문의 renew failure(s) 로만 판정할 수 있다
- --dry-run 은 staging 서버를 쓰는데 renewal/*.conf 의 account= 는 운영 계정을
가리킨다. 실패한 dry-run 이 staging 계정을 하나 더 만들어 다음 실행이 계속 멎는다
- 훅을 755 로 놓고 시뮬레이션이 성공해도 Running deploy-hook command 는 안 나온다.
certbot 2.1.0 에는 --run-deploy-hooks 도 없다
- 강제 갱신은 실제로 쳤고 서빙까지 닿았다. serial 06F3E0EF…1373 → 065547…3DF1,
notAfter Dec 3 → Dec 16, nginx worker 2629 4712 → 4745 4754
독자가 칠 수 있는 형태로
- 안 되는 형태가 번호 붙은 단계에 앉아 있던 8곳을 뒤집고, 되는 형태를 ①로 올렸다
- 랩 안에서 공개 이름을 치는 curl 65줄에 --resolve 를 붙였다. 붙인 형태를 실제로
쳐서 문서가 적은 값과 같은지 확인했다
- 힙독·sed -i·echo >>·&&·|| 를 편집기 + 파일 리스팅 + 분할 형태로 바꿨다
- 닫는 코드펜스가 빠져 뒤 200여 줄의 블록 종류가 뒤집혀 있던 곳을 포함해 3곳을 고쳤다
관문: check_body PASS · check_prose error 0 · check_evidence 두 프로젝트 문제 없음 ·
verify-tech-log-tree error 0 · verify-project-layout error 0 · 코드펜스 전수 0건
남은 것: B-0 주입은 keycloak-pattern 저장소의 소스를 고치고 이미지를 다시 구워야
해서 안 했다(unknown).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
4a457afde9
commit
32e39e20aa
@@ -165,3 +165,103 @@ SSOT 의 「2026-09-17 재현 — 어디까지 밟았고 무엇이 막았나」
|
||||
|
||||
비밀은 어느 파일에도 값으로 들어 있지 않다. 비밀번호는 길이(19·22)만 적었고, 화면에
|
||||
찍혀 나온 토큰은 <REDACTED n자> 로 가렸다.
|
||||
|
||||
--- 2026-09-17 추가 (인증서 대기 중에 잰 것) ---
|
||||
ext-01..02 밖에서 http 로 닿는지, X-Forwarded-For 가 오는지
|
||||
ext-03..05, ext-09,11 traefik-forwarded-headers.yaml 적용 전/후/되돌린 뒤 앱이 받은 헤더
|
||||
ext-06..07 인증서 상태와 발급 전제 (플러그인 O, cloudflare.ini X)
|
||||
ext-08 http 만으로 어디까지 되는지 (well-known 200 · token 401)
|
||||
ext-10, ext-12 출발지를 덮는 것이 무엇인지 — 호스트 sudo 가 막아 못 가림
|
||||
ext-13 BFF 로그인 체인이 https://auth 로 가서 막히는 것
|
||||
b6-01..09 B-6 키 회전을 문서대로 밟은 기록. 키 조작은 재현, 401/200 판정은 못 냄
|
||||
ext-14 파드에서 공개 이름이 100.83.212.4 로 풀리고 80·443 이 닫혀 있는 것
|
||||
ext-15 CoreDNS 를 *.override 로 고치려다 CrashLoopBackOff 난 기록
|
||||
ext-16 *.server 로 고쳐 넣어 CoreDNS 가 뜬 기록
|
||||
ext-17 고친 뒤 파드에서 엣지 192.168.122.10:80 이 열리는 것
|
||||
d4-01 D-4 5·6·7 절. 7 절이 test-server 에서 빈손이고 nginx 는 엣지에 있다
|
||||
d4a-01 D-4a 5~8 절. 훅 작성·설치·실행과 워커 PID 가 갈리는 것
|
||||
b7-01, b7-02 CoreDNS 를 고친 뒤 oauth2-proxy 가 두드리는 주소가
|
||||
100.83.212.4 에서 192.168.122.10 으로 바뀐 것과, 빌린 Grafana Ingress 복구
|
||||
misc-01 오래 미검증이던 명령 넷 — cookie secret 길이 32·32, R 함수가 빈 출력,
|
||||
certbot renew --dry-run 이 인증서 0장에서 내는 줄
|
||||
b2-01 --scan | xargs del 이 tr -d '\r' 없이도 도는 것과, od -c 로 본 줄 끝
|
||||
b2-02 b2 ②③④ 의 세션 수 — DB 5 와 관리 API 4 가 다른 것
|
||||
b0-01..03 TLS 뒤 b0 상태 확인 — BFF 가 B-1 상태이고 /actuator/beans 가 밖에서 200
|
||||
b1-01..05 B-1 을 끝까지 — 로그인, Redis 키 둘, head -1 이 엉뚱한 키를 집는 것
|
||||
b6-10..18 B-6 을 끝까지 — 대조군 200, 추가는 무중단, 제거 뒤 401/200 이 번갈아 나오는 것
|
||||
b7-03..08 B-7 을 끝까지 — 클라이언트가 없어 Client not found, 만든 뒤 회전까지
|
||||
b7a-01 회전 뒤 남은 고아 세션과 TTL 이 갱신 없이 줄어드는 것
|
||||
d4a-07-dryrun-after-removing-duplicate-staging-account.txt
|
||||
kc-lab-edge 에서 `sudo certbot renew --dry-run`. staging ACME 계정이 둘이라
|
||||
"Please choose an account" 로 멎던 것을, 나중에 생긴 계정 하나를 지운 뒤 다시 잰 것.
|
||||
certbot exit=0 · "Congratulations, all simulated renewals succeeded".
|
||||
실패했을 때도 0 이 나온 적이 있어 종료 코드로는 성공과 실패가 안 갈린다는 근거.
|
||||
|
||||
--- 2026-09-17 저녁 추가 (A-6 관찰·복구를 마저 밟은 기록) ---
|
||||
a6-05-observe-prep.txt A-6 준비 1~5 — 배치와 파드 IP, a6-probe 파드, PW 길이 19,
|
||||
구간별 시간 한 번, 두 노드 20회씩 기준선(k1 44ms · k0 40ms),
|
||||
`grep "^agroal_"` 가 레이블과 값까지 열일곱 줄로 나오는 것
|
||||
a6-06-observe.txt A-6 주입 재현과 관찰 1~5 — flannel.1 세 줄, 카운터 0 pkt → 18 pkt,
|
||||
주입 뒤 k1 1865ms · k0 40ms, 동시 20건 1.87→22.25 초 계단 스무 줄,
|
||||
sort / sort -g 가 같고 sort -g -k2 만 듣는 것, 부하 직후 풀 지표
|
||||
(blocking_time_max 20000.0 · max_used_count 18.0),
|
||||
readiness 프로브 context deadline exceeded, 낙관적 락 로그 0
|
||||
a6-07-revert-checklist.txt A-6 복구와 확인표 여덟 줄 — flannel.1 noqueue, enp1s0 은
|
||||
기본값 fq_codel, 회복 뒤 k1 42ms · k0 39ms, 엔드포인트 주소 둘,
|
||||
awaiting/active 0, 탐침 NotFound, 밖에서 auth.hyeonworks.com 이
|
||||
100.83.212.4 로 풀려 443 이 닫혀 000 이고 --resolve 로 짚으면 200
|
||||
|
||||
--- 2026-09-17 저녁 추가 (A-7 을 1번부터 복구까지 다시 밟은 기록) ---
|
||||
a7-06-prep-and-switch.txt A-7 1~11 — 전환 전 args ["start"], DB 143행, 탐침, 교차 refresh 200,
|
||||
기능 목록이 두 줄, DELETE 144, patch 가 "patched" 를 내는 것,
|
||||
전환 뒤 로그인 5회 200 과 DB (0 rows), 캐시 지표 96줄 원문
|
||||
a7-07-observe.txt A-7 12~15 — 교차 refresh 200, 롤링 재시작 뒤 400 Session not active,
|
||||
14 ① 블록을 kc-lab-1 에서 문서 그대로 쳤을 때 kubectl 이 막히고
|
||||
iptables 가 Bad argument 를 내며 ssh 가 Host key verification failed 이고
|
||||
그래도 "차단" 시각이 찍히는 것, 규칙이 0개인 것, lab host 에서 다시 친
|
||||
형태와 cluster_size 2→1(+75초)·해제 뒤 1→2(+60초), coord=t 둘,
|
||||
대조군 200 · 시험군 400, DB 정지 뒤 500 / 200
|
||||
a7-08-revert-checklist.txt A-7 복구와 확인표 아홉 줄 — args ["start"], git diff 빈 출력,
|
||||
로그인 뒤 세션 행 1, raw PREROUTING 비어 있음, cluster_size 양쪽 2,
|
||||
탐침 NotFound, 밖은 000 이고 --resolve 로 짚으면 200
|
||||
|
||||
--- 2026-09-17 저녁 추가 (B-5 를 1번부터 복구까지 다시 밟은 기록) ---
|
||||
b5-04-baseline.txt B-5 준비 1~5 — 파드 배치, --scan 이 빈 출력(키 0), save 가
|
||||
3600 1 300 100 60 10000 이고 appendonly yes, spec.volumes 에
|
||||
kube-api-access-* 가 함께 있는 것, PVC 둘 Bound, 공개 이름으로는
|
||||
세 경로가 000 이고 --resolve 로 짚으면 200/302/200, health 그룹 셋
|
||||
b5-05-redis-down.txt B-5 주입 1 과 관찰 — Redis 0/0, BFF 로그가 pollConnect 가 아니라
|
||||
ConnectionWatchdog "Cannot reconnect ... Connection refused",
|
||||
bff 둘 1/1 RESTARTS 0, 엔드포인트 true,true, 세 경로 200/000/000,
|
||||
/actuator/health 는 --max-time 10 이면 000 이고 60.046452 초 뒤 503
|
||||
(redis: QueryTimeoutException), token-boundary 는 90초까지 무응답
|
||||
b5-06-persistence.txt B-5 주입 2 와 지속성 시험 — 볼륨을 떼도 spec.volumes 가 빈 줄이
|
||||
아니라 kube-api-access-* 하나, appendonlydir 생성, 파드 삭제 뒤
|
||||
dbsize 0 인데 appendonly 는 yes(매니페스트 args 가 이미 yes),
|
||||
PVC 를 되돌린 뒤 dbsize 4 와 written-on-pvc, 네 지표 시계열 0개
|
||||
b5-07-revert-checklist.txt B-5 복구와 확인표 여덟 줄 — apply 후 redis 1/1, PVC Bound,
|
||||
appendonly yes, bff 둘 1/1, 엔드포인트 둘, b5:* 삭제 1건이고 남은 키는
|
||||
bff:session:sessions 셋, 밖은 000 이고 --resolve 로 짚으면 200
|
||||
d4a-09-dryrun-with-deploy-hook.txt
|
||||
/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh 를 755 로 놓은 뒤의
|
||||
`sudo certbot renew --dry-run`. 시뮬레이션은 성공(exit=0)했는데
|
||||
"Running deploy-hook command" 줄은 없다 — certbot 2.1.0 의 dry-run 은 deploy 훅을 건너뛴다.
|
||||
d4a-10-dryrun-dns-propagation-flake.txt
|
||||
같은 명령이 바로 앞뒤로는 성공했는데 이 판만 실패한 것. 사유는 DNS 전파로,
|
||||
"During secondary validation: DNS problem: NXDOMAIN looking up TXT for
|
||||
_acme-challenge.auth.hyeonworks.com" · propagation-seconds 기본값 30. certbot exit=1.
|
||||
d4a-11-deploy-hook-not-called-in-dry-run.txt
|
||||
위 판정의 근거 넷 — 훅 파일의 권한·크기, 성공한 출력에서 "deploy-hook" 을 센 값 0,
|
||||
certbot 2.1.0, `--help all` 에 --run-deploy-hooks 가 없다는 것(센 값 0).
|
||||
c2-05-probe-reachability-relive.txt
|
||||
C-2 §5 의 임시 탐침 파드(curlimages/curl:8.11.1)를 2026-09-17 재구성 랩에서 다시 띄운 것.
|
||||
app1.hyeonworks.com 이 192.168.122.10(엣지 게스트)으로 풀리고 HTTPS 200.
|
||||
원래 실행의 100.83.212.4(tailnet 헤어핀)와 주소가 다르다 — 지금은 CoreDNS 의
|
||||
coredns-custom 항목이 그 일을 한다. networkpolicy 는 여전히 없다.
|
||||
d4-01-before-force-renewal.txt / d4-02-force-renewal.txt / d4-03-after-force-renewal.txt
|
||||
D-4·D-4a 의 강제 갱신을 2026-09-17 에 kc-lab-edge 에서 실제로 친 것.
|
||||
01 = 치기 전 archive 목록·nginx worker PID·서빙 인증서의 serial/날짜
|
||||
02 = `sudo certbot renew --force-renewal` 전문. 배포 훅이 돌았고 certbot exit=0
|
||||
03 = 친 뒤의 같은 세 가지 + 세 이름의 HTTPS 응답.
|
||||
serial 06F3E0EF…1373 → 065547991777…3DF1, notAfter Dec 3 → Dec 16,
|
||||
worker 2629 4712 → 4745 4754. 갱신이 서빙까지 닿았다는 근거.
|
||||
|
||||
Reference in New Issue
Block a user