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

第3課:Service、網路與儲存

Service 類型(ClusterIP、NodePort、LoadBalancer、ExternalName)。CoreDNS 與服務發現。PersistentVolume、PVC、ConfigMap、Secret。

Kubernetes Service 與網路 — ClusterIP、NodePort、LoadBalancer

1. Service 類型

Pod 的 IP 是臨時的,重啟後會消失。Service 提供穩定的虛擬 IP(ClusterIP)並透過標籤選擇器對一組 Pod 進行負載均衡。

類型可存取範圍使用場景實際範例
ClusterIP僅叢集內部後端微服務支付服務 → DB
NodePort透過 NodeIP:Port 外部存取(30000-32767)開發/測試存取裸機上的示範應用
LoadBalancer透過雲端 LB 外部存取雲端上的生產應用AWS/GCP 網際網路流量
ExternalName外部服務的 CNAME 別名整合外部 DNSlegacy-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 查詢解析結果可從何處使用
apiService ClusterIP僅相同 namespace
api.productionService ClusterIP任何 namespace
api.production.svc.cluster.localService 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)以大小和存取模式請求儲存開發者/應用程式
StorageClassPVC 建立時自動佈建 PV 的範本管理員

存取模式

模式縮寫含義範例
ReadWriteOnceRWO1 個節點讀寫EBS volume、本機磁碟
ReadOnlyManyROX多個節點唯讀NFS 上的靜態檔案
ReadWriteManyRWX多個節點讀寫NFS、EFS、GlusterFS
ReadWriteOncePodRWOP僅 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 才能啟用靜態加密。