RS 與 RC 與 Deployment 關聯
RC (ReplicationController )主要的作用就是用來確保容器應用的副本數始終保持在用戶定義的副本數 。即如 果有容器異常退出,會自動創建新的Pod來替代;而如果異常多出來的容器也會自動回收
Kubernetes 官方建議使用 RS(ReplicaSet ) 替代 RC (ReplicationController ) 進行部署,RS 跟 RC 沒有 本質的不同,只是名字不一樣,並且 RS 支持集合式的 selector
RS(ReplicaSet )創建
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 2
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: myapp
image: wangyanglinux/myapp:v1
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
rs這個創建pod有點慢
查看pod的標簽
kubectl get pod --show-labels
修改pod的標簽
kubectl label pod frontend-dtx7t tier=frontend1 --overwrite=True
刪除rs
kubectl delete rs --all
RS 與 Deployment 的關聯
Deployment 為 Pod 和 ReplicaSet 提供了一個聲明式定義(declarative)方法,用來替代以前的 ReplicationController 來方便的管理應用。典型的應用場景包括:
- 定義Deployment來創建Pod和ReplicaSet
- 滾動升級和回滾應用
- 擴容和縮容
- 暫停和繼續Deployment
Ⅰ、部署一個簡單的 Nginx 應用
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: wangyanglinux/myapp:v1
ports:
- containerPort: 80
kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record
## --record參數可以記錄命令,我們可以很方便的查看每次 revision 的變化
創建
kubectl apply -f deploy.yaml --record
顯示標簽
kubectl get pod --show-labels
Ⅱ、擴容
kubectl scale deployment nginx-deployment --replicas 10
Ⅲ、如果集群支持 horizontal pod autoscaling 的話,還可以為Deployment設置自動擴展
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
Ⅳ、更新鏡像也比較簡單
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
Ⅴ、回滾
kubectl rollout undo deployment/nginx-deployment
更新 Deployment
假如我們現在想要讓 nginx pod 使用 nginx:1.9.1 的鏡像來代替原來的 nginx:1.7.9 的鏡像
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment "nginx-deployment" image updated
可以使用 edit 命令來編輯 Deployment
$ kubectl edit deployment/nginx-deployment
deployment "nginx-deployment" edited
查看 rollout 的狀態
$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
查看歷史 RS
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-1564180365 3 3 0 6s
nginx-deployment-2035384211 0 0 0 36s
Deployment 更新策略
Deployment 可以保證在升級時只有一定數量的 Pod 是 down 的。默認的,它會確保至少有比期望的Pod數量少 一個是up狀態(多一個不可用)
Deployment 同時也可以確保只創建出超過期望數量的一定數量的 Pod。默認的,它會確保多比期望的Pod數 量多一個的 Pod 是 up 的(多1個 surge )
未來的 Kuberentes 版本中,將從1-1變成25%-25%
kubectl describe deployments
Rollover(多個rollout並行)
假如您創建了一個有5個 niginx:1.7.9 replica的 Deployment,但是當還只有3個 nginx:1.7.9 的 replica 創建 出來的時候您就開始更新含有5個 nginx:1.9.1 replica 的 Deployment。在這種情況下,Deployment 會立即 殺掉已創建的3個 nginx:1.7.9 的 Pod,並開始創建 nginx:1.9.1 的 Pod。它不會等到所有的5個 nginx:1.7.9 的 Pod 都創建完成后才開始改變航道
回退 Deployment
kubectl set image deployment/nginx-deployment nginx=nginx:1.91
kubectl rollout status deployments nginx-deployment
kubectl get pods
kubectl rollout history deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=2 ## 可以使用 --revision參數指定
某個歷史版本
kubectl rollout pause deployment/nginx-deployment ## 暫停 deployment 的更新
您可以用 kubectl rollout status 命令查看 Deployment 是否完成。如果 rollout 成功完成, kubectl rollout status 將返回一個0值的 Exit Code
$ kubectl rollout status deploy/nginx
Waiting for rollout to finish: 2 of 3 updated replicas are available...
deployment "nginx" successfully rolled out
$ echo $?
0
清理 Policy
您可以通過設置 .spec.revisonHistoryLimit 項來指定 deployment 多保留多少 revision 歷史記錄。默認的會 保留所有的 revision;如果將該項設置為0,Deployment 就不允許回退了