前回まで、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名>
も省略可能
- FQDNは:
- DNS SRVレコードを利用したサービスディスカバリー
- SRVレコード:
<__Serviceのport名>.<__Protocol>.<Service名>.<Namespace名>.svc.cluster.local
- SRVレコード:
k8sは内部DNSが持っています、内部DNSには内部向けのレコード(*.cluster.local)しか登録されていないため、それ以外のレコードは外部DNSへ再起問い合わせを行います。
最後に
今回はServiceとIngressについて、ざっくり説明しました。
次回から、深堀してServiceのリソースそれぞれ説明していきたいと思います。
ここまで読んでいただいて、お疲れ様でした。
コメント