質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Google Container Engine (GKE)

Google Container Engine (GKE) は、Dockerコンテナのオープンソース管理ソフトウェア、Kubernetesのクラスタを簡単にデプロイ可能にするサービスです。

Q&A

解決済

1回答

4381閲覧

kubernetesでnginxを使ってbasic認証付きのリバースプロキシを作りたい

cmmmli

総合スコア13

Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Google Container Engine (GKE)

Google Container Engine (GKE) は、Dockerコンテナのオープンソース管理ソフトウェア、Kubernetesのクラスタを簡単にデプロイ可能にするサービスです。

0グッド

1クリップ

投稿2017/11/07 07:29

###前提・実現したいこと

  • GKEを用いてelasticsearchクラスタを構築したい。

それに付随して様々な問題が出てきたため、それを解決する。

  • GKEでelasticsearchとnginxを動かして、nginxをingressとして公開し、その内部で /search等でリバースプロキシとしてelasticsearchのserviceに飛ばしたい。

###発生している問題・エラーメッセージ
elasticsearchはx-packのsecurity機能を使うことでbasic認証を付けることが出来るが、kubernetesのingressを通して接続しようとするとbasic認証によってヘルスチェックが通らず、502が帰ってきてしまう。
そこで下記の方法を考えました。
nginxを同じNodeで動かし、 */search等のパスでbasic認証付きのリバースプロキシとして動かしてelasticsearchと接続する。
この際にヘルスチェックは */のみにすることでとりあえず動くのではないかと考えました。

  • /でヘルスチェック用のレスポンス200を返す。
  • /searchでelasticsearchのkubernetes serviceに飛ばす。

上記を実現するため、とりあえずリバースプロキシだけ試したいのでnginxの*.confファイルに

location /search { proxy_pass: ${同クラスタで動いているelasticsearch serviceのIP} }

と記入すれば良さそうだと考えたのですが、同じクラスタといっても複数Nodeである可能性等を考えると何のIPを指定すればいいかわからず、調べてもよくわからずで止まってしまいました。

###試したこと
elasticsearchのサービスを type: LoadBalancerとして、
静的IPを指定する方法を使って、そのIPを*.confに記載すれば出来るかもしれないとも考えたのですが、運用も考えるとあまり良くないのかなと思ってしまいました。
インフラに関して勉強して一ヶ月経ってないほどで最適解などもわからずやっています。
今考えている方法よりももっといい方法があればそれも教えて頂けると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

elasticsearchのserviceを metadata.annotations: cloud.google.com/load-balancer-type: "Internal", type: LoadBalancer として内部のみに公開し、

apiVersion: v1 kind: ConfigMap metadata: name: site-conf namespace: elasticsearch data: site.conf: | server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location /search/ { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/conf.d/.htpasswd; proxy_pass http://${elasticsearch_LoadBalancer_IP}:9200/; } } .htpasswd: | ${user}:${password}

このconfigmapを以下のようにnginxのdeploymentにつけてやると出来ました。

template: metadata: labels: name: nginx-deploy spec: containers: - image: launcher.gcr.io/google/nginx1 name: nginx volumeMounts: - name: site-conf mountPath: /etc/nginx/conf.d volumes: - name: site-conf configMap: name: site-conf

passwordをconf.dディレクトリ内に保存してます。あまり良くないかもしれません。
passwordの生成はhtpasswdを使って出来たファイルの中身を書けばOKです。

投稿2017/11/11 07:21

cmmmli

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問