IL-0473 Jenkins project · 2023-07-07kubernetesazurenetworking
Azure 공개 쿠버네티스 클러스터의 노드 풀이 모두 지워지고 다시 만들어지지 않아 Jenkins 인프라 서비스가 4시간 넘게 멈췄다
2023-07-07 10:30 UTC 에 Jenkins 인프라 팀은 Azure 의 공개 쿠버네티스 클러스터를 1.25 로 올린 뒤, accounts.jenkins.io 처럼 클러스터 안에서 도는 서비스가 LDAP 서비스에 닿지 못한다는 것을 알았다. 파드의 출발 IP 가 전과 다른 대역이어서 IP 제한에 막혔다. 10:55 UTC 에 파드 IP 대역을 제대로 지정하는 수정인 Azure PR 431 을 배포했다. 이 변경으로 노드 풀이 모두 지워진 뒤 다시 만들어지지 않아, 클러스터에서 돌던 서비스가 모두 멈췄다.
클러스터를 처음 만들 때 가상 네트워크 대역으로 10.244.0.0/16 을, 서브넷으로 10.245.0.0/24 를 골랐다. 그런데 팀은 한 가지를 놓쳤다. IPv6 를 지원하려고 기본 CNI 대신 kubenet 네트워크를 쓰면, Azure 에서는 10.244.0.0/24 대역이 쿠버네티스 파드 네트워크의 기본 CIDR 이다. 팀은 두 대역이 서로 통신할 수 있다고 가정하고 잘못된 구성을 배포하려 했고, 그래서 노드 풀을 다시 만들지 못했다. 원래 클러스터를 지우자 공개 IP 를 담고 있던 노드 리소스 그룹도 함께 지워져 공개 IP 가 사라졌다.
팀은 11:16 부터 13:16 UTC 까지 두 시간 동안 네트워크 설정을 고쳐 클러스터를 처음부터 다시 만들었다. 파드 CIDR 을 겹치지 않는 대역으로 따로 지정하자 모든 것이 제대로 동작했다. 15:17 UTC 에 손으로 한 재구성 작업을 PR 로 올려 반영했고, 15:25 UTC 에 모든 서비스가 정상으로 돌아왔다. 서비스의 공개 IP 는 20.7.178.24 와 2603:1030:408:5::15a 로 바뀌었다.
- 심각도
- –
- 영향 범위
- Complete downtime of accounts.jenkins.io, fallback.get.jenkins.io, get.jenkins.io, incrementals.jenkins.io, javadoc.jenkins.io, plugin-health.jenkins.io, plugin-site-issues.jenkins.io, plugins.origin.jenkins.io, plugins.jenkins.io, rating.jenkins.io, repo.azure.jenkins.io, reports.jenkins.io, stories.jenkins.io, uplink.jenkins.io, weekly.ci.jenkins.io and www.origin.jenkins.io, and of the internal ldap.jenkins.io and the previews of *.jenkins.io pull requests on infra.ci.jenkins.io; partial or complete disruption of ci.jenkins.io, infra.ci.jenkins.io, issues.jenkins.io, plugins.jenkins.io, repo.jenkins-ci.org and www.jenkins.io; the public IPs of these services changed
- 영향 사용자
- Jenkins users and contributors, including users behind corporate firewalls with an allow-list
- 지역
- –
- 감지까지
- –
- 복구까지
- 4h 20m
증상
2023-07-07 11:05 UTC 부터 15:25 UTC 까지 Jenkins 인프라의 공개 서비스 여럿이 완전히 멈췄다. accounts.jenkins.io, get.jenkins.io, plugins.jenkins.io 를 비롯해 Azure 의 공개 쿠버네티스 클러스터에서 돌던 서비스가 모두 내려갔다.
완전히 멈춘 공개 서비스는 accounts.jenkins.io, fallback.get.jenkins.io, get.jenkins.io, incrementals.jenkins.io, javadoc.jenkins.io, plugin-health.jenkins.io, plugin-site-issues.jenkins.io, plugins.origin.jenkins.io, plugins.jenkins.io, rating.jenkins.io, repo.azure.jenkins.io, reports.jenkins.io, stories.jenkins.io, uplink.jenkins.io, weekly.ci.jenkins.io, www.origin.jenkins.io 였다. 내부 서비스인 ldap.jenkins.io 와 infra.ci.jenkins.io 의 *.jenkins.io PR 미리보기도 완전히 멈췄다. ci.jenkins.io, infra.ci.jenkins.io, issues.jenkins.io, plugins.jenkins.io, repo.jenkins-ci.org, www.jenkins.io 는 일부 또는 전부 끊겼다.
그보다 앞서 10:30 UTC 에 클러스터를 1.25 로 올린 뒤 accounts.jenkins.io 같은 클러스터 안 서비스가 LDAP 서비스에 닿지 못했다. 파드의 출발 IP 가 전과 다른 대역이어서 IP 제한에 막혔다.
이를 고치려고 10:55 UTC 에 파드 IP 대역을 지정하는 변경을 배포하자 노드 풀이 모두 지워졌고 다시 만들어지지 않았다. 그 클러스터에서 돌던 서비스가 모두 멈췄다.
복구 뒤 서비스들의 공개 IP 가 20.7.178.24 와 2603:1030:408:5::15a 로 바뀌었다. 허용 목록을 쓰는 회사 방화벽 뒤의 사용자는 DNS, 프록시, 방화벽 설정을 바꿔야 서비스에 닿을 수 있었다.
원인
원인 설정 변경
- 촉발
- 1.25 업그레이드 뒤 파드의 출발 IP 대역이 바뀌어 LDAP 접근이 막히자, 파드 IP 대역을 지정하는 수정인 Azure PR 431 을 10:55 UTC 에 배포했다. 이 변경으로 노드 풀이 모두 지워졌고 다시 만들어지지 않았다.
감지
10:30 UTC 에 1.25 업그레이드를 마친 뒤 팀이 클러스터 안 서비스가 LDAP 서비스에 닿지 못한다는 것을 알아챘다.
조치
- 네트워크 설정을 고쳐 클러스터를 처음부터 다시 만들었다. 11:16 부터 13:16 UTC 까지 두 시간이 걸렸다.
- 파드 CIDR 을 가상 네트워크와 겹치지 않는 별도 대역으로 지정했다.
- 서비스의 공개 IP 와 DNS 레코드를 새 주소 20.7.178.24 와 2603:1030:408:5::15a 로 바꿨다.
- 15:17 UTC 에 IP 설정을 포함해 클러스터를 손으로 다시 만든 작업을 PR 로 올려 코드에 반영했다.
후속 조치
- Management Lock 을 걸어 공개 IP 가 지워지지 않게 한다.
- 공개 IP 를 별도 리소스 그룹에 두고, 쿠버네티스가 관리하는 로드 밸런서가 그 그룹을 쓰도록 service.beta.kubernetes.io/azure-load-balancer-resource-group 애너테이션으로 설정한다.
- 작업을 준비할 때 네트워크 구성과 대역이 겹칠 가능성을 쉽게 볼 수 있도록 네트워크 다이어그램과 문서를 개선한다.
- AKS 노드 풀 설정을 한꺼번에 바꾸지 않는다. 첫 노드 풀에서 문제를 잡았다면 전체 장애를 피할 수 있었다. arm64 노드 풀에서 PR-3623 으로 이 작업을 하고 있다.
교훈
허용 목록을 둔 회사 방화벽 뒤의 사용자가 있어서 공개 IP 는 되도록 바뀌지 않아야 한다. 그런데 원래 클러스터를 지우면서 노드 리소스 그룹과 함께 공개 IP 가 지워졌다. 노드 풀 설정을 한꺼번에 바꾸지 않았다면 첫 노드 풀에서 문제를 잡아 전체 장애를 피할 수 있었다. 팀은 거의 모든 공개 서비스를 담은 클러스터가 완전히 무너져도 4시간 안에 복구할 수 있다는 것을 이번에 확인했다. 그 바탕은 여러 해 동안 함께 해 온 아키텍처 정의, 인프라 구축, 데이터 백업 작업이라고 했다.
출처
관련 사례
같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
IL-0192Crossplane 컴포지션의 병합 정책 변경이 Service 타입을 ClusterIP 로 바꿔 클라우드 로드 밸런서가 지워지고 Grafana Cloud 서비스의 약 25%가 끊겼다.Grafana Labs · 2025같은 원인 · 공통 클라우드 로드 밸런서
IL-0114클러스터 용량을 늘리던 중 버전이 고정되지 않은 VPC CNI 플러그인이 자동으로 업데이트돼 새 파드가 IP 를 받지 못하고 Pending 에 머물렀고, 메인넷 운영 환경의 정산이 약 3.5시간 멈췄다.CoW Protocol · 2024같은 원인 · 공통 노드 풀
IL-0019EKS 모듈 18 업그레이드로 새 노드의 디스크가 20Gb 로 줄어 이미지 풀이 no space left on device 로 실패했다UK Ministry of Justice · 2023같은 원인 · 공통 노드 풀
IL-0017live 클러스터 노드 6대에서 VPC CNI 가 IP 주소를 할당하지 못해 새 파드가 ContainerCreating 에 멈췄다UK Ministry of Justice · 2023같은 원인 · 공통 노드 풀
IL-0091Terraform 으로 노드 인스턴스 타입을 바꾸자 노드가 한꺼번에 교체되어 사용자 운영 파드가 모두 지워지고 서비스가 내려갔다UK Ministry of Justice · 2023같은 원인 · 공통 노드 풀
같은 원인 · 공통 노드 풀
IL-0109로그 수집을 고치려던 EKS 노드 롤오버가 꼬이면서 Auto Scaling 그룹이 정상 워커 노드를 모두 종료해 클러스터에 노드가 하나도 남지 않았다.DFDS · 2023 · sev1같은 원인 · 공통 노드 풀
IL-0116CNI 설정 변경이 스테이징에 없던 하드웨어 종류와 호환되지 않아 GPU 클러스터 하나의 워크로드가 네트워크 연결을 잃었고, text-davinci-003 모델이 완전히 멈췄다.OpenAI · 2023같은 원인 · 공통 CNI 플러그인
IL-0513쿠버네티스 노드 순차 재시작 중 Ingress 가 관리하는 ELB 의 HTTPS 리스너가 꺼져 PyPI 백엔드에 HTTPS 로 닿지 못했다Python Software Foundation · 2022같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
IL-0208GitLab Helm 차트 업그레이드가 Service 와 Deployment 의 포트 이름을 바꿔 GCP 로드 밸런서가 다시 구성되는 동안 GitLab.com 요청이 느려지고 50x 오류가 났다GitLab · 2022같은 원인 · 공통 클라우드 로드 밸런서
IL-0111메인 인그레스 컨트롤러를 Traefik v2 로 바꾸자 X-Forwarded 헤더가 전달되지 않아 Okta 로그인이 깨졌고, DFDS 온라인 예약이 한 시간 넘게 멈췄다DFDS · 2021같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
IL-0052인증 없이 인터넷에 열린 Weave Scope 대시보드를 통해 암호화폐 채굴기가 개발 클러스터와 스테이징 클러스터의 모든 노드에서 돌았다.JW Player · 2019같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 노드 풀
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0473
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0473/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.