Ingressの図解
Podをクラスター内外に公開するL7ロードバランサー。
クラスター外部からURLのサブドメイン(ホスト)やパスによるServiceへの振り分けが出来ます。
つまり、LBService:NodePort = 1:1なのに対してIngress:NodePort=1:manyになります。
図で示した通り、一つのIngressに一つのロードバランサーが作成され、それがServiceを束ねて、レイヤー7のPathやホスト(サブドメイン)などで通信の向き先を指定することで、柔軟なロードバランシングが可能になります。
minikube上でIngressを試す場合以下のセッティング
$ minikube addons list // minikubeのaddonリストを確認
$ minikube addons enable ingress // ingressをenableする
$ kubectl get pods -n kube-system // ingress controllerをチェック
Ingressの構成Yamlファイル
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: video-chat-app
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /hello
backend:
serviceName: helloworld-nodeport
servicePort: 8080
- path: /hello2
backend:
serviceName: helloworld-nodeport2
servicePort: 8080
Ingressは上記yamlのようにpathsのpathでhttpPathを指定し、その向き先のserviceNameとservicePortを指定することで、上記の例ではPathで、またはホストによるルーティングの分岐が可能です。
例えばのユースケースとしては、ECサイトがあったとして、ドメインは管理画面もショップ画面も同じにしたい場合など、pathやサブドメインによって通信の飛ぶService及びその先のコンテナを振り分けたりといった用途に使えたりします。
まとめ
このようにIngressを使うことで、一つのロードバランサーで複数のserviceリソースを束ねる事ができます。
AWSなどのロードバランサーは起動数が多いとなかなかなのお値段になるので、不必要に複数起動したくありません。
そのような理想を叶えてくれる夢のリソースがIngressです。
規模が大きいサービスになると「istio service mesh」とかの有償版のものなども存在して、これを使うとPod同士の通信までHTTPS化できるなどかなりセキュアな運用をハンドシェイクなどの負荷も少なく実現させることができます。
中規模程度のサービスであれば、Ingressを使いこなせれば良いと思います。