ネットワーク
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
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: web-service 5 spec: 6 type: ClusterIP 7 selector: 8 app: web 9 ports: 10 - port: 80 # Serviceのポート 11 targetPort: 8080 # Podのポート 12 protocol: TCP 13 14 --- 15 apiVersion: v1 16 kind: Service 17 metadata: 18 name: web-nodeport 19 spec: 20 type: NodePort 21 selector: 22 app: web 23 ports: 24 - port: 80 25 targetPort: 8080 26 nodePort: 30080 # 省略時は自動割当
1 # Service操作 2 kubectl get svc 3 kubectl describe svc web-service 4 kubectl 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
1 apiVersion: networking.k8s.io/v1 2 kind: Ingress 3 metadata: 4 name: app-ingress 5 annotations: 6 nginx.ingress.kubernetes.io/rewrite-target: / 7 spec: 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操作 2 kubectl get ingress 3 kubectl describe ingress app-ingress 4 5 # TLS証明書のSecret作成 6 kubectl create secret tls app-tls \ 7 --cert=tls.crt --key=tls.key
NetworkPolicy
NetworkPolicyはPod間トラフィックのファイアウォールルール。 デフォルトは全許可。CNIプラグインのサポートが必要(Calico、Cilium等)。
networkpolicy.yaml
yaml
1 # デフォルト拒否(Ingress) 2 apiVersion: networking.k8s.io/v1 3 kind: NetworkPolicy 4 metadata: 5 name: default-deny-ingress 6 spec: 7 podSelector: {} # 全Pod対象 8 policyTypes: 9 - Ingress 10 11 --- 12 # 特定Podからのみ許可 13 apiVersion: networking.k8s.io/v1 14 kind: NetworkPolicy 15 metadata: 16 name: allow-from-frontend 17 spec: 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間の制御 34 apiVersion: networking.k8s.io/v1 35 kind: NetworkPolicy 36 metadata: 37 name: allow-from-monitoring 38 spec: 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プラグインのログを確認