0

私はバックエンドにポート32656(KuPortnetesタイプのNodePortサービス)を実行するKubernetesノードを持っています。トラフィックを許可するために<node_ip>:32656のファイアウォールルールを作成した場合、このアドレスのブラウザでバックエンドを開くことができます:http://<node_ip>:32656HTTPロードバランサをバックエンドにリンクできません(502 Bad Gateway)

ここで達成しようとしているのは、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 Bad Gateway –

+0

ヘルスチェックを診断しますか? https://cloud.google.com/compute/docs/load-balancing/http/backend-service#health_checking – jarmod

答えて

-1

サービスタイプをLoadBalancerhttp://kubernetes.io/docs/user-guide/services/#type-loadbalancer)にすると、これは自動的にすべてセットアップされますか?これは、Googleクラウドにフラグが設定されていることを前提としています。

デプロイ後、サービス名を記述し、割り当てられたエンドポイントを指定する必要があります。

+0

'LoadBalancer'(http://stackoverflow.com/q/37792641/454103参照)を使わないでください。 1.私たちのテストユースケースでは意味がありません(ノードが1つしかありません)。 2.多くのサービスが同じ時間に実行されている場合にはかなりのコストがかかります(それより後に実行される多くのアプリケーションに対して1つのLoad BalancerしかないHTTP Load Balancerと比較して) –

+2

ああ、それはあなたがあなた自身のLBを作る(私はちょうど間違っていると思う)。入力ルーティング(http://kubernetes.io/docs/user-guide/ingress/)を使用するか、自分のロールを使用したいと思うように聞こえます。これはあなたが単一のノード上にいるので大丈夫です。 –

1

実際にインスタンスグループにインスタンスがあり、ファイアウォールルールがソース範囲に固有ではないと仮定します。ログでGoogle Health Checkを確認できますか? (UAにはGoogleが入ります)。

実行中のkubernetesのバージョンは何ですか? Fyiには、1.233のリソースがあります。これは自動的に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

私はK8sの '1.2.4'を使用しています。私は任意のターゲット(タグ)への任意のソース(範囲)からポート '80'を許可するファイアウォールルールを持っています。以前は、ノードが稼働しているインスタンスID、インスタンスIDと同じになるノードID、インスタンスグループIDなどのタグを持つファイアウォールルールも作成しました。常に同じ '502'エラー。 –

+0

ヘルスチェックに関して、別のパス( '/ a_status_200_returning_URL')を使用しましたが、これを'/'に変更して、これがkubernetesの生存/準備のプローブの制限ではないことを確認しました(GCE L7では選択できません) '--request-path'を使ったカスタムパス)。 –

+0

インスタンスに関しては、私はただ1つのインスタンスと1つのグループを使用します。私はより多くのグループで同じインスタンスを使用していません。 –

関連する問題