새 블로그를 붙일 때 제일 중요하게 본 건, 기존 서비스랑 충돌 없이 자연스럽게 얹히는 구조였다. 이미 같은 서버에서 k3s와 Traefik으로 여러 서비스를 운영하고 있었기 때문에, 이번에는 WordPress 블로그를 새로 올리더라도 구조를 더 복잡하게 만들고 싶지 않았다. 목표는 단순했다. blog.homeops.me를 WordPress로 열고, 기존 서비스는 그대로 둔 채 Host 기반 라우팅으로 분기하는 것.
결과부터 말하면, 구조 자체는 생각보다 단순하게 정리됐다. Kubernetes 위에 Bitnami WordPress를 올리고, MariaDB를 같이 붙이고, Traefik이 blog.homeops.me 요청을 받아 WordPress 서비스로 넘기게 만들었다. HTTPS는 Cloudflare와 Traefik 조합으로 정리했다. 다만 실제 작업 시간은 배포보다 연결 쪽에서 더 많이 들었다. 특히 인증서와 DNS에서 시간을 꽤 썼다.
전체 구조
구조를 단순하게 그리면 아래 흐름이다.
flowchart TD
U[사용자 브라우저]
U --> CF[Cloudflare]
CF --> T[Traefik Ingress]
T --> I[Ingress: blog.homeops.me]
I --> S[WordPress Service]
S --> WP[WordPress Pod]
WP --> DB[(MariaDB)]
핵심은 복잡하지 않다. 사용자가 blog.homeops.me로 접근하면 Cloudflare를 거치고, Traefik이 Host 기준으로 이 요청을 받아 WordPress 쪽으로 보낸다. WordPress는 내부에서 MariaDB를 붙여서 동작한다.
왜 이렇게 구성했나
새 블로그를 붙이기 위해 별도 서버를 하나 더 만들 수도 있었지만, 이미 운영 중인 구조를 보면 그럴 이유는 크지 않았다. k3s 클러스터가 있고, Traefik이 Ingress Controller로 자리 잡고 있고, 기존 서비스들도 Host 기반으로 나뉘어 있었다. 이런 상황에서는 새로운 블로그를 가장 단순하게 추가하는 방법이 결국 기존 패턴을 그대로 따르는 것이다.
WordPress는 처음부터 너무 손이 많이 가는 방식으로 설치하고 싶지 않았다. 운영 편의성을 생각하면 Bitnami 차트가 제일 무난했다. WordPress와 데이터베이스를 같이 올리기 쉽고, PVC도 자연스럽게 붙고, 나중에 Helm 기준으로 상태를 확인하기도 편하다. 지금은 최소 사양으로 시작하고, 실제 사용량이 늘어나면 그때 구조나 리소스를 조정하는 쪽이 현실적이라고 봤다.
배포 자체는 크게 어렵지 않았다
WordPress와 MariaDB를 apps 네임스페이스에 올리고, 스토리지를 붙이고, Traefik이 볼 수 있게 Ingress를 만드는 것까지는 비교적 순조로웠다. Pod가 뜨는지, Service가 제대로 붙는지, PVC가 살아 있는지 확인하는 수준에서는 큰 문제 없이 올라왔다. WordPress Pod 안쪽까지 들어가 보면 이미 페이지가 정상적으로 응답하고 있었고, 데이터베이스도 같이 살아 있었다.
이 단계만 보면 거의 끝난 것처럼 느껴진다. 실제로 이런 작업은 앱이 뜨기만 하면 끝났다고 생각하기 쉽다. 그런데 외부 도메인으로 접근이 안 되면 결국 사용자는 “안 된다”만 보게 된다. 이번에도 바로 그 구간에서 시간이 오래 걸렸다.
진짜 시간은 연결부에서 들었다
처음 막힌 건 인증서 발급이었다. Traefik에서 Cloudflare DNS challenge 방식으로 HTTPS를 붙이려 했는데, 로그를 보니 Cloudflare API token 인증이 실패하고 있었다. 겉으로 보면 단순히 인증서가 안 나오는 문제지만, 실제 원인은 DNS 수정 권한이 없는 토큰을 쓰고 있었던 것이었다. 이런 문제는 메시지만 보면 헷갈리기 쉬운데, 로그를 차분히 보면 의외로 답이 단순할 때가 많다. 이번에도 결국 토큰을 다시 정리하고 권한을 맞추는 걸로 해결됐다.
그 다음에는 더 황당하게도 blog.homeops.me가 열리지 않았다. 처음엔 Traefik 라우팅이 덜 반영됐나 싶어서 Ingress, Service, Pod, 로그를 계속 확인했다. 그런데 안쪽은 전부 정상이었다. WordPress Pod 직접 호출도 200 응답이 나오고 있었고, Kubernetes 리소스도 문제 없었다. 그럼 남는 건 DNS다. 실제로 확인해보니 blog.homeops.me 레코드가 아예 없었다.
이런 문제는 한 번 겪고 나면 허무하다. Kubernetes도 맞고, WordPress도 맞고, Traefik 설정도 거의 맞는데, 정작 도메인이 안 붙어 있으니 외부에서는 아무것도 안 된다. 결국 Cloudflare에서 도메인 레코드를 정리하고 나서야 외부에서 정상적으로 https://blog.homeops.me로 붙기 시작했다.
중간에 같이 정리한 것들
단순히 블로그 하나만 붙인 게 아니라, 기존 Traefik 설정도 같이 손봤다. 예전에 쓰던 resolver 이름을 참고하던 리소스들이 로그에 경고를 남기고 있었는데, 이런 경고가 쌓이면 나중에 실제 문제를 보기 어려워진다. 서비스가 돌아가기만 한다고 끝내기보다, 운영 중 계속 거슬리는 경고도 같이 정리하는 게 낫다.
WordPress 초기 세팅도 아주 기본적인 것만 먼저 맞췄다. 언어는 한국어로 활성화했고, permalink는 /%postname%/ 구조로 바꿨다. 이런 건 초기에 잡아두는 편이 훨씬 편하다. 나중에 글이 쌓인 뒤에 주소 체계를 바꾸는 건 괜히 일이 커진다.
구조를 조금 더 개념적으로 보면
운영 관점에서 보면 이번 구조는 아래처럼 이해하면 가장 편하다.
flowchart TD
A[Cloudflare DNS / Proxy]
A --> B[Traefik]
B --> C{Host Rule}
C -->|blog.homeops.me| D[WordPress]
C -->|기존 도메인들| E[다른 서비스들]
D --> F[wp-content PVC]
D --> G[MariaDB PVC]
이렇게 보면 왜 이 구조가 편한지 감이 온다. 도메인이 늘어나도 Traefik에서 Host 기준으로 나눌 수 있고, 각 서비스는 자기 리소스를 따로 가진 채 유지된다. 즉, 서비스가 하나 더 늘어나더라도 기존 구성을 크게 흔들지 않고 붙일 수 있다.
이번에 다시 느낀 점
이번 작업을 하면서 다시 느낀 건, 실제 운영에서는 앱을 띄우는 일보다 앱이 외부에서 제대로 보이게 만드는 일이 더 어렵다는 점이다. WordPress를 쿠버네티스에 올리는 것 자체는 이제 크게 낯설지 않다. Helm 차트도 잘 되어 있고, 스토리지도 붙일 수 있고, Pod와 Service 상태를 보는 것도 어렵지 않다. 그런데 DNS, 프록시, 인증서, Ingress, Cloudflare 권한 같은 연결부는 어디 하나만 어긋나도 전체가 안 된다.
겉으로 보면 블로그 하나 붙인 일인데, 실제로는 쿠버네티스, Traefik, Cloudflare, DNS, TLS가 한 줄로 다 연결되어 있었다. 결국 시간을 가장 많이 잡아먹은 건 앱 자체보다 연결부였다.
그래서 지금은 어떤 상태인가
지금은 blog.homeops.me로 WordPress 블로그가 열리고, 기본적인 운영에 필요한 최소 구조는 갖춰진 상태다. 기존 서비스와 충돌 없이 Host 기반으로 나뉘고, WordPress는 Helm 차트로 관리되고, 데이터는 PVC에 남고, 외부 HTTPS는 Traefik과 Cloudflare로 정리된다. 처음부터 과하게 큰 구조를 만들지 않고, 지금 필요한 만큼만 얹어둔 상태라 오히려 유지하기 편하다.
물론 여기서 끝은 아니다. 앞으로 해야 할 건 분명하다. 백업 방식을 더 다듬어야 하고, 블로그 구조나 카테고리도 조금씩 정리해야 하고, 글이 쌓이면 광고와 분석도 붙여야 한다. 하지만 이런 건 블로그가 실제로 열리고 난 뒤에 고민해도 늦지 않다.
다음 글은 뭘 쓰면 좋을까
첫 글을 이렇게 남겼으니, 다음 글은 두 방향 중 하나가 자연스러울 것 같다. 하나는 이번 구조를 조금 더 넓게 설명하는 글이다. 예를 들어 한 서버에서 여러 도메인을 Host 기반으로 나눠 운영하는 방법 같은 글이다. 다른 하나는 조금 더 개인적인 방향으로, 왜 Homeops라는 블로그를 따로 만들었는지, 여기서 어떤 주제를 쌓아가고 싶은지 정리하는 글이다.
개인적으로는 블로그를 오래 가져가려면 너무 정보성 글만 쌓는 것보다, 운영기와 생각을 적절히 섞는 게 낫다고 본다. 그래야 검색 유입용 글만 쓰는 공간이 아니라, 나중에 봐도 흐름이 남는 블로그가 된다.
어쨌든 첫 단계는 끝났다. blog.homeops.me는 열렸고, 이제부터는 여기다 뭘 쌓을지가 더 중요해졌다. 기술적으로 블로그를 붙이는 일은 끝났고, 이제 진짜로 블로그를 운영하는 단계가 시작된 셈이다.