ネットワーク

Service、Ingress、NetworkPolicy

K8sネットワークモデル

Kubernetesネットワークはフラットなネットワークモデルを採用。 すべてのPodはNATなしで他のPodと通信可能。CNI(Container Network Interface)プラグインで実装。

Pod間通信

全PodがクラスタIP空間で直接通信

Pod-Service通信

ServiceのClusterIPで負荷分散

外部-Service通信

NodePort、LoadBalancer、Ingress

Service

ServiceはPodへの安定したアクセスポイントを提供。 ラベルセレクタでPodをグループ化し、負荷分散を行う。

ClusterIP(デフォルト)

クラスタ内部からのみアクセス可能な仮想IP

NodePort

各ノードの特定ポート(30000-32767)で外部公開

LoadBalancer

クラウドプロバイダのLBを自動作成

ExternalName

外部DNSへのCNAMEエイリアス

service.yaml
yaml
1apiVersion: v1
2kind: Service
3metadata:
4 name: web-service
5spec:
6 type: ClusterIP
7 selector:
8 app: web
9 ports:
10 - port: 80 # Serviceのポート
11 targetPort: 8080 # Podのポート
12 protocol: TCP
13
14---
15apiVersion: v1
16kind: Service
17metadata:
18 name: web-nodeport
19spec:
20 type: NodePort
21 selector:
22 app: web
23 ports:
24 - port: 80
25 targetPort: 8080
26 nodePort: 30080 # 省略時は自動割当
1# Service操作
2kubectl get svc
3kubectl describe svc web-service
4kubectl get endpoints web-service
5
6# サービスへのアクセス
7# クラスタ内: web-service.namespace.svc.cluster.local
8# または: web-service (同一namespace内)

Ingress

IngressはHTTP/HTTPSのL7ルーティングを提供。 パスベース、ホストベースのルーティング、TLS終端をサポート。 Ingress Controllerが必要(nginx-ingress、traefik等)。

ingress.yaml
yaml
1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4 name: app-ingress
5 annotations:
6 nginx.ingress.kubernetes.io/rewrite-target: /
7spec:
8 ingressClassName: nginx
9 tls:
10 - hosts:
11 - app.example.com
12 secretName: app-tls
13 rules:
14 - host: app.example.com
15 http:
16 paths:
17 - path: /api
18 pathType: Prefix
19 backend:
20 service:
21 name: api-service
22 port:
23 number: 80
24 - path: /
25 pathType: Prefix
26 backend:
27 service:
28 name: web-service
29 port:
30 number: 80
1# Ingress操作
2kubectl get ingress
3kubectl describe ingress app-ingress
4
5# TLS証明書のSecret作成
6kubectl create secret tls app-tls \
7 --cert=tls.crt --key=tls.key

NetworkPolicy

NetworkPolicyはPod間トラフィックのファイアウォールルール。 デフォルトは全許可。CNIプラグインのサポートが必要(Calico、Cilium等)。

networkpolicy.yaml
yaml
1# デフォルト拒否(Ingress)
2apiVersion: networking.k8s.io/v1
3kind: NetworkPolicy
4metadata:
5 name: default-deny-ingress
6spec:
7 podSelector: {} # 全Pod対象
8 policyTypes:
9 - Ingress
10
11---
12# 特定Podからのみ許可
13apiVersion: networking.k8s.io/v1
14kind: NetworkPolicy
15metadata:
16 name: allow-from-frontend
17spec:
18 podSelector:
19 matchLabels:
20 app: api
21 policyTypes:
22 - Ingress
23 ingress:
24 - from:
25 - podSelector:
26 matchLabels:
27 app: frontend
28 ports:
29 - protocol: TCP
30 port: 8080
31
32---
33# Namespace間の制御
34apiVersion: networking.k8s.io/v1
35kind: NetworkPolicy
36metadata:
37 name: allow-from-monitoring
38spec:
39 podSelector: {}
40 ingress:
41 - from:
42 - namespaceSelector:
43 matchLabels:
44 name: monitoring

クラスタDNS

CoreDNS がクラスタ内DNSを提供。Serviceは自動的にDNSエントリが作成される。

service-name

同一Namespace内

service-name.namespace

別Namespace

service-name.namespace.svc.cluster.local

完全修飾ドメイン名(FQDN)

SRE/インフラ観点

Service設計

  • • 内部通信はClusterIPを使用
  • • 外部公開はIngress経由が推奨
  • • Headless Service(clusterIP: None)でStatefulSet向けDNS

セキュリティ

  • • NetworkPolicyでマイクロセグメンテーション
  • • デフォルト拒否 + 必要な通信のみ許可
  • • TLS終端はIngress Controllerで

トラブルシューティング

  • kubectl get endpoints でバックエンドPod確認
  • kubectl run debug --image=busybox -it -- nslookup svc
  • • CNIプラグインのログを確認