Incident Library

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 서비스에 닿지 못한다는 것을 알아챘다.

조치

후속 조치

교훈

허용 목록을 둔 회사 방화벽 뒤의 사용자가 있어서 공개 IP 는 되도록 바뀌지 않아야 한다. 그런데 원래 클러스터를 지우면서 노드 리소스 그룹과 함께 공개 IP 가 지워졌다. 노드 풀 설정을 한꺼번에 바꾸지 않았다면 첫 노드 풀에서 문제를 잡아 전체 장애를 피할 수 있었다. 팀은 거의 모든 공개 서비스를 담은 클러스터가 완전히 무너져도 4시간 안에 복구할 수 있다는 것을 이번에 확인했다. 그 바탕은 여러 해 동안 함께 해 온 아키텍처 정의, 인프라 구축, 데이터 백업 작업이라고 했다.

출처

관련 사례

내 클러스터에도 있는지 확인하기

kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이 사례와 같은 상태를 점검합니다. 이 사례의 구성 요소: 노드 풀, CNI 플러그인, 클라우드 로드 밸런서. 점검 항목의 근거는 이 사례 같은 공개 보고서입니다.

AI 도구와 스크립트용

API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.