kubernetes資源物件--deployment
本文基於kubernetes 1.5.2版本編寫
概念
Deployment(中文意思為部署、排程)提供了一種更加簡單的更新RC和Pod的機制,K8S版本1.2實現的。通過在Deployment中描述所期望的叢集狀態,Deployment Controller會將現在的叢集狀態在一個可控的速度下逐步更新成所期望的叢集狀態。Deployment主要職責同樣是為了保證pod的數量和健康,90%的功能與RC完全一樣,可以看做新一代的RC。
功能
Deployment集成了上線部署、滾動升級、建立副本、暫停上線任務,恢復上線任務,回滾到以前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment可以實現無人值守的上線,大大降低上線過程的複雜溝通、操作風險。
RC全部功能:Deployment繼承了RC全部功能。
事件和狀態檢視:可以檢視Deployment的升級詳細進度和狀態。
回滾:當升級pod映象或者相關引數時發現問題,可以使用回滾操作回滾到上一個穩定的版本或者指定的版本。
版本記錄:每次對Deployment的操作,都能儲存下來,給予後續可能的回滾使用。
暫停和啟動:對於每一次升級,都能夠隨時暫停和啟動。
多種升級方案:Recreate--刪除所有已存在的pod,重新建立新的; RollingUpdate--滾動升級,逐步替換的策略,同時滾動升級時,支援更多的附加引數,例如設定最大不可用pod數量,最小升級間隔時間等等。
使用場景
使用Deployment來啟動(上線/部署)一個Pod或者RS
檢查一個Deployment是否成功執行
更新Deployment來重新建立相應的Pods(例如,需要使用一個新的Image)
如果現有的Deployment不穩定,那麼回滾到一個早期的穩定的Deployment版本
暫停或者恢復一個Deployment
與RC比較,deployment的優勢
Deployment使用了RS,它是更高一層的概念。
RC只支援基於等式的selector(env=dev或environment!=qa),但RS還支援新的,基於集合的selector(version in (v1.0, v2.0)或env notin (dev, qa)),這對複雜的運維管理很方便。
使用Deployment升級Pod,只需要定義Pod的最終狀態,K8S會為你執行必要的操作,雖然能夠使用命令kubectl rolling-update完成升級,但它是在客戶端與服務端多次互動控制RC完成的,所以REST API中並沒有rolling-update的介面,這為定製自己的管理系統帶來了一些麻煩。
Deployment擁有更加靈活強大的升級、回滾功能。
常用命令
建立
使用子命令create,建立Deployment
kubectl create -f test-dpm.yaml --record
注意--record引數,使用此引數將記錄後續建立物件的操作,方便管理與問題追溯
檢視部署狀態
kubectl rolloutstatus deployment/lykops-dpm
kubectl describe deployment/lykops-dpm
升級
kubectl set image deployment/lykops-dpm lykops-dpm=app:v1
或者使用子命令edit,編輯spec.replicas/spec.template.spec.container.image欄位,完成deployment的擴縮容與滾動升級(這要比子命令rolling-update速度快很多)
暫定升級
kubectl rolloutpause deployment/lykops-dpm
繼續升級
kubectl rolloutresume deployment/lykops-dpm
回滾
kubectl rolloutundo deployment/lykops-dpm
檢視deployments版本
kubectl rollouthistory deployments
回滾到指定版本
kubectl rolloutundo deployment/lykops-dpm --to-revision=2
升級歷史
kubectl describedeployment/lykops-dpm
Name: lykops-dpm
Namespace: default
CreationTimestamp: Tue, 01 Aug 2017 16:56:45 +0800
Labels: app=lykops-dpm
project=lykops
software=apache
version=v1
Selector: app=lykops-dpm,name=lykops-dpm,project=lykops,software=apache,version=v1
Replicas: 3updated | 3 total | 3 available | 0 unavailable
StrategyType: Recreate
MinReadySeconds: 30
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: lykops-dpm-4183418831 (3/3 replicas created)
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaledup replica set lykops-dpm-2823415590 to 3
28m 28m 1 {deployment-controller } Normal ScalingReplicaSet Scaleddown replica set lykops-dpm-2823415590 to 0
28m 28m 1 {deployment-controller } Normal ScalingReplicaSet Scaledup replica set lykops-dpm-4001949646 to 3
26m 26m 1 {deployment-controller } Normal ScalingReplicaSet Scaleddown replica set lykops-dpm-4001949646 to 0
26m 26m 1 {deployment-controller } Normal ScalingReplicaSet Scaledup replica set lykops-dpm-4183418831 to 3
例子
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: lykops-dpm
labels:
software: apache
project: lykops
app: lykops-dpm
version: v1
spec:
replicas: 3 #副本數量
minReadySeconds: 30 #滾動升級時,容器準備就緒時間最少為30s
strategy:
type: recreate #升級方式
#rollingUpdate:##由於replicas為3,則整個升級,pod個數在2-4個之間
# maxSurge: 3 #滾動升級時會先啟動3個pod
# maxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數
selector:
matchLabels:
name: lykops-dpm
software: apache
project: lykops
app: lykops-dpm
version: v1
template:
metadata:
labels:
name: lykops-dpm
software: apache
project: lykops
app: lykops-dpm
version: v1
spec:
terminationGracePeriodSeconds: 60 ##k8s將會給應用傳送SIGTERM訊號,可以用來正確、優雅地關閉應用,預設為30秒
containers:
- name: lykops-dpm
image: web:apache
command: [ "sh", "/etc/run.sh" ]
ports:
- containerPort: 80
name: http
protocol: TCP
resources:
requests:
cpu: 0.05
memory: 16Mi
limits:
cpu: 0.1
memory: 32Mi
livenessProbe:#livenessProbe是K8S認為該pod是存活的,不存在則需要kill掉,然後再新啟動一個,以達到RS指定的個數。
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:#readinessProbe是K8S認為該pod是啟動成功的,這裡根據每個應用的特性,自己去判斷,可以執行command,也可以進行httpGet。
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
引數說明
strategy中的type
升級策略有recreate和rollingUpdate。recreate--刪除所有已存在的pod,重新建立新的; rollingUpdate--滾動升級,逐步替換的策略,同時滾動升級時,支援更多的附加引數,例如設定最大不可用pod數量,最小升級間隔時間等等。
如何使用哪種策略,需要看應用場景。recreate策略將會在升級過程中,停止服務,但會保證應用版本一致;使用rollingUpdate不會中斷服務,但會導致呼叫時出現應用版本不一致的情況,輸出內容不一致。
maxSurge與maxUnavailable
maxSurge: 1 表示滾動升級時會先啟動1個pod
maxUnavailable:1 表示滾動升級時允許的最大Unavailable的pod個數。由於replicas為3,則整個升級,pod個數在2-4個之間 terminationGracePeriodSeconds
k8s將會給應用傳送SIGTERM訊號,可以用來正確、優雅地關閉應用,預設為30秒。
如果需要更優雅地關閉,則可以使用k8s提供的pre-stop lifecycle hook 的配置宣告,將會在傳送SIGTERM之前執行。
livenessProbe與readinessProbe
livenessProbe是K8S認為該pod是存活的,不存在則需要kill掉,然後再新啟動一個,以達到RS指定的個數。
readinessProbe是K8S認為該pod是啟動成功的,這裡根據每個應用的特性,自己去判斷,可以執行command,也可以進行httpGet。比如對於使用java web服務的應用來說,並不是簡單地說tomcat啟動成功就可以對外提供服務的,還需要等待spring容器初始化,資料庫連線連線上等等。對於spring boot應用,預設的actuator帶有/health介面,可以用來進行啟動成功的判斷。
其中readinessProbe.initialDelaySeconds可以設定為系統完全啟動起來所需的最少時間,livenessProbe.initialDelaySeconds可以設定為系統完全啟動起來所需的最大時間+若干秒。