쿠버네티스 인그레스를 사용하다 보면 예상치 못한 문제에 부딪힐 수 있습니다. 가장 흔한 두 가지 시나리오를 살펴보죠!
시나리오 1: "앗! 실수로 인그레스 리소스를 삭제했어요!" 😱
💥 문제 상황 (Impact):
kubectl delete ingress my-ingress
같은 명령어로 중요한 인그레스 리소스를 실수로 삭제하면 어떻게 될까요?
- 외부 접속 불가: 인그레스 리소스는 라우팅 규칙 그 자체입니다. 이게 사라지면 인그레스 컨트롤러는 더 이상 해당 규칙(예:
app.mycompany.com
으로 오는 요청을my-app-service
로 보내라)을 알지 못하게 됩니다. 결과적으로, 이전에 이 인그레스를 통해 접속되던 외부 트래픽은 더 이상 목적지 서비스로 라우팅되지 않습니다. 사용자는 주로404 Not Found
(컨트롤러 기본 백엔드가 설정되지 않은 경우) 또는 컨트롤러 기본 응답을 받게 됩니다. - 서비스 자체는 정상: 중요한 점은 인그레스 리소스 삭제가 내부 서비스(Deployment, Pod, Service 등) 자체를 삭제하는 것은 아니라는 것입니다. 서비스는 클러스터 내부에서는 여전히 정상적으로 실행 중일 수 있습니다. 단지 외부로 통하는 문(인그레스 규칙)이 사라진 것뿐이죠.
(주의!) 만약 인그레스 리소스_가 아니라, 인그레스 _컨트롤러 자체의 파드나 디플로이먼트, 또는 컨트롤러가 노출된 서비스(타입: LoadBalancer 등)를 삭제했다면, 해당 컨트롤러가 처리하던 모든 외부 트래픽이 중단됩니다. 이건 훨씬 더 심각한 상황이죠! 😨
🛠️ 해결 방법 (Solution):
- 즉시 복구 (YAML 재적용):
- 가장 빠르고 확실한 방법은 삭제된 인그레스 리소스의 정의가 담긴 YAML 파일을 다시 적용(
kubectl apply -f my-ingress.yaml
)하는 것입니다. - 핵심: 이를 위해서는 평소에 모든 쿠버네티스 리소스 정의(YAML 파일)를 Git과 같은 버전 관리 시스템으로 철저히 관리하는 습관이 매우 중요합니다! ✨ 코드처럼 인프라 설정도 형상 관리를 해야 실수를 되돌리기 쉽습니다.
- 가장 빠르고 확실한 방법은 삭제된 인그레스 리소스의 정의가 담긴 YAML 파일을 다시 적용(
- 백업 및 복구 도구 활용:
- Velero와 같은 쿠버네티스 백업 솔루션을 사용하여 클러스터 리소스 상태를 정기적으로 백업하고, 필요시 특정 시점으로 복원할 수 있습니다.
- 접근 제어 강화 (RBAC):
- 쿠버네티스의 RBAC(Role-Based Access Control) 설정을 통해 특정 사용자나 그룹이 중요한 리소스(특히 운영 환경의 인그레스)를 함부로 삭제하지 못하도록 권한을 제한해야 합니다. 🔒 최소 권한의 원칙을 적용하세요.
- 모니터링 및 알림:
- 인그레스 리소스의 상태 변화(생성, 수정, 삭제)를 감지하고 알림을 보내는 모니터링 시스템(예: Prometheus + Alertmanager 조합)을 구축하면 문제를 빠르게 인지하고 대응할 수 있습니다. 🔔
시나리오 2: "인그레스 규칙에 내부 서비스 정보를 잘못 적었어요!" 😵💫
💥 문제 상황 (Impact):
인그레스 YAML 파일의 rules
섹션 아래 backend
부분에 서비스 이름(service.name
)이나 서비스 포트(service.port.name
또는 service.port.number
)를 잘못 기재하면 어떻게 될까요?
# 예시: 잘못된 설정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: app.mycompany.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
# 실수! 실제 서비스 이름은 'my-real-app-service' 인 경우
name: my-app-service-typo
port:
# 실수! 실제 서비스 포트는 8080 인 경우
number: 80
- 서비스 연결 실패 (5xx 에러): 인그레스 컨트롤러는 외부 요청을 받아서 규칙에 따라
my-app-service-typo
라는 이름의 서비스를 찾으려고 시도합니다.- 만약
my-app-service-typo
라는 서비스가 아예 존재하지 않으면, 컨트롤러는 요청을 전달할 대상을 찾지 못해503 Service Temporarily Unavailable
오류를 반환할 가능성이 높습니다. - 만약 서비스 이름은 맞지만 포트 번호(
80
)가 잘못되었다면 (실제 서비스는8080
포트를 사용), 컨트롤러는 올바른 서비스까지는 찾아갔지만, 해당 서비스가 리스닝하지 않는 포트로 연결을 시도하게 됩니다. 이 경우에도 연결이 실패하여502 Bad Gateway
또는503 Service Unavailable
오류가 발생할 수 있습니다.
- 만약
- 엉뚱한 서비스로 연결: 만약 실수로 입력한 서비스 이름/포트가 _존재하는 다른 서비스_의 것이라면, 트래픽이 원래 의도했던 서비스가 아닌 엉뚱한 서비스로 흘러 들어가는 심각한 문제가 발생할 수 있습니다. 🤯
🛠️ 해결 방법 (Solution):
인그레스 설정 확인 (YAML 검토):
- 가장 먼저 인그레스 리소스의 YAML 정의를 다시 한번 꼼꼼히 확인합니다.
rules.http.paths.backend.service.name
과rules.http.paths.backend.service.port.name
또는rules.http.paths.backend.service.port.number
값이 정확한지 확인합니다. 오타는 없는지, 포트 이름/번호는 맞는지 확인하세요. 🧐
- 가장 먼저 인그레스 리소스의 YAML 정의를 다시 한번 꼼꼼히 확인합니다.
대상 서비스(Service) 상태 확인:
인그레스가 가리키는 서비스가 실제로 존재하고 올바른 상태인지 확인합니다.
kubectl get service <service-name> -n <namespace> kubectl describe service <service-name> -n <namespace>
서비스의
Selector
가 올바른 파드(Pod)를 타겟하고 있는지 확인합니다.
엔드포인트(Endpoints) 확인:
서비스가 실제로 연결할 수 있는 파드의 IP와 포트 목록(엔드포인트)을 가지고 있는지 확인합니다.
kubectl get endpoints <service-name> -n <namespace>
만약 엔드포인트 목록이 비어있다면(
Endpoints: <none>
), 서비스의Selector
와 파드의Label
이 일치하지 않거나, 파드가 비정상 상태일 수 있습니다. 파드의 상태와 레이블을 확인하세요.
인그레스 컨트롤러 로그 확인:
문제가 발생했을 때, 인그레스 컨트롤러 파드의 로그를 확인하는 것이 매우 중요합니다. 어떤 요청을 처리 중이며, 백엔드 서비스 연결 시 어떤 오류가 발생하는지에 대한 단서를 얻을 수 있습니다.
# Nginx Ingress Controller 예시 (네임스페이스는 다를 수 있음) kubectl logs <ingress-nginx-controller-pod-name> -n ingress-nginx
로그에서
error
,failed
,timeout
,could not connect
,no endpoints available
등의 키워드를 찾아보세요.
네임스페이스(Namespace) 확인:
- 인그레스 리소스와 타겟 서비스가 서로 다른 네임스페이스에 있다면, 인그레스 정의에서 서비스 이름 뒤에
.네임스페이스
를 명시해야 할 수도 있습니다 (컨트롤러 구현에 따라 다름). 또는 서비스 타입을 ExternalName으로 사용하거나 다른 방식을 고려해야 할 수 있습니다. 일반적으로는 인그레스와 서비스는 같은 네임스페이스에 두는 것이 관리가 용이합니다.
- 인그레스 리소스와 타겟 서비스가 서로 다른 네임스페이스에 있다면, 인그레스 정의에서 서비스 이름 뒤에
실수는 언제든 발생할 수 있습니다. 중요한 것은 실수를 빠르게 인지하고, 원인을 파악하여 올바르게 대처하는 능력입니다. 그리고 예방을 위해 버전 관리, 모니터링, 접근 제어 등의 좋은 습관을 들이는 것이겠죠? 💪 이 정보가 여러분의 쿠버네티스 여정에 도움이 되기를 바랍니다!
'100===Dev Ops > Kubernetes' 카테고리의 다른 글
쿠버네티스 인그레스(Ingress) - 클러스터 외부 트래픽 관리의 핵심 😎 (1) | 2025.04.23 |
---|---|
Kubernetes 인그레스 (2) | 2025.04.13 |
쿠버네티스(Kubernetes) Helm - 복잡한 애플리케이션 배포의 구세주! 🚀 (1) | 2025.04.12 |
쿠버네티스 온프레미스 설치부터 활용, 관리까지 (0) | 2025.04.10 |