Kubernetes對象
在Kubernetes中,對象是持久化到etcd中的實體,使用這些對象的狀態來表示集群的狀態。
創建對象本質上是告知k8s系統期望工作負載是什么樣子的,稱為期望狀態(Desired State)。
操作k8s對象本身就是通過Kubernetes API操作etcd中對象的狀態。
對象規格與狀態(Object Spec and Status)
絕大多數k8s的對象都包含兩部分,分別為 期望狀態(Spec)
與 實際狀態(Status)
,Spec 是用戶設置的期望狀態;而Status由k8s系統提供,由k8s系統設置。
當Spec 與 Status 不一致時,控制平面會啟動新的 Pod 以匹配期望狀態。
以一個簡單的 nginx-deployment
舉例(暫不關心內容):
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
通過kubectl diff -f nginx-deployment
,我們可以看到spec與status處於平級關系:
kubectl diff
命令不是真的去應用配置文件,而是展示應用后會如何,后續有時間介紹kubectl的常用命令
用yaml描述Kubernetes對象
當需要創建k8s對象時,必須提供對象的期望狀態,包含此對象的基本信息(如,名稱等)。這些描述信息要被Kubernetes API接收,都需要轉換成 JSON的請求體。一般而言,對於kubectl使用的是yaml格式的文件,kubectl 會將其轉換為JSON發送到 Kubernetes API
還用剛才的文件nginx-deployment.yaml
進行舉例,以展示Kubernetes Deployment的必要字段:
apiVersion: apps/v1 #創建此對象使用的Kubernetes API版本
kind: Deployment #對象類型
metadata: #唯一標識對象,常包含name、UID和可選的namespace
name: nginx-deployment #對象名稱唯一標識
spec: #期望狀態
selector: #label選擇器
matchLabels:
app: nginx #匹配的標簽
replicas: 2 #副本數,告知k8s集群要創建幾個當前對象的pod
template: #根據此模板創建Pod副本
metadata:
labels:
app: nginx #Pod副本的標簽,可用於Service匹配
spec:
containers: #Pod內容器定義部分
- name: nginx #容器名稱
image: nginx:1.14.2 #docker鏡像
ports:
- containerPort: 80 #容器內占用的端口號
通過kubectl
創建Deployment類型對象到集群
kubectl apply -f nginx-deployment.yaml
每個描述k8s對象的yaml文件,都需要設置四個字段:
apiVersion
:創建此對象使用的Kubernetes API版本kind
:創建對象類型metadata
:對象唯一標識設置spec
:期望狀態
更多關於配置spec,可以參考官方文檔相關類型的部分