Kubernetes 裡面,Service 是一種抽象化的資源,主要解決兩個問題:
所以 Service 就像是 Pod 前面的一個「門牌」,讓外界(或者 cluster 內部的其他 Pod)能夠透過固定的方式去連到它後面那一組 Pod
backend-service
,型態是 ClusterIP
。http://backend-service:80
或這個 IP 去連線。→ 可以把它想成「公司內線分機號碼」,只能在公司內部打。
運作方式:在 cluster 裡每一個 node 的指定 port(30000–32767 範圍)開一個對外入口,然後把流量導到後面的 Pod。
適用情境:當你需要從 cluster 外部,直接存取某個服務,但還沒有設定 Ingress 或 LoadBalancer。
存取範圍:外部用戶可以透過 http://<NodeIP>:<NodePort>
存取服務。
例子:
frontend-service
,型態是 NodePort
。http://<NodeIP>:30080
連到這個服務。→ 可以把它想成「公司接待處的電話總機」,外面的人打進來會被導到對應的部門。
在 Kubernetes 裡,Namespace 就像是把一個大社區,切分成不同的「社區分區」,雖然大家都住在同一個 Kubernetes cluster 裡,但透過 namespace 可以做到 隔離與管理,來用個新世紀福音戰士來比擬:
如果沒有 namespace 呢? 所有駕駛員的「同步率」就會塞在一起,真嗣的同步率變成 40%,可能會直接覆蓋掉明日香的同步率,導致二號機出問題
資源管理: namespace 可以綁定配額,限制這個 namespace 底下的 Pod 最多用多少 CPU、Memory,防止某一組服務吃光 cluster 的資源
RBAC 的存取控制: 設定某個團隊的帳號,只能操作特定 namespace
在 Kubernetes 裡,Pod 本身的生命週期是短暫的,當刪掉一個 Pod,它裡面的資料也會跟著消失,並且Pod 重新建立後,IP、檔案系統可能都不一樣,這樣很不方便,特別是像資料庫(MySQL、PostgreSQL)、檔案上傳系統這種應用,如果沒有一個穩定的儲存空間,資料就會消失不見
那實際的建立順序呢? 會有兩種情況:
除了要跑應用程式的 Pod 以外,我們常常還需要一些「設定檔」或「環境變數」,像是資料庫的連線 string,API 的 URL,應用程式的 env,而 ConfigMap 可以讓我們把「設定」和「程式碼」分開,這樣應用程式要改設定時,不需要重建 image,只要更新 ConfigMap 就好
在 k8s 中,很常會需要存放敏感的資料,像是資料庫密碼,API Key,TLS certificate,如果直接硬寫在 YAML 裡,會很危險,Secret 預設會用 Base64 編碼存起來(如果未加密 etcd,Secret 的 Base64 編碼資料在 etcd 中仍然是可讀的),主要是避免在設定檔中明碼顯示,如果要提高安全性通常會搭配外部工具像是 HashiCorp Vault 或 KMS