1. Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls:
- hosts:
- app.example.com
secretName: tls-secret
考試重點:Ingress 資源本身不會自動生效。需要先部署 Ingress Controller(如 NGINX、Traefik)。CKA 考試環境通常已預裝 NGINX Ingress Controller。
2. NetworkPolicy
# 預設拒絕所有 Ingress 流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: production
spec:
podSelector: {} # 套用到所有 Pod
policyTypes:
- Ingress # 只控制 Ingress
---
# 只允許 frontend Pod 存取 backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: production
spec:
podSelector:
matchLabels:
app: backend # 保護的目標
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # 允許的來源
ports:
- protocol: TCP
port: 8080
| 欄位 | 說明 |
|---|---|
podSelector | 選擇此 Policy 保護的目標 Pod |
policyTypes | Ingress(進入流量)和/或 Egress(外出流量) |
ingress.from | 允許的來源(podSelector / namespaceSelector / ipBlock) |
egress.to | 允許的目標 |
3. CNI 外掛
# CNI 設定路徑
/etc/cni/net.d/
/opt/cni/bin/
# 常見的 CNI:
- Calico: 支援 NetworkPolicy、BGP、IPIP
- Flannel: 簡單的 overlay 網路(不支援 NetworkPolicy)
- Cilium: eBPF、L7 policy
- Weave Net: 加密的 overlay
# 檢查正在使用的 CNI
ls /etc/cni/net.d/
cat /etc/cni/net.d/10-calico.conflist
考試重點:NetworkPolicy 需要 CNI 支援。Flannel 不支援 NetworkPolicy(建立了也不會生效)。Calico 和 Cilium 都支援。
4. 速查表
| 任務 | 指令 |
|---|---|
| 檢查 Ingress | kubectl get ingress -A |
| 檢查 Ingress Controller | kubectl get pods -n ingress-nginx |
| 查看 NetworkPolicy | kubectl get networkpolicy -n NS |
| 確認 CNI | ls /etc/cni/net.d/ |
| 測試連線 | kubectl exec pod -- curl SERVICE:PORT |
5. 練習題
Q1:production Namespace 有 deny-all-ingress 的 NetworkPolicy(podSelector: {})。如何只允許 monitoring Namespace 的 Pod 存取 production 的 metrics Pod(標籤 app=metrics,連接埠 9090)?
- A) 刪除 deny-all-ingress Policy
- B) 新增 NetworkPolicy 使用 namespaceSelector 選擇 monitoring Namespace + 指定 port 9090 ✓
- C) 在 monitoring Namespace 新增 Egress Policy
- D) 修改 kube-proxy 設定
解析:NetworkPolicy 是可累加的。新增一個 allow policy 配合 podSelector(app: metrics)和 ingress.from 使用 namespaceSelector(kubernetes.io/metadata.name: monitoring)+ ports 9090。deny-all 仍然保護其他 Pod。
Q2:Ingress 建立後,存取 host 回傳 404。可能的原因是?
- A) Ingress Controller 未安裝 ✓
- B) DNS 設定錯誤
- C) 後端 Service 不存在
- D) 以上皆是
解析:所有選項都可能。但 D 是最完整的答案,因為需要排除所有可能性。依序檢查:(1) Ingress Controller Pod 是否運行、(2) Ingress 資源的 rules 和 backend Service 是否正確、(3) Service 的 Endpoints 是否有效、(4) DNS 是否解析到 Ingress Controller 的 IP。
Q3:以下哪個 CNI 不支援 NetworkPolicy?
- A) Calico
- B) Cilium
- C) Flannel ✓
- D) Weave Net
解析:Flannel 只提供基本的覆蓋網路,不支援 NetworkPolicy。要使用 NetworkPolicy,需要換用 Calico、Cilium 等支援的 CNI,或使用 Canal(Calico + Flannel 的組合)。