Chuyển đến nội dung chính

レッスン7: Ingress、Network Policies & CNI

IngressリソースとIngressコントローラー。トラフィック分離のためのNetwork Policies。 CNIプラグイン: Flannel、Calico、Cilium。Podネットワーキングのトラブルシュート。

IngressルーティングとNetworkPolicy — L7ルーティングとネットワーク分離

1. Ingress

IngressはクラスタへのHTTP/HTTPSルーティングを提供します。Ingressリソースを処理するにはIngressコントローラー(nginx-ingress、Traefik、ALBなど)が必要です。

Internet
   │
[Ingress Controller] (nginx Pod, port 80/443)
   │
   ├── /api/* ──────────────► Service: api-svc:8080
   ├── /web/* ──────────────► Service: web-svc:80
   └── shop.example.com ───► Service: shop-svc:3000
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-svc
            port:
              number: 8080
  tls:
  - hosts:
    - api.example.com
    secretName: tls-secret  # SecretにTLS証明書を保存

試験のポイント:IngressコントローラーがないとIngressは機能しません。CKA試験では通常コントローラーが事前にインストールされています。kubectl get ingressclassでspec.ingressClassNameに使用するクラス名を確認してください。

2. Network Policies — CKA詳細

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: app
spec:
  podSelector:
    matchLabels:
      app: backend      # backendのPodに適用
  policyTypes:
  - Ingress             # 受信トラフィックを制御
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend  # frontendのPodからのみ許可
    ports:
    - protocol: TCP
      port: 8080

---
# 全インバウンドトラフィックを拒否(デフォルト拒否)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}     # 全てのPodを選択
  policyTypes:
  - Ingress           # ingressルールなし = 全インバウンドをブロック
セレクタ意味
podSelector: {}Namespace内の全Podを選択
namespaceSelector特定のNamespaceからのトラフィックを許可
ipBlockCIDR範囲からのトラフィックを許可

3. CNIプラグイン

CNINetworkPolicy対応特徴
Flannel非対応シンプルなオーバーレイ、VXLAN/host-gw
Calico対応BGPルーティング、高性能、エンタープライズ
Cilium対応(eBPF)eBPFベース、L7ポリシー、可観測性
Weave Net対応シンプル、メッシュネットワーク

試験のポイント:CalicoとCiliumはNetworkPolicyをサポートしていますが、Flannelはサポートしていません。試験で「ネットワークポリシーの設定」が求められた場合、Calico/Ciliumがインストールされている必要があります。kubeadmラボではCalicoが最も一般的な選択肢です。

4. Podネットワークトラブルシューティング

# Pod間接続テスト
kubectl exec -it pod1 -- ping 10.244.1.5
kubectl exec -it pod1 -- curl http://pod2:8080

# PodのIP確認
kubectl get pod pod1 -o jsonpath='{.status.podIP}'

# ノード上のCNI設定確認
ls /etc/cni/net.d/
cat /etc/cni/net.d/10-calico.conflist

# kube-proxyルールの確認
kubectl get pod -n kube-system -l k8s-app=kube-proxy
iptables -t nat -L KUBE-SERVICES | head -20

5. チートシート

タスクコマンド/オブジェクト
クラスタへのHTTPルーティングIngress(+ IngressClass)
Podへの全トラフィックブロック空のingress: []を持つNetworkPolicy
Namespaceからのトラフィック許可namespaceSelectorを持つNetworkPolicy
CNIプラグインの確認ls /etc/cni/net.d/
IngressClass確認kubectl get ingressclass

6. 練習問題

Q1:Ingressリソースを作成しましたがADDRESSがなく、トラフィックがルーティングされません。最も可能性の高い原因は?

  • A) ServiceタイプをLoadBalancerにする必要がある
  • B) クラスタにIngressコントローラーがインストールされていない ✓
  • C) Ingressはkube-system Namespaceに配置する必要がある
  • D) IngressClassを"default"に設定する必要がある

解説:Ingressリソースは設定にすぎません — Ingressコントローラー(nginx、Traefikなど)がなければ効果がありません。コントローラーがIngressオブジェクトを監視し、実際のプロキシを設定します。

Q2:NetworkPolicyがラベルapp=databaseのPodを選択し、policyTypes: [Ingress]を指定していますが、ingressルールが定義されていません。どのような効果がありますか?

  • A) 全トラフィックが許可される(ルールなし = 全許可)
  • B) databaseのPodへの全インバウンドトラフィックがブロックされる ✓
  • C) egressトラフィックのみが影響を受ける
  • D) ポリシーは無効で効果がない

解説:policyTypes: [Ingress]があり、ingressルールが空のNetworkPolicyは、選択されたPodへの全インバウンドトラフィックのデフォルト拒否として機能します。これはデフォルト拒否ポリシーの一般的な実装方法です。

Q3:Podネットワーキングとネットワークポリシーの両方が必要な場合、どのCNIプラグインを選択すべきですか?

  • A) Flannel
  • B) Calico ✓
  • C) CoreDNS
  • D) kube-proxy

解説:FlannelはオーバーレイネットワーキングのみでNetworkPolicyは非対応。Calico(およびCilium、Weave)はNetworkPolicy APIを実装。CoreDNSはDNS、kube-proxyはServiceロードバランシングを担当し、CNIプラグインではありません。