Ingress はルールのセットで、Kubernetes クラスターのサービスに対する外部からのアクセスを承認します。レイヤー 7 Server Load Balancer 機能が提供されます。 外部アクセス可能な URL、SLB、SSL および名前ベースの仮想ホストを提供する Ingress を設定できます。 Ingress には高い信頼性が必要です。これは、Ingress がクラスターへ向かう外部トラフィックのアクセスレイヤーとして機能するためです。 このトピックでは、高パフォーマンスと高い信頼性を持った Ingress アクセスレイヤーのデプロイ方法を解説します。
前提条件
- Kubernetes クラスターが作成されている必要があります。 詳しくは、Kubernetes クラスターの作成 をご参照ください。
- SSH によりマスターノードへ接続されている必要があります。 詳しくは、SSH を使用した Kubernetes クラスターへのアクセス をご参照ください。
高い信頼性を持つデプロイアーキテクチャ
上図で表した通り、複数の排他的 Ingress インスタンスは、クラスターへのインバウンドトラフィックを処理するアクセスレイヤーを構成します。 さらに、Ingress ノード数は、バックエンドサービスにより必要とされるトラフィック量に応じてスケーリングすることができます。 お使いのクラスターが適度なサイズである場合、Ingress サービスや他のサービスアプリケーションをハイブリッドな方法でデプロイすることもできます。 しかしながら、リソース数を制限し、リソースを Ingress および対応するアプリケーションから分離することを推奨します。
デフォルトでデプロイされたクラスターポッドレプリカおよびインターネット SLB アドレスの表示
クラスター作成後、2 つのレプリカを持つ Nginx Ingress コントローラーサービスのセットがデフォルトでクラスター内にデプロイされます。 このサービスセットのフロントエンドはインターネット SLB インスタンスにマウントされます。
$ 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
$ 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 アクセスレイヤーをスケーリングできます。
$ kubectl -n kube-system scale --replicas=3 deployment/nginx-ingress-controller
deployment.extensions/nginx-ingress-controller scaled
$ 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 コントローラーを高度な構成のみで設定された対象のノード上で実行する場合、対象となるノードのラベル付けができます。
- 以下のコマンドを実行し、クラスターノードを表示します。
$ 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
- 以下のコマンドを実行し、ラベル
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
- 以下のコマンドを実行し、お使いのデプロイを更新し、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
結果
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>