Ingress はルールのセットで、Kubernetes クラスターのサービスに対する外部からのアクセスを承認します。レイヤー 7 Server Load Balancer 機能が提供されます。 外部アクセス可能な URL、SLB、SSL および名前ベースの仮想ホストを提供する Ingress を設定できます。 Ingress には高い信頼性が必要です。これは、Ingress がクラスターへ向かう外部トラフィックのアクセスレイヤーとして機能するためです。 このトピックでは、高パフォーマンスと高い信頼性を持った Ingress アクセスレイヤーのデプロイ方法を解説します。

前提条件

高い信頼性を持つデプロイアーキテクチャ

高い信頼性を実現するため、まず SPOF を解決する必要があります。 この課題の一般的な解決方法は、複数のレプリカをデプロイすることです。 特に、マルチノードデプロイアーキテクチャを使用し、Kubernetes クラスターで高い信頼性を持った Ingress アクセスレイヤーをデプロイできます。 排他的な Ingress ノードを設定し、サービスアプリケーションが Ingress サービスとリソースを取り合うことを避けるために排他的な Ingress ノードを設定することを推奨します。これは、Ingress がクラスターのトラフィックアクセスポートとして機能するためです。


上図で表した通り、複数の排他的 Ingress インスタンスは、クラスターへのインバウンドトラフィックを処理するアクセスレイヤーを構成します。 さらに、Ingress ノード数は、バックエンドサービスにより必要とされるトラフィック量に応じてスケーリングすることができます。 お使いのクラスターが適度なサイズである場合、Ingress サービスや他のサービスアプリケーションをハイブリッドな方法でデプロイすることもできます。 しかしながら、リソース数を制限し、リソースを Ingress および対応するアプリケーションから分離することを推奨します。

デフォルトでデプロイされたクラスターポッドレプリカおよびインターネット SLB アドレスの表示

クラスター作成後、2 つのレプリカを持つ Nginx Ingress コントローラーサービスのセットがデフォルトでクラスター内にデプロイされます。 このサービスセットのフロントエンドはインターネット SLB インスタンスにマウントされます。

以下のコマンドを実行し、Nginx Ingress コントローラーサービスがデプロイされたポッドを表示します。
$ kubectl -n kube-system get pod | grep nginx-ingress-controller
nginx-ingress-controller-8648ddc696-2bshk                    1/1     Running   0          3h
nginx-ingress-controller-8648ddc696-jvbs9                    1/1     Running   0          3h
以下のコマンドを実行し、"nginx-ingress-lb" サービスに対応するインターネット SLB アドレスを表示します。
$ kubectl -n kube-system get svc nginx-ingress-lb
NAME               TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
nginx-ingress-lb   LoadBalancer   172.xx.x.xx   118.xxx.xxx.xx   80:32457/TCP,443:31370/TCP   21d

増加するクラスター向けのクラスターアクセスレイヤーの高いパフォーマンスと高可用性を保証するため、Ingress アクセスレイヤーを拡張する必要があります。 以下の 2 つの方法のどちらかを利用することができます。

方法 1: レプリカ数の拡張

Nginx Ingress コントローラーデプロイのレプリカ数を変更することで、素早く Ingress アクセスレイヤーをスケーリングできます。

以下のコマンドを実行し、ポッドレプリカ数を 3つ までスケールアウトします。
$ kubectl -n kube-system scale --replicas=3 deployment/nginx-ingress-controller
deployment.extensions/nginx-ingress-controller scaled
以下のコマンドを実行し、Nginx Ingress コントローラーサービスがデプロイされたポッドを表示します。
$ kubectl -n kube-system get pod | grep nginx-ingress-controller
nginx-ingress-controller-8648ddc696-2bshk                    1/1     Running   0          3h
nginx-ingress-controller-8648ddc696-jvbs9                    1/1     Running   0          3h
nginx-ingress-controller-8648ddc696-xqmfn                    1/1     Running   0          33s

方法 2: 指定したノード上への Ingress サービスのデプロイ

Nginx Ingress コントローラーを高度な構成のみで設定された対象のノード上で実行する場合、対象となるノードのラベル付けができます。

  1. 以下のコマンドを実行し、クラスターノードを表示します。
    $ kubectl get node
    NAME                                 STATUS   ROLES    AGE   VERSION
    cn-hangzhou.i-bp11bcmsna8d4bpf17bc   Ready    master   21d   v1.11.5
    cn-hangzhou.i-bp12h6biv9bg24lmdc2o   Ready    <none>   21d   v1.11.5
    cn-hangzhou.i-bp12h6biv9bg24lmdc2p   Ready    <none>   21d   v1.11.5
    cn-hangzhou.i-bp12h6biv9bg24lmdc2q   Ready    <none>   21d   v1.11.5
    cn-hangzhou.i-bp181pofzyyksie2ow03   Ready    master   21d   v1.11.5
    cn-hangzhou.i-bp1cbsg6rf3580z6uyo7   Ready    master   21d   v1.11.5
  2. 以下のコマンドを実行し、ラベル node-role.kubernetes.io/ingress="true" を Ingress ノード cn-hangzhou.i-bp12h6biv9bg24lmdc2o および cn-hangzhou.i-bp12h6biv9bg24lmdc2p に追加します。
    • 複数のポッドが 1 つのノードで実行されないように、ラベル付けされたノード数はクラスターポッドのレプリカ数以上である必要があります。
    • Ingress サービスをデプロイするワーカーノードにのみラベル付けすることを推奨します。
    $ kubectl label nodes cn-hangzhou.i-bp12h6biv9bg24lmdc2o node-role.kubernetes.io/ingress="true"
    node/cn-hangzhou.i-bp12h6biv9bg24lmdc2o labeled
    $ kubectl label nodes cn-hangzhou.i-bp12h6biv9bg24lmdc2p node-role.kubernetes.io/ingress="true"
    node/cn-hangzhou.i-bp12h6biv9bg24lmdc2p labeled
  3. 以下のコマンドを実行し、お使いのデプロイを更新し、nodeSelector 設定を追加します。
    $ kubectl -n kube-system patch deployment nginx-ingress-controller -p '{"spec": {"template": {"spec": {"nodeSelector": {"node-role.kubernetes.io/ingress": "true"}}}}}'
    deployment.extensions/nginx-ingress-controller patched

結果

以下のコマンドを実行し、Ingress ポッドが、node-role.kubernetes.io/ingress="true" とラベル付けされたクラスターノードにデプロイされたことを確認します。
$ kubectl -n kube-system get pod -o wide | grep nginx-ingress-controller
nginx-ingress-controller-8648ddc696-2bshk                    1/1     Running   0          3h    172.16.2.15     cn-hangzhou.i-bp12h6biv9bg24lmdc2p   <none>
nginx-ingress-controller-8648ddc696-jvbs9                    1/1     Running   0          3h    172.16.2.145    cn-hangzhou.i-bp12h6biv9bg24lmdc2o   <none>