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からのトラフィックを許可 |
ipBlock | CIDR範囲からのトラフィックを許可 |
3. CNIプラグイン
| CNI | NetworkPolicy対応 | 特徴 |
|---|---|---|
| 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プラグインではありません。