K8s對象是什么?
K8s對象是K8s系統中的持久實體,用來表示集群的狀態。
K8s對象是“意圖的記錄”——創建對象后K8s會不斷工作以保證該對象存在。通過創建K8s對象,K8s可以明白你希望集群怎么樣運作。
對象的規范(spec)和狀態(status)
幾乎所有K8s對象都包含兩個嵌套的對象字段,用于管理對象的配置: spec
、status
。
spec
是一個規范,在創建對象的時候我們需要設置它,用來描述我們希望它是一個什么狀態(即希望資源具有的特征的描述)。
status
描述對象的當前狀態,這個狀態由K8s系統及其部件供給和更新。K8s的控制平面control plane
持續積極管理每個對象的實際狀態status
,將它匹配所需的狀態spec
。
舉個例子:在K8s中,一個部署Deployment
是一個對象,代表運行在集群上的應用程序。創建部署Deployment
的時候,可以將spec
設置為指定要運行應用程序的三個副本。Kubernetes 系統讀取部署規范Deployment spec
并啟動所需應用程序的三個實例——更新狀態 status
以匹配您的規范spec
。如果這些實例中的任何一個失敗(狀態更改),Kubernetes 系統會通過進行更正來響應規范和狀態之間的差異——在這種情況下,啟動一個替換實例。
創建K8s對象
上面提到創建K8s對象時,必須描述對象所需的對象規范spec
,除此以外還要有該對象的一些基本信息(例如名稱)。使用K8s API創建對象時(直接創建或通過kubectl),API請求中必須包含前面所說的需要的信息,將信息作為JSON包含在請求中。大多數情況下,我們將在.yaml文件中向kubectl提供信息。kubectl在發出請求時將信息轉換為JSON。
示例.yaml
文件(包含所需字段和對象規范):
apiVersion: apps/v1
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
必填字段:
-
apiVersion
-使用哪個版本的K8s API創建此對象 -
kind
-創建哪個類型的對象 -
metadata
-能唯一標識對象的數據,包括name
字符串UID
、和可選namespace
-
spec
-規范,即你希望對象應有的狀態
在.yaml
文件中填好以上內容后,可以通過在kubectl
命令行界面中使用kubectl apply
命令,將.yaml
文件作為參數傳遞。
例如:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
其中https://k8s.io/examples/application/deployment.yaml
是.yaml
所在的位置。
輸出類似于:
deployment.apps/nginx-deployment created