100===Dev Ops/Kubernetes

쿠버네티스 인그레스 운영 중 흔한 실수와 해결 방법 🚨

블로글러 2025. 4. 23. 13:32

쿠버네티스 인그레스를 사용하다 보면 예상치 못한 문제에 부딪힐 수 있습니다. 가장 흔한 두 가지 시나리오를 살펴보죠!

시나리오 1: "앗! 실수로 인그레스 리소스를 삭제했어요!" 😱

💥 문제 상황 (Impact):

kubectl delete ingress my-ingress 같은 명령어로 중요한 인그레스 리소스를 실수로 삭제하면 어떻게 될까요?

  1. 외부 접속 불가: 인그레스 리소스는 라우팅 규칙 그 자체입니다. 이게 사라지면 인그레스 컨트롤러는 더 이상 해당 규칙(예: app.mycompany.com으로 오는 요청을 my-app-service로 보내라)을 알지 못하게 됩니다. 결과적으로, 이전에 이 인그레스를 통해 접속되던 외부 트래픽은 더 이상 목적지 서비스로 라우팅되지 않습니다. 사용자는 주로 404 Not Found (컨트롤러 기본 백엔드가 설정되지 않은 경우) 또는 컨트롤러 기본 응답을 받게 됩니다.
  2. 서비스 자체는 정상: 중요한 점은 인그레스 리소스 삭제가 내부 서비스(Deployment, Pod, Service 등) 자체를 삭제하는 것은 아니라는 것입니다. 서비스는 클러스터 내부에서는 여전히 정상적으로 실행 중일 수 있습니다. 단지 외부로 통하는 문(인그레스 규칙)이 사라진 것뿐이죠.

(주의!) 만약 인그레스 리소스_가 아니라, 인그레스 _컨트롤러 자체의 파드나 디플로이먼트, 또는 컨트롤러가 노출된 서비스(타입: LoadBalancer 등)를 삭제했다면, 해당 컨트롤러가 처리하던 모든 외부 트래픽이 중단됩니다. 이건 훨씬 더 심각한 상황이죠! 😨

🛠️ 해결 방법 (Solution):

  1. 즉시 복구 (YAML 재적용):
    • 가장 빠르고 확실한 방법은 삭제된 인그레스 리소스의 정의가 담긴 YAML 파일을 다시 적용(kubectl apply -f my-ingress.yaml)하는 것입니다.
    • 핵심: 이를 위해서는 평소에 모든 쿠버네티스 리소스 정의(YAML 파일)를 Git과 같은 버전 관리 시스템으로 철저히 관리하는 습관이 매우 중요합니다! ✨ 코드처럼 인프라 설정도 형상 관리를 해야 실수를 되돌리기 쉽습니다.
  2. 백업 및 복구 도구 활용:
    • Velero와 같은 쿠버네티스 백업 솔루션을 사용하여 클러스터 리소스 상태를 정기적으로 백업하고, 필요시 특정 시점으로 복원할 수 있습니다.
  3. 접근 제어 강화 (RBAC):
    • 쿠버네티스의 RBAC(Role-Based Access Control) 설정을 통해 특정 사용자나 그룹이 중요한 리소스(특히 운영 환경의 인그레스)를 함부로 삭제하지 못하도록 권한을 제한해야 합니다. 🔒 최소 권한의 원칙을 적용하세요.
  4. 모니터링 및 알림:
    • 인그레스 리소스의 상태 변화(생성, 수정, 삭제)를 감지하고 알림을 보내는 모니터링 시스템(예: 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
  1. 서비스 연결 실패 (5xx 에러): 인그레스 컨트롤러는 외부 요청을 받아서 규칙에 따라 my-app-service-typo라는 이름의 서비스를 찾으려고 시도합니다.
    • 만약 my-app-service-typo라는 서비스가 아예 존재하지 않으면, 컨트롤러는 요청을 전달할 대상을 찾지 못해 503 Service Temporarily Unavailable 오류를 반환할 가능성이 높습니다.
    • 만약 서비스 이름은 맞지만 포트 번호(80)가 잘못되었다면 (실제 서비스는 8080 포트를 사용), 컨트롤러는 올바른 서비스까지는 찾아갔지만, 해당 서비스가 리스닝하지 않는 포트로 연결을 시도하게 됩니다. 이 경우에도 연결이 실패하여 502 Bad Gateway 또는 503 Service Unavailable 오류가 발생할 수 있습니다.
  2. 엉뚱한 서비스로 연결: 만약 실수로 입력한 서비스 이름/포트가 _존재하는 다른 서비스_의 것이라면, 트래픽이 원래 의도했던 서비스가 아닌 엉뚱한 서비스로 흘러 들어가는 심각한 문제가 발생할 수 있습니다. 🤯

🛠️ 해결 방법 (Solution):

  1. 인그레스 설정 확인 (YAML 검토):

    • 가장 먼저 인그레스 리소스의 YAML 정의를 다시 한번 꼼꼼히 확인합니다. rules.http.paths.backend.service.namerules.http.paths.backend.service.port.name 또는 rules.http.paths.backend.service.port.number 값이 정확한지 확인합니다. 오타는 없는지, 포트 이름/번호는 맞는지 확인하세요. 🧐
  2. 대상 서비스(Service) 상태 확인:

    • 인그레스가 가리키는 서비스가 실제로 존재하고 올바른 상태인지 확인합니다.

      kubectl get service <service-name> -n <namespace>
      kubectl describe service <service-name> -n <namespace>
    • 서비스의 Selector가 올바른 파드(Pod)를 타겟하고 있는지 확인합니다.

  3. 엔드포인트(Endpoints) 확인:

    • 서비스가 실제로 연결할 수 있는 파드의 IP와 포트 목록(엔드포인트)을 가지고 있는지 확인합니다.

      kubectl get endpoints <service-name> -n <namespace>
    • 만약 엔드포인트 목록이 비어있다면(Endpoints: <none>), 서비스의 Selector와 파드의 Label이 일치하지 않거나, 파드가 비정상 상태일 수 있습니다. 파드의 상태와 레이블을 확인하세요.

  4. 인그레스 컨트롤러 로그 확인:

    • 문제가 발생했을 때, 인그레스 컨트롤러 파드의 로그를 확인하는 것이 매우 중요합니다. 어떤 요청을 처리 중이며, 백엔드 서비스 연결 시 어떤 오류가 발생하는지에 대한 단서를 얻을 수 있습니다.

      # Nginx Ingress Controller 예시 (네임스페이스는 다를 수 있음)
      kubectl logs <ingress-nginx-controller-pod-name> -n ingress-nginx
    • 로그에서 error, failed, timeout, could not connect, no endpoints available 등의 키워드를 찾아보세요.

  5. 네임스페이스(Namespace) 확인:

    • 인그레스 리소스와 타겟 서비스가 서로 다른 네임스페이스에 있다면, 인그레스 정의에서 서비스 이름 뒤에 .네임스페이스를 명시해야 할 수도 있습니다 (컨트롤러 구현에 따라 다름). 또는 서비스 타입을 ExternalName으로 사용하거나 다른 방식을 고려해야 할 수 있습니다. 일반적으로는 인그레스와 서비스는 같은 네임스페이스에 두는 것이 관리가 용이합니다.

실수는 언제든 발생할 수 있습니다. 중요한 것은 실수를 빠르게 인지하고, 원인을 파악하여 올바르게 대처하는 능력입니다. 그리고 예방을 위해 버전 관리, 모니터링, 접근 제어 등의 좋은 습관을 들이는 것이겠죠? 💪 이 정보가 여러분의 쿠버네티스 여정에 도움이 되기를 바랍니다!

728x90