IT/Kubernetes_k8s

Ingress NGINX에서 간헐적인 502 오류 해결하기

동구멍폴로 2024. 8. 2. 16:50
반응형

K8s Ingress NGINX를 사용할 때 간헐적으로 발생하는 502 Bad Gateway 오류는 여러 가지 원인으로 인해 발생할 수 있습니다. 이번 포스트에서는 이 문제를 해결하기 위한 다양한 설정과 방법을 알아봅니다.

1. 백엔드 서비스 점검

가장 먼저, 백엔드 서비스가 정상적으로 작동하는지 확인해야 합니다. 서비스가 다운되거나 오류가 발생하면 502 오류가 발생할 수 있습니다.

  • 서비스 상태 확인: 백엔드 서비스가 정상적으로 작동하는지 확인합니다.
  • 서비스 로그 확인: 백엔드 서비스의 로그를 확인하여 오류나 예외가 발생하고 있는지 체크합니다.

2. Ingress NGINX 설정 조정

Timeout 설정 확인

timeout 설정이 너무 짧게 설정되어 있으면 백엔드 서비스가 응답을 완료하기 전에 timeout이 발생할 수 있습니다. 이를 적절하게 조정합니다.

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
spec:
  ...
 

Buffer 설정 조정

Proxy 버퍼 설정을 조정하여 큰 응답을 처리할 때 발생하는 문제를 해결할 수 있습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffers-number: "8"
    nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
    nginx.ingress.kubernetes.io/proxy-busy-buffers-size: "24k"
spec:
  ...
 

Keep-Alive 설정

클라이언트와 백엔드 간의 연결을 지속시켜 성능을 향상시킬 수 있습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/keep-alive: "on"
    nginx.ingress.kubernetes.io/keep-alive-timeout: "75s"
    nginx.ingress.kubernetes.io/keep-alive-requests: "100"
spec:
  ...

 

Gzip 압축 사용

응답 크기를 줄여 네트워크 대역폭을 절약하고 응답 속도를 향상시킵니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/enable-gzip: "true"
    nginx.ingress.kubernetes.io/gzip-types: "application/json text/plain text/css application/javascript"
spec:
  ...
 
SSL 설정

SSL 설정을 최적화하여 보안과 성능을 동시에 개선합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-protocols: "TLSv1.2 TLSv1.3"
    nginx.ingress.kubernetes.io/ssl-prefer-server-ciphers: "true"
spec:
  ...

 

Load Balancing 설정

로드 밸런싱 방법을 조정하여 트래픽 분배를 최적화합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "round_robin"
spec:
  ...
NGINX Ingress Controller는 least_conn, ip_hash 등의 로드 밸런싱 방법도 지원합니다. 애플리케이션 특성에 맞게 조정할 수 있습니다.

3. 리소스 제한 및 스케일링

백엔드 서비스가 충분한 리소스를 가지고 있는지 확인하고, 리소스 부족으로 인해 응답이 지연되거나 실패할 수 있습니다. 오토스케일링을 설정하여 백엔드 서비스의 부하가 증가할 때 자동으로 확장되도록 합니다.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: example-deployment
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

4. 네트워크 문제 확인

네트워크 정책이나 보안 그룹 설정이 올바르게 구성되어 있는지 확인합니다. 네트워크 트래픽이 차단되거나 제한되어 있는 경우 문제가 발생할 수 있습니다. 또한 DNS 설정이 올바르게 구성되어 있는지 확인합니다.

5. 로그 및 모니터링 설정

Ingress NGINX의 로그를 확인하여 오류 발생 시점과 원인을 파악합니다. Prometheus, Grafana 등의 모니터링 도구를 사용하여 시스템 상태를 지속적으로 모니터링하고, 문제 발생 시 알림을 받도록 설정합니다.

반응형