Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes(EKS)ネットワーク入門

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for nutslove nutslove
February 19, 2026
390

 Kubernetes(EKS)ネットワーク入門

Kubernetes(EKS)のネットワークについて、社内勉強会で使用した資料です。
お役に立てれば嬉しいです。

Avatar for nutslove

nutslove

February 19, 2026
Tweet

Transcript

  1. apiVersion: v1 kind: Service metadata: name: nginx spec: type: ClusterIP

    ServiceのTypeを指定 selector: app: nginx このラベルを持つPodにトラフィックを転送 ports: - port: 80 targetPort: 80 Serviceについて 2026/2/19 4 • Podは頻繁に入れ替わり、そのたびにPodのIPは変わる • ServiceはPodのIPが変わっても通信できるようにするためのもの • Serviceを作成するとServiceのドメイン <service- name>.<namespace>.svc.cluster.local が作成され、そのドメイン名で Podにアクセスでき、 Pod IPの変更を意識しなくて良くなる apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx Podに付与されるラベル ...
  2. NodePort 2026/2/19 7 • 外部からPodにアクセスするための一番基本的なtypeのService ➢ NodePortの範囲は30000〜32767 • Podに ワーカーノードのIP

    + NodePort でアクセスする ➢ Podが存在するワーカーノード以外のワーカーノードのIPからもアクセス できる(全ワーカーノードに同じiptablesのルールが設定されるため) • LBとPodの間で繋ぎ口としても機能する(※) ※LBの種類や作成方法、ベンダーなどによって異なる。 NodePortを介さずにLBから直接PodのIPにアクセスする場合もある。
  3. Service(ClusterIP、NodePort)の簡略図 2026/2/19 8 ワーカーノード 3 0 0 0 0 service

    type: NodePort selector: app: handson-app ports: - port: 800 targetPort: 80 nodePort: 30000 ClusterIP: 10.100.159.150 8 0 0 POD labels: app: handson-app 8 0 POD IP: 172.31.22.175 POD labels: app: mysql POD IP: 172.31.46.249 ワーカーノード ノードIP: 18.183.62.141 ユーザ POD labels: app: handson-app 8 0 POD IP: 172.31.11.147 18.183.62.141:30000 ノードIP: 54.95.101.197 10.100.185.77:33006 service type: ClusterIP selector: app: mysql ports: - port: 33006 targetPort: 3306 3 3 0 6 ClusterIP: 10.100.185.77 10.100.185.77:33006 3 0 0 0 0 54.95.101.197:30000 Serviceは特定のノード 内にあるものではない ですが、理解を助ける ためにノード内に入れ て表現しています
  4. LoadBalancerのサンプルマニフェスト 2026/2/19 10 apiVersion: v1 kind: Service metadata: name: my-app-nlb

    annotations: service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip" service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing" spec: type: LoadBalancer loadBalancerClass: eks.amazonaws.com/nlb selector: app: my-app ports: - port: 80 targetPort: 8080 • 「aws-load-balancer-nlb-target-type」には“ip”もし くは“instance”を指定できて、それによってLBからPodへ の通信フロー(方式)が変わる
  5. Headless 2026/2/19 11 • 主にStatefulSet(ステートフルなPod)で使われるもの • 「clusterIP: None」を指定することでHeadless Serviceになる。 Headless

    ServiceにはClusterIPが生成されない • <Pod名>.<Service名>.<namespace名>.svc.cluster.local ドメインで、固定のPodにアクセスできる(※) apiVersion: v1 kind: Service metadata: name: thanos-ingesting-receiver namespace: monitoring labels: app: thanos component: ingesting-receiver spec: clusterIP: None # ここ selector: app: thanos Cluster IPがNone になっている ※StatefulSet側で対象Serviceの指定が必要
  6. Ingressのサンプルマニフェスト 2026/2/19 13 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress

    spec: ingressClassName: alb rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-svc port: number: 80 • LB(の作成)とルーティングのルールが1つのリソースで 管理される
  7. その他外部からアクセスのためのリソース(2) GatewayAPI 2026/2/19 14 • Ingressの後継として、ロールベースで分離された設計になっている (GatewayClass / Gateway /

    Route) • Ingressより高度なルーティング(e.g. 重み付けトラフィック分割な ど)が標準仕様としてサポートされる。 また、L7だけではなく、L4のルーティングも可能 https://gateway-api.sigs.k8s.io/
  8. GatewayAPIの各リソース(サンプルマニフェスト) 2026/2/19 15 apiVersion: gateway.networking.k8s.io/v1beta1 kind: GatewayClass metadata: name: amazon-vpc-lattice

    spec: controllerName: application-networking.k8s.aws/gateway-api-controller apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: my-hotel spec: gatewayClassName: amazon-vpc-lattice listeners: - name: http protocol: HTTP port: 80 apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: inventory spec: parentRefs: - name: my-hotel sectionName: http rules: - backendRefs: - name: inventory-ver1 kind: Service port: 8090 weight: 50 - name: inventory-ver2 kind: Service port: 8090 weight: 50 どのControllerで Gateway(LB層)を作成 するかを定義 e.g. VPC Lattice、Envoy • Gatewayリソースで 実際のLB層が作成される • 通信を受け付ける リスナーを定義 各種Routeリソース でルーティングの ルールを設定
  9. iptables 2026/2/19 17 • Linuxのファイアウォール機能で、パケットフィルタリングだけでは なく、NATにも使える • KubernetesではServiceのCluster IPから実際のPodのIPへ の変換(DNAT)にiptables(※)が使われる

    ※kube-proxyのモードで、iptables以外にIPVSやnftablesがあるけど、 EKSではdefaultでiptablesが使われるため、ここではiptablesの前提で話を進めます
  10. kube-proxy 2026/2/19 18 • DaemonSetとして各ワーカーノード上に存在 ➢ EKS AutoModeではプロセスとして存在 • ServiceとEndpointSliceリソースを監視して、

    ワーカーノード上のiptablesのNATルールを更新する役割を担う ➢ ServiceはDNATの変換前の宛先IP(ClusterIP)のため ➢ EndpointSliceはDNATの変換後の宛先IP(PodのIP)のため
  11. Service → EndpointSlice → kube-proxy → iptablesの関係図 2026/2/19 19 Pod

    IP: 10.0.0.1 ①PodとServiceを作成 ClusterIP: 10.0.10.10 EndpointSlice Controller Pod IP: 10.0.0.2 kube-proxy ②Controllerによって EndpointSliceリソースが 作成される Serviceに紐づく Pod IPの一覧を管理 ③kube-proxyによって iptablesのルールが作成される ServiceのClusterIP・port・ targetPort、EndpointSliceのPodのIP などに基づき、DNATのルールを管理
  12. CNIとは(1) 2026/2/19 21 • コンテナランタイム(e.g. containerd)がコンテナの ネットワークインターフェースを設定する際に、 CNIプラグインを呼び出すための標準的な仕様 • CNIプラグインは以下のようなことを行う

    ➢ Podのネットワーク(netns)にNIC(veth)の割り当て ➢ PodのvethにIPアドレスの割り当て、ルーティングの設定 ➢ ホスト側のルーティング設定
  13. CNIとは(2) 2026/2/19 22 • Kubernetesは以下のネットワーク要件を定めており、 CNIプラグインはこれを満たす限り自由に実装できる ➢ Pod同士はNATなしで直接通信できる ➢ ノード(kubeletなどノード上のエージェント)とPodはNATなしで直接通信できる

    ➢ PodのIPはPod内外で同一(Pod自身が認識するIPと外部から見えるIPが同じ) • VPC CNI、Calico、Ciliumなど数多くのCNIプラグインが存在し、 CNIプラグインによってネットワークの構成や使える機能に違いが ある
  14. CNIのネットワークモード 2026/2/19 23 • Overlay ➢ VXLANやIPIPでパケットのカプセル化 • Underlay ➢

    パケットのカプセル化なしで、PodのIPで直接通信 ➢ EKSで使われるVPC CNIはUnderlay ➢ ENIのセカンダリIPをPodに直接割り当てるため、 Pod IPがVPCネットワーク上でそのままルーティング可能 ➢ Public CloudのマネージドK8sではほとんどUnderlay方式を採用 • Routing ➢ BGP等でPodへのルート情報を交換
  15. ※補足 NetworkPolicy 2026/2/19 27 • デフォルトでは、すべてのnamespace上のすべてのPod同士が 相互に通信できる • NetworkPolicyを使えば namespace、IPレンジ、ラベルなどを

    もとにingress/egressの細かい制御ができる • CNIプラグインごとに使える機能に違いがある ➢ そもそもNetworkPolicyをサポートしてないCNIプラグインもある (e.g. Flannel)
  16. CoreDNS 2026/2/19 29 • Kubernetes内の名前解決を担当 • kube-system namespace上に(Podとして)存在 ➢ EKS

    AutoModeではWorkerNode上にプロセスとして配置されていて、 ユーザ側(kube-system namespace上)には見えない • 「cluster.local」 (Service)ドメインは自分で処理し、 それ以外のドメインは外部DNSサーバに転送 ➢ EKSの場合は、VPC DNS(Route 53 VPC Resolver)に転送される
  17. Podから名前解決の流れ 2026/2/19 30 • Pod内の/etc/resolv.confにDNSサーバとしてCoreDNS (のClusterIP)が設定されている search monitoring.svc.cluster.local svc.cluster.local cluster.local

    ap-northeast-1.compute.internal nameserver 172.20.0.10 # CoreDNSのClusterIP options ndots:5 CoreDNSの ClusterIP CoreDNSの (Podの)IPに DNAT cluster.localドメイン (Service)の場合 cluster.local以外の ドメインの場合 送信先Serviceの ClusterIPに名前解決 外部DNSサーバに転送 ※EKSの場合はRoute 53 VPC Resolver 外部DNSサーバにて 名前解決
  18. Pod間通信(同じノード上のPod間) 2026/2/19 32 • ノード側(netns)のルートテーブルのルールでPodにルーティング ワーカーノード POD 1 veth POD

    2 veth eth veth veth Pod2用のServiceのドメインでPod2にアクセス ①CoreDNSからPod2用 ServiceのClusterIPに解決 ②ノード上のiptablesのルールで Pod2のIPアドレスにDNAT ③ノードのルートテーブルに定義されている Pod2のIPアドレスに対するvethにルーティング Podのnetns ノードのnetns
  19. Pod間通信(異なるノード上のPod間) Underlay(EKS)の場合 2026/2/19 33 • VPC fabricを経由して、PodのIPのままルーティングされる ワーカーノード1 POD 1

    veth POD 2 veth eth veth veth Pod2用のServiceのドメインでPod2にアクセス ①CoreDNSからPod2用 ServiceのClusterIPに解決 ②ノード上のiptablesの ルールでPod2の IPアドレスにDNAT ③自ノードのルートテーブルにPod2への直接 のルートがないため、サブネット/VPCレンジの ルートに従い、ノードのethにルーティング Podのnetns ノードのnetns ワーカーノード2 eth ④ノード2のethにルーティング VPC fabric ⑤ノードのルートテーブルに 定義されているPod2の IPアドレスに対するvethにルーティング
  20. Pod間通信(異なるノード上のPod間) Overlayの場合 • IPIPやVXLANでtargetノードのIPにカプセル化してルーティング ワーカーノード1 POD 1 veth POD 2

    veth eth veth veth Pod2用のServiceのドメインでPod2にアクセス ①CoreDNSからPod2用 ServiceのClusterIPに解決 ②ノード上のiptablesの ルールでPod2の IPアドレスにDNAT ③トンネルI/Fでノード2のIPにカプセル化 Podのnetns ノードのnetns ワーカーノード2 eth ⑤ARPにより、 ノード2のethに転送 ⑥トンネルI/Fで Pod2のIPに デカプセル化 トンネル I/F ④カプセル後のノード2のIPに より、ethにルーティング トンネル I/F 2026/2/19 34 ⑦デカプセル化後の Pod2のIPでvethに ルーティング
  21. 外部からPodへの通信 aws-load-balancer-nlb-target-type: ipの場合 2026/2/19 35 • iptablesのルールを経由せず、直接ノードについているPod用の ENIからPodにルーティング ワーカーノード POD

    veth eth veth ②ノードのethに ルーティング ③ノードのルートテーブルに定義されている PodのIPアドレスに対するvethにルーティング ターゲットとして 「PodのIP:Podの公開Port」が 登録されている ユーザ ①ユーザがLBの エンドポイントにアクセス VPC fabric
  22. 外部からPodへの通信 aws-load-balancer-nlb-target-type: instanceの場合 2026/2/19 36 • ノードのiptablesのルールで、 「ノードのIP:NodePort」→「PodのIP:Podの公開Port」にDNAT ターゲットとして 「ノードのIP:NodePort」が

    登録されている ワーカーノード POD veth eth veth ②ノードのethに ルーティング ③ノード上のiptablesのルールで 「PodのIP:Podの公開Port」にDNAT ユーザ ①ユーザがLBの エンドポイントにアクセス VPC fabric ④ノードのルートテーブルに 定義されているPodのIPアドレスに 対するvethにルーティング