2016-09-29 11 views
4

목표는 웹 응용 프로그램 (Kubernetes 1.4 클러스터에 배포 됨)이 원래 HTTP 요청을 한 클라이언트의 IP를 확인하는 것입니다. 베어 메탈 클러스터에서 응용 프로그램을 실행할 계획이므로 GCE와 1.4에 도입 된 service.alpha.kubernetes.io/external-traffic: OnlyLocal 서비스 주석은 적용 할 수 없습니다.Ingress로 원격 클라이언트 IP 보존

대안을 찾고 있는데, 목표를 달성하기 위해 Ingress를 설정하라는 메시지가 this question 인 것을 발견했습니다. 그래서 Ingress와 the NginX Ingress Controller을 설정했습니다. 배포가 순조롭게 진행되었으며 Ingress Address와 포트 80을 통해 웹 응용 프로그램에 연결할 수있었습니다. 그러나 로그에서 여전히 클러스터 내부 IP (172.16.0.0/16) 범위를 볼 수 있습니다. 이는 외부 클라이언트 IP가 Ingress를 통해 제대로 전달되지 않습니다. 작동하도록 위의 내용 외에도 구성해야 할 내용을 알려주십시오.

내 침투 '구성 : 레이어 4 프록시

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: myWebApp 
spec: 
    backend: 
    serviceName: myWebApp 
    servicePort: 8080 

답변

3

는 Nginx의 실제 IP 패킷의 원래의 소스 IP 주소를 유지할 수 없다. Proxy protocol을 사용하여이 문제를 해결할 수 있습니다 (링크는 HAProxy 문서를 가리키지 만 Nginx도이를 지원합니다).

그러나이 작업을 수행하려면 업스트림 서버 (귀하의 경우 myWebApp 서비스를 의미 함)도이 프로토콜을 지원해야합니다. 업스트림 응용 프로그램이 Nginx도 사용하는 경우 in the official documentation과 같이 서버 구성에서 프록시 프로토콜 지원을 활성화 할 수 있습니다.

Nginx Ingress Controller's documentation에 따르면,이 기능은는 Kubernetes ConfigMap 형을 사용하여 침투 컨트롤러에서 사용할 수 있습니다 :

apiVersion: v1 
kind: ConfigMap 
metadata: 
    name: nginx-ingress-controller 
data: 
    use-proxy-protocol: "true" 

이 매니페스트 침투 컨트롤러에 ConfigMap 형의 이름을 지정, 명령에 --nginx-configmap=<insert-configmap-name> 플래그를 추가하여 - 라인 인수.