0

나는 포트 32656 (NodePort 유형의 Kubernetes 서비스)에서 실행중인 Kubernetes 노드를 백엔드에 가지고 있습니다. 트래픽을 허용하는 <node_ip>:32656에 대한 방화벽 규칙을 만들면이 주소의 브라우저에서 백엔드를 열 수 있습니다 : http://<node_ip>:32656.HTTP로드 밸런서를 백엔드에 연결할 수 없음 (502 잘못된 게이트웨이)

내가 지금 달성하고자하는 것은 HTTP로드 밸런서를 생성하고 위의 백엔드에 연결하는 것입니다. 내가 필요한 인프라 만들려면 다음 스크립트를 사용 :

#!/bin/bash 

GROUP_NAME="gke-service-cluster-61155cae-group" 
HEALTH_CHECK_NAME="test-health-check" 
BACKEND_SERVICE_NAME="test-backend-service" 
URL_MAP_NAME="test-url-map" 
TARGET_PROXY_NAME="test-target-proxy" 
GLOBAL_FORWARDING_RULE_NAME="test-global-rule" 
NODE_PORT="32656" 
PORT_NAME="http" 

# instance group named ports 
gcloud compute instance-groups set-named-ports "$GROUP_NAME" --named-ports "$PORT_NAME:$NODE_PORT" 

# health check 
gcloud compute http-health-checks create --format none "$HEALTH_CHECK_NAME" --check-interval "5m" --healthy-threshold "1" --timeout "5m" --unhealthy-threshold "10" 

# backend service 
gcloud compute backend-services create "$BACKEND_SERVICE_NAME" --http-health-check "$HEALTH_CHECK_NAME" --port-name "$PORT_NAME" --timeout "30" 
gcloud compute backend-services add-backend "$BACKEND_SERVICE_NAME" --instance-group "$GROUP_NAME" --balancing-mode "UTILIZATION" --capacity-scaler "1" --max-utilization "1" 

# URL map 
gcloud compute url-maps create "$URL_MAP_NAME" --default-service "$BACKEND_SERVICE_NAME"    

# target proxy 
gcloud compute target-http-proxies create "$TARGET_PROXY_NAME" --url-map "$URL_MAP_NAME" 

# global forwarding rule 
gcloud compute forwarding-rules create "$GLOBAL_FORWARDING_RULE_NAME" --global --ip-protocol "TCP" --ports "80" --target-http-proxy "$TARGET_PROXY_NAME" 

을하지만 난 프런트 엔드 구성에서 공용 IP를 통해 액세스로드 밸런서에서 다음과 같은 응답 얻을 : 건강 체크가 남아

Error: Server Error

The server encountered a temporary error and could not complete your request. Please try again in 30 seconds.

을 기본값은 (/80)이며 백엔드 서비스는 상태가 200입니다.

모든 소스 및 모든 포트 (tcp)를 수용하고 대상 지정이없는 (즉, 모든 대상) 방화벽 규칙을 만들었습니다.

내가 선택한 (인스턴스 그룹에서) 포트와 관계없이 동일한 결과 (Server Error)를 얻게되면 문제는 HTTP로드 균형 조정기의 구성에 있어야합니다. (아마도 건강 검사가있는 것입니까?)

프론트 엔드와 백엔드 사이의 링크를 완성하지 못한 것은 무엇입니까?

+0

실제 HTTP 응답 코드는 무엇입니까? 5xx? – jarmod

+0

502 불량 게이트웨이 –

+0

건강 진단을 진단 하시겠습니까? https://cloud.google.com/compute/docs/load-balancing/http/backend-service#health_checking – jarmod

답변

-1

서비스 유형을 LoadBalancer (http://kubernetes.io/docs/user-guide/services/#type-loadbalancer)으로 설정하면 자동으로 설정됩니다. 이것은 Google 클라우드 용으로 설정된 플래그가 있다고 가정합니다.

배포 한 후 서비스 이름을 설명하고 할당 된 끝점을 제공해야합니다.

+0

'LoadBalancer '를 사용하지 않으려합니다 (http://stackoverflow.com/q/37792641/454103 참조). 1. 우리의 테스트 유스 케이스에는 의미가 없습니다 (노드가 하나뿐입니다). 2. 많은 서비스가 동시에 실행될 때 훨씬 더 많은 비용이 소요됩니다 (HTTP Load Balancer와 비교하여 더 많은 응용 프로그램을 실행하는 Load Balancer가 하나만있는 경우와 비교). –

+2

오케이, 그건 당신이 너 자신의 LB를 만들라. (내가 잘못 읽은 것 같아.) ingress 라우팅 (http://kubernetes.io/docs/user-guide/ingress/)을 사용하거나 단일 노드에만 있기 때문에 자신 만의 롤을 사용하려는 것 같습니다. –

1

실제로 인스턴스 그룹에 인스턴스가 있다고 가정하고 방화벽 규칙이 원본 범위와 관련이 없다고 가정합니다. 로그에서 Google 건강 진단을 확인할 수 있습니까? (UA는 그것에 구글을 가질 것이다).

실행중인 kubernetes의 버전은 무엇입니까? Fyi에는 자동으로 이걸 연결 해주는 1.2의 리소스가 있습니다 : http://kubernetes.io/docs/user-guide/ingress/, 그냥 다음을 수행하십시오 : https://github.com/kubernetes/contrib/blob/master/ingress/controllers/gce/BETA_LIMITATIONS.md.

더 구체적으로 말하면 : 1.2에서는 방화벽 규칙, type = nodeport 서비스 (둘 다 이미있는 것 같습니다) 및 해당 서비스의 상태 점검을 "/"에 작성해야합니다. 이 요구 사항은 1.3에서 완화되었지만 1.3은 아직 해결되지 않았습니다).

동일한 인스턴스를 2 개의로드 밸런싱 된 IG에 넣을 수 없으므로 위에서 언급 한 Ingress를 사용하려면 기존로드 밸런서를 정리해야합니다 (또는 최소한 IG에서 인스턴스를 제거하고 자유롭게 만듭니다 Ingress 컨트롤러가 할 수있는 충분한 할당량).

+0

K8의'1.2.4'를 사용하고 있습니다. 모든 대상 (태그)에 대한 모든 소스 (범위)의 포트 80을 허용하는 방화벽 규칙이 있습니다. 이전에는 노드가 실행중인 인스턴스 ID, 노드 ID (이제는 인스턴스 ID와 같음), 인스턴스 그룹 ID와 같은 태그로 방화벽 규칙을 만들었습니다. 항상 같은 '502' 오류. –

+0

건강 검진에 관해서는 다른 경로 ('/ a_status_200_returning_URL')를 사용했으나 이것을'/'로 변경하여 이것이 kubernetes liveness/readiness 프로브의 제한 사항이 아니라는 것을 확인했습니다 (GCE L7에서는 선택할 수 없음). '--request-path'를 사용하는 커스텀 경로). –

+0

인스턴스에 대해서는 하나의 인스턴스와 하나의 그룹 만 사용합니다. 더 많은 그룹에서 동일한 인스턴스를 사용하지 않습니다. –

관련 문제