Pod控制器之Deployment
簡介:
Deployment 是 Kubernetes v1.2 引入的新概念跟匆,引入的目的是為了更好的解決 Pod 的編排問題琼梆。為此妙真,Deployment 在內(nèi)部使用了 Replica Set 來實現(xiàn)目的领猾,無論從 Deployment 的作用與目的破停、它的 YAML 定義,還是從它的具體命令操作來看乎赴,都可以把它看做 RC 的一次升級兩者的相似度超過 90%忍法。
Deplyment 相對于 RC 的嘴個最大升級時可以隨時知道當前 Pod “部署” 的進度。實際上由于一個 Pod 的創(chuàng)建榕吼、調(diào)度饿序、綁定節(jié)點以及在目標 Node 上啟動對應的容器這一完整過程需要一定的時間,所以期待系統(tǒng)啟動 N 個 Pod 副本的目標狀態(tài)羹蚣,實際上是一個連續(xù)變化的 “部署過程” 導致的最終狀態(tài)原探。
Deployment 的典型使用場景有以下幾個。
創(chuàng)建一個 Deployment 對象來生成對應的 Replica Set 并完成 Pod 副本的創(chuàng)建過程顽素。
檢查 Deployment 的狀態(tài)來部署動作是否完成(Pod 副本的數(shù)量是否達到預期的值)咽弦。
更新 Deployment 以創(chuàng)建新的 Pod(比如鏡像升級)。
如果當前 Deployment 不穩(wěn)定胁出,則回滾到一個早先的 Deployment 版本离唬。
暫停 Deployment 以便于下一次性修改多個 PotTemplateSpec 的配置項,之后再回復 Deployment划鸽,進行新的發(fā)布。
擴展 Deployment 以應對高負載。
查看 Deployment 的狀態(tài)裸诽,以此作為發(fā)布是否完成的指標嫂用。
清理不在需要的舊版本 ReplicaSets。
Deployment 的定義與 Replica Set 的定義很類似丈冬,除了 API 聲明與 Kind 類型等有所區(qū)別:
ReplicaSet:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-repset
Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
創(chuàng)建一個Deployment
vim deploy-daem.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-myapp
namespace: default
spec:
replicas:2
selector:
matchLabels:
app: myapp
release: cancay
template:
metadata:
labels:
app:myapp
release: cancay
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
deploy實現(xiàn)更新應用時可以直接通過編輯配置文件來實現(xiàn)嘱函,直接修改配置文件中的replicas的數(shù)量然后使用apply創(chuàng)建,apply可以執(zhí)行多次埂蕊,create只能創(chuàng)建一次往弓,apply可以把每一次的變化同步到etcd當中或者同步到apiserver當中,apiserver發(fā)現(xiàn)它與etcd中不同從而改變etcd從而實現(xiàn)他的期望狀態(tài)
--record參數(shù)可以記錄當前版本的Deployment都執(zhí)行過哪些命令蓄氧。
使用patch命令打補定的方式擴容
[root@k8s-master daem]# kubectl patch deployments.apps deploy-myapp -p '{"spec":{"replicas": 5}}'
deployment.apps/deploy-myapp patched
[root@k8s-master daem]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-myapp-74c58c54f5-4bh62 1/1 Running 0 5m55s
deploy-myapp-74c58c54f5-dnsx5 1/1 Running 0 5m52s
deploy-myapp-74c58c54f5-vn6b9 1/1 Running 0 7s
deploy-myapp-74c58c54f5-wjpwn 1/1 Running 0 5m54s
deploy-myapp-74c58c54f5-zfk74 1/1 Running 0 7s
liveness-httpget 1/1 Running 3 2d5h
poststart-pod 1/1 Running 7 6h2m
readiness-httpget-pods 1/1 Running 2 2d4h
使用set image方式更新版本
使用打補丁的方式修改更新策略
[root@k8s-master daem]# kubectl patch deployments.apps deploy-myapp -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge": 1,"maxUnavailable":0}}}}'
deployment.apps/deploy-myapp patched
[root@k8s-master daem]# kubectl set image deploy deploy-myapp myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment deploy-myapp
deployment.apps/deploy-myapp image updated
deployment.apps/deploy-myapp paused
因為使用了pause參數(shù)暫停了更新只更新一個函似,會一直暫停下去,成為金絲雀發(fā)布喉童,
監(jiān)控觀察:
也可以通過kubectl rollout status deployment deploy-myapp監(jiān)測
等確認好沒有問題就繼續(xù)更新撇寞,使用kubectl rollout resume 繼續(xù)更新
kubectl rollout resume deployment deploy-myapp
使用rollout undo版本回滾:
undo默認是回滾到上一個版本 如果需要回滾到更早的版本可以使用--to-revision參數(shù)在指定回滾的版本號
[root@k8s-master ~]# kubectl rollout undo deployment deploy-myapp --to-revision=1
deployment.apps/deploy-myapp rolled back
回滾到第一版
查看rs已經(jīng)回滾到第一版了