照慣例先來看看官網怎麼寫YAML吧~
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
咦?看起來和ReplicaSet差不多耶!?這樣為什麼需要這兩種物件呢?我們來看看兩者有什麼關係和差異吧~
ReplicaSet主要是負責控管Pod的數量,而Deployment是基於ReplicaSet再加上更靈活的更新Pod方式。
如果我們要建立一個Deployment,那會發生:
Deployment ⇒ ReplicaSet ⇒ Pod
建立Deployment後,Deployment會去建立ReplicaSet,而ReplicaSet會根據Replicas的數量來建立相對應的Pods。
之前提到要更新各種物件,有兩種方式,Imperative和Declarative。後者就是先告知我們的目標,無論系統會怎麼幫我們完成,只在乎結果。主要的方法就是直接更改YAML,無論是要用edit指令,還是要編輯YAML檔後再apply,兩者都可以。
我們現在來介紹Imperative way~
# 更新image
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
# 查看更新狀況
kubectl rollout status deployment/nginx-deployment
# 查看更新歷史
kubectl rollout history deployment/nginx-deployment
# 暫停更新
kubectl rollout pause deployment/nginx-deployment
# 恢復更新
kubectl rollout resume deployment/nginx-deployment
# 回到前一個版本
kubectl rollout undo deployment/nginx-deployment
# 更改replicas的數量
kubectl scale deployment/nginx-deployment --replicas=10
Deployment的更新策略,可以加在.spec.strategy.type的欄位,有兩種: