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

第7課:Ingress、Network Policies & CNI

Ingress Controller 與 Ingress 資源。NetworkPolicy 語法與實作。 CNI 外掛概覽。CKA 考試中的網路安全。

Ingress 與 NetworkPolicy 架構

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
policyTypesIngress(進入流量)和/或 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. 速查表

任務指令
檢查 Ingresskubectl get ingress -A
檢查 Ingress Controllerkubectl get pods -n ingress-nginx
查看 NetworkPolicykubectl get networkpolicy -n NS
確認 CNIls /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 的組合)。