広告

kubernetes – ServiceとIngress

infrastructure as code

前回まで、k8sで仕事をしてくれるリソースについて説明しました。
システムとしては、Workloads間のやり取りや外部とのやり取りも必要になりますので、ネットワークの設定も必要になります。
今回から、k8sのネットワークについて、触れていきたいと思います。

Discovery & LBリソースの概要

Discoveryはpodの発見、LBはロードバランシング(負荷分散)。
この種類のリソースは主に、k8sのネットワークに関係するリソースになります。

以前ご紹介した通、以下のものがあります。
ServiceはL4のロードバランシングで、IngressはL7のロードバランシングのため、大分類で分けています。

  • Service
    • ClusterIP:k8s内部ロードバランサー
    • ExternalIP(ClusterIPに属する):指定のNodeのIPを使って、外部と通信可能なClusterIP
    • NodePort:任意NodeのIPを使って、外部からk8s内部への通信を可能にするリソース
    • LoadBalancer:外部ロードバランサー + NodePort + ClusterIP
    • Headless(None)(ClusterIPに属する):主にStatefulSetのためのClusterIP
    • ExternalName:k8sのCNAME変換用リソース
    • None-Selector(ClusterIPに属する):Endpointsをカスタマイズ可能なClusterIP
  • Ingress

ServiceとIngressの違い

ServiceとIngressはレイヤーの違うロードバランシングリソースです。

  • Service
    • L4ロードバランシング
    • クラスタ内にDNSによる名前解決
    • 基本はラベルを利用したPodのサービスディスカバリー
  • Ingress
    • L7ロードバランシング
    • HTTPS終端(SSL証明書を保持可能) ← 経験上ではよくこの原因でIngressを使う
    • パスベースルーティング(pathでルーティング可能)

※L4(レイヤー4)とL7ロードバランシングについて:レイヤーはネットワーク通信レイヤーのことで、OSI参照モデルの知識となります。
簡単に説明をすると、レイヤ4(ネットワーク層)のロードバランサーは単純に負荷分散の役割を持つロードバランサーで、レイヤー7(アプリケーション層)のロードバランサーは負荷分散以外に、WAF(WebApplicationFirewall)機能や、SSL証明書を保持する機能も有しているロードバランサーのことです。

k8sのネットワーク

k8sクラスタが構築されると、ノードごとにPodのための内部ネットワークを自動的に構成します。
内部ネットワークでは、

  • Podごとに内部IPアドレスを持っている。ただIPは動的に割り振られる。
  • 基本では、ノードごとに自動的に異なるネットワークセグメントを構築される
    • CNI(Container Network Interface)というpluggableなモジュールの実装による
  • ノード間の通信はVXLANやL2ルータなどの技術で転送される

Serviceの特徴

Serviceを利用する大きなメリット主に2つあります:

  • Pod宛トラフィックのロードバランシング
  • サービスディスカバリーとクラスタ内のDNS(名前解決)

Serviceでは、spec.selectorで定義するSelectorの条件に従って、トラフィックを転送します。
要するに、spec.selector属性に書いている条件にあったPodだけに、トラフィックを転送します。

Serviceの特徴:

  • 一つのServiceリソースは複数のportを持つことができる
  • Serviceリソースは、クラスタ内では名前解決ができる
    • 環境変数を利用したサービスディスカバリー
    • DNSのAレコードを利用したサービスディスカバリー
      • FQDNは:<Service名>.<Namespace名>.svc.cluster.local
      • .svc.cluster.localは省略可能
      • 同じNamespaceの場合、.<Namespace名>も省略可能
    • DNS SRVレコードを利用したサービスディスカバリー
      • SRVレコード:<__Serviceのport名>.<__Protocol>.<Service名>.<Namespace名>.svc.cluster.local

k8sは内部DNSが持っています、内部DNSには内部向けのレコード(*.cluster.local)しか登録されていないため、それ以外のレコードは外部DNSへ再起問い合わせを行います。

最後に

今回はServiceとIngressについて、ざっくり説明しました。
次回から、深堀してServiceのリソースそれぞれ説明していきたいと思います。

ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました