k8sのIngressがよくわからなかったけど、k8s完全ガイドとかL4/L7ロードバランサの事を学んで、しっくり理解できた気がした
最近お仕事でk8sを触る機会が多いのだけど、k8sは色んな技術や用語がたくさんあって大変。正直、ふんわりとしかわかっていない技術も多い。 その中の一つにIngressがあるのだけど、これがserviceリソースとどう違うのか???イマイチよくわかってなかったので勉強し直した。
まずserviceリソースについてk8s完全ガイド第6章を読み直す
serviceリソースは「podに繋ぐため通信(IPやらDNSやら)や、各PodへのトラフィックをさばくLB的な存在」という認識だった。
公式ドキュメントにも、
In Kubernetes, a Service is an abstraction which defines a logical set of Pods and a policy by which to access them
とあって、それっぽいことが書かれている。 serviceリソースによって、selectorが特定のラベルがついたpodを探し、設定したポートにアクセスが来たら、探したポッドの特定のポートに通信を受け渡すような仕組みになっている。pod同士の通信だけであれば、クラスタを作成したときにk8sがNodeにpod用の内部ネットワークを作成してくれるので、serviceリソースはいらないらしいのだけど、
といった機能を実現するにはserviceリソースが必要になる。cluster ipという自動で振られる(静的設定もできる)仮想ipができて、そのipを使って各podへ通信するという感じ。
podへのアクセス方法もいくつか種類があり、service type
と呼ばれ、cluster ip(external ip)
、NodePort
、LB
、headless
、ExternalNode
など、それぞれpodへのアクセス方法が異なり、一長一短がある。ここまでKubenetes完全ガイドを読み直して復習した。
で、ここまででserviceリソースについて勉強したけど、(いままで勉強する順番が良くなかったのかかもしれないが)IngressもLB的な役割をするということが書いてあって、あんまり違いがよくわかっていなかった。
serviceリソースとIngressの違いはL4/L7ロードバランサーを知ると良さそう
ググったりすると「http, httpsからの外部通信を制御できたりする!」とかあるけど、いまいちピンとこない。まあ、言葉通りなんだろうけど。k8s完全ガイドをよく読み直してみると、
ここまで説明してきたserviceがL4ロードバランシングを提供するリソースであるのに対し、IngressはL7ロードバランシングを提供するリソースです。
とあった。
ごめん。L4/L7ロードバランサの違いがよくわかってない。。。コイツらを調べればserviceリソースとingressを明確にそれぞれ理解できそうだったので、それらを調べた。で、色々調べて、以下のslideshareがわかりやすくて参考になった。拝借させていただく :pray:
www.slideshare.net
なるほど。
- podへの通信振り分けをip + tcpipポートで行うL4ロードバランシングが、serviceリソース
- L4ロードバランシングが振り分けに使う情報に加えて、L7が使う情報(pathやhostなど)も使って通信振り分けをするL7ロードバランシングが、ingress
ということかな。確かにingressリソースはpaths:
とかでパスによるルーティング定義ができる。
k8s完全ガイドのまとめにも
とあった。L4/L7ロードバランシングの知識が肝だった*1。
参考にさせてもらったURL
余談だけど、先輩が以前「k8sを勉強するときは、既存のウェブシステムとかと見比べて、それぞれがk8sのどのアーキテクチャに類する技術なのかを考えながら勉強するといい」的なアドバイスをくれて、なるほどなーとなった。 今回はこの既存のウェブシステムにあたるL4/L7ロードバランサーの知識がそもそも無くて、いまいち自分の中でしっくり来てないのが原因だったのが大きい気がしてる。自分のように所謂インフラに近い知識が薄い人は、k8sを学ぶと同時に、k8sを使っていないよくあるインフラの技術や知識も学ぶのがいい気がすると、今回の調査をして思った。