Kubernetes學習筆記—002理解 Kubernetes 對象
本頁說明了 Kubernetes 對象在 Kubernetes API 中是如何表示的,以及如何在 .yaml
格式的文件中表示。
理解 Kubernetes 對象
在 Kubernetes 系統中,Kubernetes 對象 是持久化的實體。Kubernetes 使用這些實體去表示整個集羣的狀態。特別地,它們描述瞭如下信息:
- 哪些容器化應用在運行(以及在哪個 Node 上)
- 可以被應用使用的資源
- 關於應用運行時表現的策略,比如重啓策略、升級策略,以及容錯策略
Kubernetes 對象是 “目標性記錄” —— 一旦創建對象,Kubernetes 系統將持續工作以確保對象存在。通過創建對象,本質上是在告知 Kubernetes 系統,所需要的集羣工作負載看起來是什麼樣子的,這就是 Kubernetes 集羣的 期望狀態(Desired State)。
操作 Kubernetes 對象 —— 無論是創建、修改,或者刪除 —— 需要使用 Kubernetes API。比如,當使用 kubectl
命令行接口時,CLI 會執行必要的 Kubernetes API 調用,也可以在程序中使用 客戶端庫(開源管理工具) 直接調用 Kubernetes API。
對象規約(Spec)與狀態(Status)
每個 Kubernetes 對象包含兩個嵌套的對象字段,它們負責管理對象的配置:對象 spec 和 對象 status 。 spec 是必需的,它描述了對象的 期望狀態(Desired State) —— 希望對象所具有的特徵。 status 描述了對象的 實際狀態(Actual State) ,它是由 Kubernetes 系統提供和更新的。在任何時刻,Kubernetes 控制面一直努力地管理着對象的實際狀態以與期望狀態相匹配。
例如,Kubernetes Deployment 對象能夠表示運行在集羣中的應用。 當創建 Deployment 時,可能需要設置 Deployment 的規約,以指定該應用需要有 3 個副本在運行。 Kubernetes 系統讀取 Deployment 規約,並啓動我們所期望的該應用的 3 個實例 —— 更新狀態以與規約相匹配。 如果那些實例中有失敗的(一種狀態變更),Kubernetes 系統通過修正來響應規約和狀態之間的不一致 —— 這種情況,會啓動一個新的實例來替換。
描述 Kubernetes 對象
當創建 Kubernetes 對象時,必須提供對象的規約,用來描述該對象的期望狀態,以及關於對象的一些基本信息(例如名稱)。 當使用 Kubernetes API 創建對象時(或者直接創建,或者基於kubectl
),API 請求必須在請求體中包含 JSON 格式的信息。 大多數情況下,需要在 .yaml 文件中爲 kubectl
提供這些信息。 kubectl
在發起 API 請求時,將這些信息轉換成 JSON 格式。
這裏有一個 .yaml
示例文件,展示了 Kubernetes Deployment 的必需字段和對象規約:
application/deployment.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
使用類似於上面的 .yaml
文件來創建 Deployment,一種方式是使用 kubectl
命令行接口(CLI)中的 kubectl apply
命令, 將 .yaml
文件作爲參數。下面是一個示例:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
輸出類似如下這樣:
deployment.apps/nginx-deployment created
必需字段
在想要創建的 Kubernetes 對象對應的 .yaml
文件中,需要配置如下的字段:
apiVersion
- 創建該對象所使用的 Kubernetes API 的版本kind
- 想要創建的對象的類型metadata
- 幫助識別對象唯一性的數據,包括一個name
字符串、UID 和可選的namespace