복구 런북을 기준으로 클러스터를 다시 밀어보면서 초반에 빠진 부분들을 메모함.
문서만 볼 때는 괜찮아 보였는데, 실제로 VM을 지우고 다시 만들면서 보이는 것들이 있었음.
먼저 VM 정리 쪽.
기존 VM을 삭제하고 다시 만들 때 VM 디렉터리나 libvirt 쪽 잔여물이 남을 수 있음.
수동으로 하나씩 지우기보다 정리 스크립트가 필요해 보였음.
# libvirt VM 목록을 확인한다.
virsh list --all
# VM 디스크 볼륨이 남아 있는지 확인한다.
virsh vol-list --pool <pool-name>
SSH known_hosts 문제도 있었음.
VM을 같은 IP로 다시 만들면 SSH host key가 바뀌어서 중간자 공격 경고가 뜰 수 있음.
테스트 환경에서는 같은 IP에 새 VM을 계속 붙이니까 known_hosts 정리 절차가 필요함.
# 기존 SSH host key 기록을 확인한다.
ssh-keygen -F 192.168.200.42
# 재생성한 VM의 기존 host key 기록을 제거한다.
ssh-keygen -R 192.168.200.42
LB 서버 쪽도 빠진 부분이 보임.
문서에는 커널 파라미터 확인은 있었는데, 실제 적용 절차가 부족했음.
특히 HAProxy와 keepalived를 쓰려면 LB 서버의 네트워크 설정이 맞아야 함.
# LB 서버의 커널 파라미터를 확인한다.
sysctl net.ipv4.ip_nonlocal_bind
sysctl net.ipv4.ip_forward
필요한 설정은 문서에 명확히 넣어야 함.
net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_forward=1
LB 서버도 Ansible playbook으로 관리하는 쪽이 맞아 보였음.
초기에는 일부 작업을 수동으로 했는데, 재구축을 반복하려면 LB도 자동화 대상에 넣는 게 편함.
HAProxy 재구동도 playbook으로 정상 처리되지 않는 상황이 있었음.
결국 수동으로 재구동함.
# HAProxy 상태를 확인한다.
sudo systemctl status haproxy
# HAProxy를 수동으로 재시작한다.
sudo systemctl restart haproxy
# HAProxy가 정상 기동했는지 확인한다.
sudo systemctl status haproxy
control-plane join 명령도 따로 메모함.
# k8s-cp2를 control-plane 노드로 join한다.
sudo kubeadm join 192.168.200.48:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <certificate-key>
worker join 형식도 같이 정리.
# worker 노드를 클러스터에 join한다.
sudo kubeadm join 192.168.200.48:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
containerd registry 설정도 귀찮은 부분이 있었음.
/etc/containerd/config.toml에서 config_path를 맞추고, /etc/containerd/certs.d 아래 registry 설정을 넣는 흐름.
이건 나중에 GitLab에 도메인과 HTTPS를 붙이는 방향으로 정리하는 게 낫다고 봄.
# containerd 설정에서 registry config_path를 확인한다.
grep -n "config_path" /etc/containerd/config.toml
초반 복구 런북은 너무 요약하면 실제 복구 때 의미가 떨어짐.
한 번에 보기 좋은 요약도 필요하지만, 재구축할 때는 빠진 명령이나 조건이 있으면 바로 막힘.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 19 | DGX Kubernetes 구성 계획 | 김영훈 | 2026.06.08 | 25 |
| 18 | Kubernetes 기본 클러스터, ingress-nginx 설치 | 김영훈 | 2026.06.09 | 15 |
| 17 | Docker Compose 서비스를 Kubernetes로 이전(깃랩 도커 저장소 필요) [2] | 김영훈 | 2026.06.10 | 20 |
| 16 | yeonghoon.kim 배포 파일을 Helm Chart로 전환 [1] | 김영훈 | 2026.06.12 | 18 |
| 15 | SOPS age로 Kubernetes Secret 암복호화 | 김영훈 | 2026.06.15 | 23 |
| 14 | ArgoCD와 GitOps 구조 준비 | 김영훈 | 2026.06.16 | 16 |
| 13 | CoreDNS로 GitLab Registry 내부 주소 고정 | 김영훈 | 2026.06.17 | 19 |
| » | 복구 런북 초반 누락 사항 정리 | 김영훈 | 2026.06.17 | 15 |
| 11 | SOPS Secret 복구와 ArgoCD root Application 적용 | 김영훈 | 2026.06.18 | 28 |
| 10 | 관측 스택과 앱 배포 저장소 구조 정리 | 김영훈 | 2026.06.19 | 23 |
| 9 | ArgoCD 복구 중 GitLab 접근 문제 정리 | 김영훈 | 2026.06.22 | 26 |
| 8 | ImagePullBackOff와 registry pull secret 누락 | 김영훈 | 2026.06.22 | 17 |
| 7 | worker 재부팅 전 drain 절차 정리 | 김영훈 | 2026.06.26 | 20 |
| 6 | control-plane 장애 시나리오 관찰 | 김영훈 | 2026.06.27 | 12 |
| 5 | OutOfSync와 Degraded 구분하기 | 김영훈 | 2026.06.28 | 25 |
| 4 | Git revert는 기록을 지우는 게 아니라 되돌리는 기록을 남기는 것 | 김영훈 | 2026.06.29 | 19 |
| 3 | Stateful과 Stateless 구분해보기 | 김영훈 | 2026.07.02 | 23 |
| 2 | GitLab Registry PAT 만료로 이미지 Pull 실패 | 김영훈 | 2026.07.08 | 14 |
| 1 | yeonghoon.kim php 업그레이드 | 김영훈 | 2026.07.09 | 0 |