1. NetworkPolicy
NetworkPolicy 控制 Pod 之間的網路流量。預設情況下,所有 Pod 之間都可以互相通訊。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-netpol
namespace: production
spec:
podSelector: # 此規則套用的目標 Pod
matchLabels:
app: api
policyTypes:
- Ingress # 控制入站流量
- Egress # 控制出站流量
ingress:
- from:
- podSelector: # 允許同 namespace 中標籤為 app=web 的 Pod
matchLabels:
app: web
- namespaceSelector: # 允許來自標籤為 env=staging 的 namespace
matchLabels:
env: staging
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
- to: # 允許 DNS 查詢
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
2. AND vs OR 的陷阱(重要!)
# OR 邏輯 — from 陣列中有兩個獨立元素(- 開頭)
ingress:
- from:
- podSelector: # 規則 1: 符合此 podSelector 的 Pod
matchLabels:
app: web
- namespaceSelector: # 規則 2: OR 符合此 namespaceSelector 的任何 Pod
matchLabels:
env: staging
# AND 邏輯 — 同一個元素中同時包含 podSelector 和 namespaceSelector
ingress:
- from:
- podSelector: # 必須同時滿足: Pod 標籤為 app=web
matchLabels:
app: web
namespaceSelector: # AND Namespace 標籤為 env=staging
matchLabels:
env: staging
考試重點:
from陣列中兩個獨立的-是 OR 關係。同一個-中同時包含 podSelector 和 namespaceSelector 是 AND 關係。YAML 縮排差異會導致完全不同的行為——這是 CKAD 常考陷阱。
3. 常見 NetworkPolicy 模式
# 模式 1: Default Deny All Ingress(先阻擋所有入站流量)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {} # {} = 選擇該 namespace 所有 Pod
policyTypes:
- Ingress # 沒有 ingress 規則 = 阻擋所有入站
# 模式 2: Default Deny All Egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
spec:
podSelector: {}
policyTypes:
- Egress # 沒有 egress 規則 = 阻擋所有出站
# 模式 3: 允許特定流量(在 default-deny 之上疊加)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-web-to-api
spec:
podSelector:
matchLabels:
app: api
ingress:
- from:
- podSelector:
matchLabels:
app: web
ports:
- port: 8080
4. CKAD 考試資訊
| 項目 | 詳情 |
|---|---|
| 時間 | 2 小時 |
| 通過分數 | 66% |
| 題目數量 | 約 15-20 題(實作題) |
| 環境 | 瀏覽器內 terminal + 一個文件分頁 |
| 可參考文件 | kubernetes.io/docs、helm.sh/docs |
5. --dry-run 模式(快速產生 YAML)
# 考試中最省時間的技巧: 用 --dry-run=client -o yaml 產生範本
# Pod
kubectl run mypod --image=nginx --dry-run=client -o yaml > pod.yaml
# Deployment
kubectl create deployment myapp --image=nginx --replicas=3 --dry-run=client -o yaml > deploy.yaml
# Service
kubectl expose deployment myapp --port=80 --target-port=8080 --dry-run=client -o yaml > svc.yaml
# Job
kubectl create job myjob --image=busybox --dry-run=client -o yaml -- echo hello > job.yaml
# CronJob
kubectl create cj mycj --image=busybox --schedule="*/5 * * * *" --dry-run=client -o yaml -- echo hi > cj.yaml
# ConfigMap
kubectl create cm myconfig --from-literal=key=value --dry-run=client -o yaml > cm.yaml
# Secret
kubectl create secret generic mysecret --from-literal=pass=secret --dry-run=client -o yaml > secret.yaml
6. kubectl 快捷指令
| 縮寫 | 完整寫法 | 範例 |
|---|---|---|
po | pods | kubectl get po |
deploy | deployments | kubectl get deploy |
svc | services | kubectl get svc |
cm | configmaps | kubectl get cm |
ns | namespaces | kubectl get ns |
sa | serviceaccounts | kubectl get sa |
ing | ingresses | kubectl get ing |
netpol | networkpolicies | kubectl get netpol |
pv | persistentvolumes | kubectl get pv |
pvc | persistentvolumeclaims | kubectl get pvc |
7. CKAD 最終速查表
| 領域 | 配分 | 必備知識 |
|---|---|---|
| 1. App Design & Build | 20% | Multi-container patterns、Init Containers、Jobs/CronJobs |
| 2. App Deployment | 20% | Rolling updates、Rollbacks、Helm install/upgrade/rollback、Kustomize |
| 3. App Observability | 15% | Probes(liveness/readiness/startup)、kubectl logs/exec/debug |
| 4. App Env/Config/Security | 25% | ConfigMaps、Secrets、SecurityContext、Capabilities、Resources/QoS |
| 5. Services & Networking | 20% | Services 4 種類型、Ingress 規則、NetworkPolicies(AND vs OR) |
考試策略:
1. 先設定環境: alias k=kubectl, export do="--dry-run=client -o yaml"
2. 先做簡單且高分題(30 分鐘 / 題數 × 分數排序)
3. 善用 --dry-run=client -o yaml 產生範本再修改
4. 善用 kubectl explain(如 kubectl explain pod.spec.containers)
5. 時間管理: 每題平均 6-8 分鐘。超過 10 分鐘先標記跳過
6. 核心文件 bookmark: 提前在 kubernetes.io/docs 加入書籤
8. 練習題
Q1: 您需要阻擋 "production" namespace 中所有 Pod 的入站流量,然後再為特定 Pod 建立例外規則。第一步應建立什麼 NetworkPolicy?
- A) 設定 podSelector 為 {} 並加入空的 ingress 規則列表
- B) 設定 podSelector 為 {},policyTypes 為 [Ingress],不加入 ingress 規則 ✓
- C) 設定 podSelector 為 {},ingress 中 from 設定 podSelector 為 {}
- D) 不需要 NetworkPolicy,Kubernetes 預設即為 deny-all
解析: 建立一個 podSelector 為空({})的 NetworkPolicy,將 policyTypes 設定為 [Ingress],且不加入任何 ingress 規則 → 等同於 default deny all ingress。隨後可在此基礎上疊加允許特定流量的 NetworkPolicy。
Q2: 以下 NetworkPolicy 的 ingress 部分表示什麼意思?
ingress:
- from:
- podSelector:
matchLabels:
app: web
namespaceSelector:
matchLabels:
env: prod
- A) 允許 app=web 的 Pod OR env=prod 的 namespace 中的任何 Pod
- B) 允許 env=prod 的 namespace 中 AND 標籤為 app=web 的 Pod ✓
- C) 允許所有 namespace 中 app=web 的 Pod
- D) 阻擋 app=web 的 Pod 和 env=prod 的 namespace
解析: podSelector 和 namespaceSelector 在同一個 from 元素(同一個 -)中 = AND 邏輯。必須同時滿足兩個條件:Pod 必須在標籤為 env=prod 的 namespace 中,並且 Pod 必須有 app=web 標籤。
Q3: 考試中需要快速建立一個 nginx Pod 的 YAML 範本。最快的方法是什麼?
- A) 從 kubernetes.io/docs 複製 Pod YAML 範例
- B)
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml✓ - C) 手動從頭編寫完整的 YAML
- D)
kubectl create pod nginx --image=nginx
解析: --dry-run=client -o yaml 不會實際建立資源,而是產生有效的 YAML 到 stdout。重導向到檔案後可用 vi 編輯修改(如新增 probes、volumes 等)。這是考試中最省時間的技巧。注意: kubectl 沒有 "create pod" 子命令,應使用 "run"。