Azure Kubernetes ServiceでNGINX Ingressによる負荷分散

こんにちは、サイオステクノロジー技術部 武井です。今回はAzure Kubernetes ServiceでNGINX Ingressを使って、L7の負荷分散環境を構築しました

NGINX Ingress

IngressとはKubernetesでL7のロードバランサーを提供するリソースであり、それぞれのクラウドサービス(Azure、Google、Amazonなど)によって実装は異なります。L7なので、URLのロケーションによる分散も出来ますし、SSLの終端もOKです(*´▽`*)NGINX IngressとはAzure Kubernetes Serviceで利用できるL7のロードバランサーです。その名の通り実体はNGINXです。

構成

構成は以下の通りになります。

Screen Shot 2019-12-16 at 19.37.10

Azure Kubernetes Serviceでは、IngressはNodeの中にPodとして作成されます(GoogleのKubernetesマネージドサービスであるGKEはクラスターの外側に作成されるようです)。なので、NGINX Ingressにパケットを到達させるためには、グローバルIPアドレスと、そのパケットをそれぞれのPodの中にあるNGINX Ingressに到達させるためのロードバランサーが必要になります。その役割をAzure Load Blancerが担います。

つまりデータは最初にAzure Load Balancerに到達し、そこでL4の負荷分散により、2つあるNode内のNGINX Ingressのどちらかに到達します。そして、NGINX Ingressにより、SSLの終端やパスによる負荷分散などを行い、ClusterIPあてに届けられます。ClusterIPによる均等な負荷分散により、どちらかのNodeにあるPod内のApplicationにデータが到達します。

ややこしい・・・^^;

構築手順

Azure Kubernetes Serviceによるクラスターは構築済みであると仮定します。構築方法は以下のブログをご参照下さい。

Azure Kubernetes Serviceで最速k8s

 

まずHelmをインストールします。ワタクシMacな環境なのでMac前提にお話します。バージョン3からTillerがいらなくなりました。やった(^o^)

 

Helmの公式レポジトリを追加します。

 

次にNGINX IngressのPodを格納するNamespaceを作成します。

 

HelmでNGINX Ingressを作成します。

–set controller.replicaCount=2は、NGINX IngressのPodを何個作るかを指定します。必ず2個以上として下さい。1個しか作らないと、万が一そのPodが落ちると、サービスがダウンしてしまいます。

Podを見てみます。

my-nginxというnamespaceに・・・controller・・・という名前のPodが2つ出来ていることが確認出来ます。もう一つの・・・default・・・というのは、後述する負荷分散ルールを定義するマニフェストに定義したパスのどれにも該当しないときに振られるPodです。

 

Serviceを見てみます。

nginx-ingress-1576337995-controllerは先程の図のAzure Load Balancerのリソースです。もう一つのnginx-ingress-1576337995-default-backendは、後述する負荷分散ルールを定義するマニフェストに定義したパスのどれにも該当しないときに振られるService(ClusterIP)です。Load BalancerにグローバルIPアドレスが割り当てられているのがわかります。このIPアドレスを外部DNSサービスにAレコードとして登録して下さい。

 

先の図のApplicationに該当するPodを作成します。httpdのイメージからApacheのコンテナを作成します。

 

NodePortとして公開します。(必要なのはClusterIPだけなので、なぜNodePortが必要なのか不明ですが、公式のマニュアルにもそう書いてあります)

 

IngressにSSL終端するための証明書と秘密鍵を格納します。server.crtを証明書、server.keyを秘密鍵とします。

 

以下のマニフェストを作成します。Ingressによる負荷分散ルールを定義するためのものです。ingress.ymlというファイル名で保存します。

 

デプロイします。

 

これで準備完了です。ではcurlでテストしてみましょう。

 

以下のコマンドで2つのPodのログを出すと、交互にログが出力されているのが確認出来ます。

 

まとめ

こんなにも簡単にL7の負荷分散環境が出来てしまいました。すごいですね、Azure Kubernetes Service。もうあなたなしでは生きてゆけない、No Life、No Azure Kubernetes Service。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*