Infrastructure
Linux · Network · Cloud · Kubernetes
01 / 프로젝트
담당 역할과 주요 결과를 소개합니다. 상세 페이지에는 선택 기준, 검증 결과와 한계를 정리했습니다.
5인 팀 프로젝트
식비 예산과 사용자 행동 데이터를 기반으로 레시피·상품 추천과 AI 기능을 연결한 5인 팀 프로젝트입니다.
확인 자료 · 당시 비교표 / 수정 전후 실측 / 데이터 흐름 조사
개인 Retrieval / RAG PoC · 개발 평가
경험에 대한 질문에서 근거를 찾고, 답변 가능한 범위와 거절 조건을 나눠 확인한 개인 실험입니다.
확인 자료 · 확정한 설정 / 개발 평가 / 남은 검색 실패
개인 상황판 · 자동화/운영
취업 준비에 필요한 것을 한 화면에 모은 개인 상황판입니다.
취업 공고 수집, 분석, 학습 및 학습기록, 메일 요약 및 분류, 알림 등의 다양한 개인 기능들을 이 한 페이지에서 관리할 수 있습니다.
확인 자료 · 훼손 실험 / 집계 정합성 / 재현 빌드
Kubernetes 실습
kubeadm 멀티노드 클러스터를 구성하고 Network, Storage, RBAC, Scaling 문제를 Event와 리소스 상태로 확인한 개인 실습입니다.

Linux · 네트워크 실습
Linux 네트워크와 이중화 환경을 구성하고, 연결 장애와 복구 과정을 패킷·로그·메트릭으로 확인하는 실습입니다.
02 / Incident & Runbook
증상에서 원인을 좁힌 과정과 조치 결과를 정리했습니다. 조사를 마치지 못한 사례는 확인된 사실과 남은 가설을 구분했습니다.
카카오톡에서 geonu.site 링크를 누르면 보안상의 이유로 열리지 않았습니다. 데스크톱 브라우저에서는 경고를 넘기면 접속돼서 바로 드러나지 않았습니다.
185.199.108~111.153)를 정확히 가리켰고, www CNAME도 정상이었습니다. 리졸버 두 곳에서 같은 값이 나왔습니다.openssl s_client로 확인한 subject가 CN=*.github.io였고, SAN 목록에 geonu.site가 없었습니다.https_certificate 객체 자체가 없었습니다.DNS 문제가 아니라 GitHub 쪽에서 커스텀 도메인 인증서 발급이 끝나지 않은 상태였습니다. 그래서 기본 와일드카드 인증서가 그대로 제시됐고, 호스트명이 맞지 않아 TLS 연결이 실패했습니다. 카카오톡 인앱 브라우저는 이 경우 우회 선택지 없이 차단합니다.
DNS는 손대지 않았습니다. GitHub Pages 설정에서 커스텀 도메인을 지웠다가 다시 등록해 인증서 발급을 새로 걸었고, 발급이 끝난 뒤 Enforce HTTPS를 켰습니다.
https://geonu.site가 HTTP/2 200으로 응답하고, Pages API의 인증서 상태가 approved, https_enforced가 true로 바뀌었습니다. 저장소 전체에 http:// 참조는 0건이라 혼합 콘텐츠 문제는 없었습니다.
추천이 화면에 노출된 기록은 쌓이는데, 개인화 랭킹 학습에 필요한 긍정 label이 한 건도 만들어지지 않았습니다.
백엔드 요청 모델에는 필드가 있었지만 Frontend가 요청 본문에 값을 싣지 않아 저장 시점부터 비어 있었습니다. 학습 SQL은 그 키로 조인하므로 한쪽이 비어 있으면 조인되지 않습니다.
전달 경로를 수정하고, 수정 후 이벤트가 실제로 값을 갖고 저장되는지와 학습 데이터가 연결되는지를 다시 확인했습니다.
끊겨 있던 노출과 행동의 연결이 복구돼, 이후 쌓이는 데이터부터는 label이 생성될 수 있는 상태가 됐습니다.
응답 내용은 문제가 없는데 검증 단계에서 막히는 경우가 반복됐습니다. 막히면 템플릿 답변으로 대체되므로 사용자가 보는 답의 품질이 떨어졌습니다.
근거로 인정하는 범위에 사용자 질문이 빠져 있었습니다. 「8천원」 같은 한글 수사 표현도 숫자와 이어지지 않았습니다.
근거 문자열에 사용자 질문 원문과 한글 수사를 숫자로 편 정규화 결과를 함께 넣도록 처리 방식을 바꿨습니다. 모델은 교체하지 않았습니다.
같은 275건 평가 세트를 다시 돌려 통과가 166건에서 247건으로 늘었습니다(약 60% → 90%). 문자열 구성만 바꾼 변경이라 LLM 호출은 늘지 않았습니다.
워크로드는 정상으로 보이는데 새 배포만 실패했습니다. 파드 상태와 재시작 횟수만 보면 이상이 없었습니다.
레지스트리에 닿지 못하는 상태였고, 캐시된 이미지 덕분에 겉으로는 정상처럼 보였습니다.
파드가 Running인 것과 새 배포가 가능한 것은 다릅니다. 현재 상태가 정상인 것과 다음 변경을 수행할 수 있는 것은 별개이고, 둘 다 운영 상태의 일부입니다. 점검 실패를 대응으로 연결하려면 알림 경로도 함께 확인해야 합니다.
매일 새벽 3시 30분에 도는 수집 작업에서 첫 카테고리 하나만 사흘 연속 아무것도 못 가져왔습니다. 그런데 작업 자체는 실패 건수 0으로 기록돼 성공처럼 보였습니다.
그 시각 첫 요청이 받은 것이 평소의 카테고리 페이지가 아니라 앱 번들이 붙지 않은 작은 문서였다는 정황까지 좁혔습니다. 다만 그 응답의 실제 HTTP 상태와 종류는 확보하지 못해 무엇이었는지는 확정하지 않았습니다. 차단·오류 페이지가 유력한 후보였습니다. 네트워크 지연이나 파드 축출, DNS 재시작 같은 후보는 근거가 맞지 않아 기각 목록에 남겼습니다.
응답의 종류를 구분하지 못하게 한 관측 공백은 코드에 있었습니다. 페이지 이동의 응답 객체를 버려서 HTTP 상태코드가 로그에 남지 않았고(브라우저 자동화는 4xx·5xx에 예외를 던지지 않습니다), 렌더 대기 함수의 반환값도 버려서 「한 장도 렌더되지 않음」과 「렌더는 됐지만 파싱이 0」이 구분되지 않았습니다. 이 관측 공백을 조사 기록으로 남겼습니다.
부분 실패를 성공으로 적으면 다음 사람이 같은 조사를 처음부터 다시 합니다. 실패 건수만 보지 않고 기대 수량 대비 실제 수집량을 함께 보는 편이 안전합니다. 조사 내내 클러스터는 읽기만 했고 변경은 로컬에서만 재현했습니다.
영수증을 찍어 품목과 금액을 자동으로 넣으려면 감열지 인쇄와 구겨진 종이에서도 구조화된 결과가 나와야 했습니다. 어떤 방식이 맞는지 미리 알 수 없었습니다.
경량 비전 모델이 합계 정합 기준 13장 중 12장이었고 실행 오류가 없었습니다. 추론 옵션을 켠 상위 모델은 더 낫지 않으면서 비용이 수십 배였고, 로컬 엔진은 구조화 출력 자체가 나오지 않았습니다.
경량 비전 모델을 채택하고, 사용자가 결과를 확인·수정하는 단계를 앞에 둬서 인식 오류를 사람이 보정할 수 있게 했습니다.
03 / Skills
Linux · Network · Cloud · Kubernetes
Metrics · Logs · Events · Troubleshooting
Python · IaC · Repetitive operations
Evaluation · Data flow · Serving · Reliability