Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kubernetes(EKS)ネットワーク入門
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
nutslove
February 19, 2026
550
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kubernetes(EKS)ネットワーク入門
Kubernetes(EKS)のネットワークについて、社内勉強会で使用した資料です。
お役に立てれば嬉しいです。
nutslove
February 19, 2026
More Decks by nutslove
See All by nutslove
AI Gateway入門 - マルチLLM時代の交通整理 -
nutslove
1
47
Context Engineeringの取り組み
nutslove
0
610
LangGraphで作ったアラート原因分析エージェントについて
nutslove
0
510
アラートだけでここまで分析できるの!?AI Agentで切り開くアラート対応の新時代
nutslove
0
780
OpenTelemetry(ADOT)による自動計装
nutslove
1
310
MCP入門
nutslove
2
210
GitOpsで始めるクラウドリソース管理
nutslove
1
180
Thanos入門(Receiver構成)
nutslove
0
180
OpenTelemetryによるベンダーニュートラルな監視設定
nutslove
5
550
Featured
See All Featured
The SEO identity crisis: Don't let AI make you average
varn
0
490
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Test your architecture with Archunit
thirion
1
2.3k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
570
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
190
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
We Have a Design System, Now What?
morganepeng
55
8.2k
Transcript
Kubernetes(EKS) ネットワーク入門 2026/2/19 李俊起 1
話す内容 2026/2/19 2 • Pod間、外部からPodへの通信を可能にする仕組み • Service、Ingress、GatewayAPI • iptables、kube-proxy •
CNIについて • DNSについて • 通信の流れ • Pod間通信 • 外部からの通信
2026/2/19 3 Pod間、外部からPodへの通信を 可能にする仕組み
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に付与されるラベル ...
Serviceの種類 2026/2/19 5 • ClusterIP(デフォルト) • NodePort • LoadBalancer •
Headless
ClusterIP 2026/2/19 6 • 外部に公開する必要のない、Pod間通信のためのもの ➢ Kubernetesクラスター内でのみ使える仮想IPアドレスが割り振られる • 仮想的なIPアドレスから実際のPodのIPアドレスにDNATされる •
1つのServiceに複数のPodが関連づけられている場合、自動的 にロードバランシングされる
NodePort 2026/2/19 7 • 外部からPodにアクセスするための一番基本的なtypeのService ➢ NodePortの範囲は30000〜32767 • Podに ワーカーノードのIP
+ NodePort でアクセスする ➢ Podが存在するワーカーノード以外のワーカーノードのIPからもアクセス できる(全ワーカーノードに同じiptablesのルールが設定されるため) • LBとPodの間で繋ぎ口としても機能する(※) ※LBの種類や作成方法、ベンダーなどによって異なる。 NodePortを介さずにLBから直接PodのIPにアクセスする場合もある。
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は特定のノード 内にあるものではない ですが、理解を助ける ためにノード内に入れ て表現しています
LoadBalancer 2026/2/19 9 • L4のロードバランシング • 別途Controllerのインストールが必要 ➢ LoadBalancerのリソース作成を検知し、実際のLBを作成するため •
EKS AutoModeの場合、AWS Load Balancer Controllerが ビルトインされていて、NLBが作成される
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へ の通信フロー(方式)が変わる
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の指定が必要
その他外部からアクセスのためのリソース(1) Ingress 2026/2/19 12 • L7のロードバランシング ➢ URLパスやHost名でのルーティングが可能 • EKS
AutoModeの場合、同じくビルトインの AWS Load Balancer ControllerでALBが作成される
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つのリソースで 管理される
その他外部からアクセスのためのリソース(2) GatewayAPI 2026/2/19 14 • Ingressの後継として、ロールベースで分離された設計になっている (GatewayClass / Gateway /
Route) • Ingressより高度なルーティング(e.g. 重み付けトラフィック分割な ど)が標準仕様としてサポートされる。 また、L7だけではなく、L4のルーティングも可能 https://gateway-api.sigs.k8s.io/
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リソース でルーティングの ルールを設定
Endpoints / EndpointSlice 2026/2/19 16 • Serviceのselectorの条件に一致するPodのIPアドレスと Port番号(の一覧)を持つリソース • kube-controller-manager内のEndpointSlice
Controllerが Serviceと(selectorの条件に一致する)Podを監視して、 EndpointSliceを更新する
iptables 2026/2/19 17 • Linuxのファイアウォール機能で、パケットフィルタリングだけでは なく、NATにも使える • KubernetesではServiceのCluster IPから実際のPodのIPへ の変換(DNAT)にiptables(※)が使われる
※kube-proxyのモードで、iptables以外にIPVSやnftablesがあるけど、 EKSではdefaultでiptablesが使われるため、ここではiptablesの前提で話を進めます
kube-proxy 2026/2/19 18 • DaemonSetとして各ワーカーノード上に存在 ➢ EKS AutoModeではプロセスとして存在 • ServiceとEndpointSliceリソースを監視して、
ワーカーノード上のiptablesのNATルールを更新する役割を担う ➢ ServiceはDNATの変換前の宛先IP(ClusterIP)のため ➢ EndpointSliceはDNATの変換後の宛先IP(PodのIP)のため
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のルールを管理
2/19/2026 20 CNIについて
CNIとは(1) 2026/2/19 21 • コンテナランタイム(e.g. containerd)がコンテナの ネットワークインターフェースを設定する際に、 CNIプラグインを呼び出すための標準的な仕様 • CNIプラグインは以下のようなことを行う
➢ Podのネットワーク(netns)にNIC(veth)の割り当て ➢ PodのvethにIPアドレスの割り当て、ルーティングの設定 ➢ ホスト側のルーティング設定
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プラグインによってネットワークの構成や使える機能に違いが ある
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へのルート情報を交換
Overlay 2026/2/19 24 • ワーカーノードとPodが異なるネットワークセグメント上に存在し、 異なるワーカーノード上のPod間の通信時、VXLANやIPIPで パケットのカプセル化(トンネリング)を行う https://www.alibabacloud.com/blog/getting-started-with-kubernetes-%7C-kubernetes-cnis-and-cni-plug-ins_596330
Underlay 2026/2/19 25 • ワーカーノードとPodが同じネットワークセグメント上に存在し、 パケットのカプセル化を行わずに直接PodのIPで通信する https://www.alibabacloud.com/blog/getting-started-with-kubernetes-%7C-kubernetes-cnis-and-cni-plug-ins_596330
Routing 2026/2/19 26 • BGPなどでPodへのルーティング情報をノード間で交換・ルート テーブルに登録し、カプセル化なしでルーティングする https://www.alibabacloud.com/blog/getting-started-with-kubernetes-%7C-kubernetes-cnis-and-cni-plug-ins_596330
※補足 NetworkPolicy 2026/2/19 27 • デフォルトでは、すべてのnamespace上のすべてのPod同士が 相互に通信できる • NetworkPolicyを使えば namespace、IPレンジ、ラベルなどを
もとにingress/egressの細かい制御ができる • CNIプラグインごとに使える機能に違いがある ➢ そもそもNetworkPolicyをサポートしてないCNIプラグインもある (e.g. Flannel)
2026/2/19 28 DNSについて
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)に転送される
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サーバにて 名前解決
2/19/2026 31 通信の流れ
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
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にルーティング
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に ルーティング
外部から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
外部から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にルーティング