要玩叢集都是錢坑,在開始燒錢之前,最好先熟悉下列觀念和術語,避免在操駕時手忙腳亂。
以下會列出一些叢集維運需的術語進行基本介紹,對應日常可能需要進行的工作,針對這些工作進行說明。
怕文謅謅,看不完,在此先聲明,底下只有說明幾件事情
- YAML 格式
- 常用的四種工作負載 (Workload)
kubectl get 某某資源 -n 某某命名空間 某某名稱的資源 -o yaml
,你會得到類似下面這串東西。kubectl apply -f 某某.yaml
也能把希望進行管理的設定套用到叢集上,則格式如下。apiVersion: <API 群組/版本> # 定義資源的 API 版本
kind: <資源類型> # 定義要建立的資源類型 (Pod, Deployment, Service, Route…)
metadata: # 資源的中繼資料
name: <名稱> # 必填:資源名稱
namespace: <命名空間> # (選填,預設 default / OCP 建議使用 Project)
labels: # (選填) 可用於篩選與分組
app: myapp
annotations: # (選填) 註解/額外資訊
description: "示範應用"
spec: # 資源的規格定義 (各種資源都不同)
... # 依照資源類型不同而不同
status: # (系統自動生成,不需定義)
...
apiVersion
→ 指定 API 群組與版本
kind
→ 指定資源類型
Pod
、Service
、Deployment
、ConfigMap
、Secret
、Route
metadata
→ 必須要有 name
,至於 namespace
可有可無
labels
與 annotations
用來過濾資源spec
→ 定義資源的期望狀態 (Desired State)
status
→ 系統自動維護,不需要寫來看看 K8s 提供的幾個常見的工作負載(Workload)。
建議先打開參考資料: https://kubernetes.io/docs/concepts/workloads/
Pod: 書上、文件上都寫,這是 「K8s 中運作的最小單位」,由一個或是一組容器構成。
共享資源觀念:同一組 Pod 中的那票容器,可以共享網路和掛載的儲存。 基於這個特性,去定義容器先後、平行運作等機制,分別可以作為 initContainer (先用容器鋪路、再執行主要容器)、 side car container (邊車配角,可能是用來記錄 log 或是當成資料庫使用)
文件裡面還有一大票內容,不過之後有用到再說吧。
Deployment: 希望部署 Pod 的方式 -> 「部署」這件事,跟 「數量、生命週期、升級策略」 相關。 通常用來管理 Pod 的生命週期、版本調整升降級、橫向擴充或縮小。
Deployment 用來管理生命週期:
建立 (Create) → 當 replicas 增加時,建立新的 Pod
刪除 (Delete) → 當 replicas 減少時,刪除多餘的 Pod
自動修復 (Self-healing) → Pod Crash / Node Down 時,自動重新排程 Pod
更新 (Rolling Update) → 更換 Pod 版本時,逐步替換舊 Pod,避免服務中斷
回滾 (Rollback) → 若更新失敗,可回到前一版本
# 手動調整
kubectl scale deployment myapp --replicas=5
# 自動調整
kubectl autoscale deployment myapp --min=2 --max=10 --cpu-percent=80
Service: 希望 Pod 如何提供服務給老百姓 -> 提供「服務」,勢必是跟 「網路」 掛勾在一起。
ConfigMap: 希望 Pod 使用的 Config -> 送進去給 容器、送給 Pod 使用的參數。
docker run -it xxx -v /abc:/mount/xyz -e password:Hahahacker yyy:latest
之類的經驗,應該可以從管理和提升營運規模的角度,去理解 kubectl
的工作負載設計。