1. Service 類型
Pod 的 IP 是臨時的,重啟後會消失。Service 提供穩定的虛擬 IP(ClusterIP)並透過標籤選擇器對一組 Pod 進行負載均衡。
| 類型 | 可存取範圍 | 使用場景 | 實際範例 |
|---|---|---|---|
| ClusterIP | 僅叢集內部 | 後端微服務 | 支付服務 → DB |
| NodePort | 透過 NodeIP:Port 外部存取(30000-32767) | 開發/測試存取 | 裸機上的示範應用 |
| LoadBalancer | 透過雲端 LB 外部存取 | 雲端上的生產應用 | AWS/GCP 網際網路流量 |
| ExternalName | 外部服務的 CNAME 別名 | 整合外部 DNS | legacy-db.company.com |
External Traffic
│
▼
[LoadBalancer] ← cloud provider LB (AWS ELB, GCP)
│
[NodePort :30080] ← all nodes expose port 30080
│
[ClusterIP 10.96.5.3] ← virtual IP, iptables/IPVS routing
│
┌────┴────┐
[Pod A] [Pod B] ← matched by label selector
考試重點: NodePort 會自動建立 ClusterIP。LoadBalancer 會自動建立 NodePort + ClusterIP。每種類型繼承較小的類型。
2. CoreDNS 與服務發現
CoreDNS 是 Kubernetes 叢集中的預設 DNS 伺服器。每個 Service 都會自動註冊 DNS 記錄。
DNS format: {service}.{namespace}.svc.cluster.local
範例:
Namespace "production" 中的 Service "api":
→ api.production.svc.cluster.local
→ api.production.svc
→ api.production
→ api(僅在相同 namespace 內)
| DNS 查詢 | 解析結果 | 可從何處使用 |
|---|---|---|
api | Service ClusterIP | 僅相同 namespace |
api.production | Service ClusterIP | 任何 namespace |
api.production.svc.cluster.local | Service ClusterIP | 任何 namespace(FQDN) |
3. 儲存:PV、PVC、StorageClass
Storage lifecycle:
STATIC DYNAMIC
───── ───────
Admin creates → PersistentVolume StorageClass (provision template)
App requests → PersistentVolumeClaim → SC auto-provisions PV
Pod mounts → PVC as volume
| 概念 | 角色 | 誰建立 |
|---|---|---|
| PersistentVolume (PV) | 實際儲存資源(NFS、EBS、GCE Disk) | 管理員或動態佈建器 |
| PersistentVolumeClaim (PVC) | 以大小和存取模式請求儲存 | 開發者/應用程式 |
| StorageClass | PVC 建立時自動佈建 PV 的範本 | 管理員 |
存取模式
| 模式 | 縮寫 | 含義 | 範例 |
|---|---|---|---|
| ReadWriteOnce | RWO | 1 個節點讀寫 | EBS volume、本機磁碟 |
| ReadOnlyMany | ROX | 多個節點唯讀 | NFS 上的靜態檔案 |
| ReadWriteMany | RWX | 多個節點讀寫 | NFS、EFS、GlusterFS |
| ReadWriteOncePod | RWOP | 僅 1 個 Pod(v1.22+) | 需要獨佔存取 |
考試重點: AWS EBS 僅支援 RWO。如果題目要求多個 Pod 同時寫入,需要使用 NFS(RWX)。StatefulSet 通常使用 RWO,每個 Pod 有自己的 PVC。
4. ConfigMap 與 Secret
| 資源 | 用途 | 編碼 | 注入 Pod 的方式 |
|---|---|---|---|
| ConfigMap | 非敏感組態設定(URL、旗標、環境檔案) | 純文字 | 環境變數、Volume 檔案、CLI 參數 |
| Secret | 敏感資料(密碼、API 金鑰、TLS 憑證) | Base64(預設未加密) | 環境變數(不建議)、Volume 掛載 |
考試重點: Secret 只是 base64 編碼,不是加密。要在靜態時加密 Secret,需要在 API Server 上啟用 Encryption Configuration。題目常用「encrypted」作為錯誤的干擾選項。
5. 速查表
| 考試問題 | 答案 |
|---|---|
| 在雲端將應用公開到叢集外部? | LoadBalancer(或 Ingress) |
| ns "backend" 中 Service "db" 的 DNS 名稱? | db.backend.svc.cluster.local |
| 需要在多個 Pod 間共享儲存? | 存取模式為 RWX 的 PV |
| 部署時自動佈建儲存? | StorageClass + PVC |
| Secret 預設是否加密? | 否,僅 base64 |
6. 練習題
Q1: 開發者想從不同的 namespace "frontend" 存取名為 "orders-db" 的後端資料庫 Service。應使用哪個 DNS 名稱?
- A) orders-db
- B) orders-db.default.svc.cluster.local
- C) orders-db.backend.svc.cluster.local ✓
- D) backend.orders-db.cluster.local
解析:跨 namespace 的 DNS 需要完整格式:{service}.{namespace}.svc.cluster.local。簡短名稱 "orders-db" 僅在相同 namespace 內有效。
Q2: 哪種 Service 類型會自動建立 ClusterIP 和 NodePort?
- A) ClusterIP
- B) NodePort
- C) LoadBalancer ✓
- D) ExternalName
解析:LoadBalancer 是超集——它建立 ClusterIP + NodePort + 雲端負載均衡器。NodePort 包含 ClusterIP,但 ClusterIP 是獨立的,沒有外部存取。
Q3: 一個 Secret 包含資料庫密碼。開發者聲稱密碼已「加密」。這個說法正確嗎?
- A) 是的,Kubernetes Secret 使用 AES 加密
- B) 否,Secret 僅為 base64 編碼,除非啟用了 Encryption Configuration ✓
- C) 是的,Secret 使用 etcd 內建加密進行加密
- D) 否,Secret 以純文字儲存
解析:預設情況下,Secret 在 etcd 中以 base64 編碼字串儲存——這不是加密。管理員必須在 API Server 上設定 EncryptionConfiguration 才能啟用靜態加密。