Deployment副本無狀態(tài)服務(wù)創(chuàng)建及水平擴展
本文單詞:
replace(/r??ple?s/)替換、取代;在本文中是修改后的yaml文件替換舊的yaml文件
rollout(/ɑ?®/)記錄;在本文中是記錄歷史的deploy副本版本
describe(/d??skra?b/)描述;在本文中是說記錄過程
scale(/ske?l/)縮放;在本文中是說縮放副本的個數(shù)
pause(/p??z/)暫停;在本文中是說暫停更新
resume(/r??zju?m/)恢復(fù);在本文中是說從暫?;謴?fù)到正常狀態(tài)
RC(Replication Controller)和RS(ReplicaSet)
(幾乎棄用)RC是復(fù)制控制器,確保Pod數(shù)量達(dá)到期望值,保證副本始終處于可用的狀態(tài)。
(不建議單獨使用)RS是RC的下一代,支持標(biāo)簽集。
無狀態(tài)服務(wù)Deployment意思就是無狀態(tài)的。。。用于部署無狀態(tài)的服務(wù)。
類似網(wǎng)頁訪問之類的請求就是無狀態(tài)的,每次請求都包含了需要的所有信息,每次請求都和上次沒有關(guān)系。
Deployment是最常用的控制器。一般用于管理維護企業(yè)內(nèi)部的無狀態(tài)的微服務(wù),比如configserver、zuul、springboot??梢怨芾矶鄠€副本的Pod實現(xiàn)無縫遷移、自動擴容縮容、自動災(zāi)難恢復(fù)、一鍵回滾等功能。
deployment的創(chuàng)建
可以通過命令創(chuàng)建一個Deployment:
kubectl create deployment nginx --image=nginx:1.20.2
可以將創(chuàng)建的副本生成yaml文件:
kubectl get deployment nginx -o yaml > nginx.yaml
然后可以修改yaml文件的參數(shù),然后重新加載新的yaml文件:
kubectl replace -f nginx.yaml
也可以通過在線修改yaml文件,退出后直接生效:
kubectl edit deploy nginx
從yaml文件生成deployment:
apiVersion: v1
items:
- apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "2"
creationTimestamp: "2022-02-08T07:52:05Z"
generation: 2
labels:
app: nginx
name: nginx
namespace: default
resourceVersion: "266395"
uid: d4a3dbe9-5156-42cf-aaf5-3dfefccf4753
spec:
progressDeadlineSeconds: 600
replicas: 1 # 副本數(shù)
revisionHistoryLimit: 10 # 保留歷史的版本
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.18.0
imagePullPolicy: Always
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2022-02-08T07:52:10Z"
lastUpdateTime: "2022-02-08T07:52:10Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2022-02-08T07:52:05Z"
lastUpdateTime: "2022-02-08T07:55:54Z"
message: ReplicaSet "nginx-86dddd6686" is progressing.
reason: ReplicaSetUpdated
status: "True"
type: Progressing
observedGeneration: 2
readyReplicas: 1
replicas: 2
unavailableReplicas: 1
updatedReplicas: 1
kind: List
metadata:
resourceVersion: ""
selfLink: ""
deployment狀態(tài)說明:
[root@k8s-master01 ~]# kubectl get deployments.apps -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR mynginx 1/1 1 1 4d5h mynginx nginx k8s-app=mynginx
NAME:Deployment名稱
READY:Pod的狀態(tài),已經(jīng)達(dá)到Ready的個數(shù)
UP-TO-DATE:已經(jīng)達(dá)到期望狀態(tài)的副本數(shù)
AVAILABLE:已經(jīng)可以使用的個數(shù)
AGE:程序運行的時間
CONTAINERS:容器的自定義名稱
IMAGES:容器鏡像名稱
SELECTOR:管理的Pod標(biāo)簽
deployment的升級
查看創(chuàng)建nginx的deploy中鏡像的版本:可以看到是1.18.0
[root@k8s-master01 ~]# kubectl get deploy -o yaml | grep image
- image: nginx:1.18.0
imagePullPolicy: Always
我們可以使用set命令更新鏡像的版本:這里的set是設(shè)置的意思。
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.20.2 --record
[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image
kubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true
- image: nginx:1.20.2
imagePullPolicy: Always
可以使用下列命令查看升級過程:
[root@k8s-master01 ~]# kubectl rollout status deployment nginx [root@k8s-master01 ~]# kubectl describe deployments.apps nginx
升級過程大概為:創(chuàng)建deploy時,系統(tǒng)也會同時創(chuàng)建depoly的RS,更新deploy時,系統(tǒng)會增加一個新的RS,舊的RS會相應(yīng)減少1,直到替換完成。
deployment的回滾
deployment的回滾可以回滾到上個版本,也可以回滾到指定指定版本,歷史版本的數(shù)量由下面這個參數(shù)控制:
revisionHistoryLimit: 10
查看歷史版本:可以看到副本發(fā)生了幾次變化
[root@k8s-master01 ~]# kubectl rollout history deployment nginx deployment.apps/nginx REVISION CHANGE-CAUSE 8 kubectl set image deploy nginx nginx=1.18.1 --record=true 9 kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true
回滾到上一個版本:undo是撤銷的意思(我的理解是撤銷現(xiàn)在的版本回到之前的版本)
[root@k8s-master01 ~]# kubectl rollout undo deployment nginx deployment.apps/nginx rolled back
查看已經(jīng)由1.20.2回到了1.18.0版本:
[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image
kubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true
- image: nginx:1.18.0
imagePullPolicy: Always
如果多次發(fā)布,回滾到指定版本:
[root@k8s-master01 ~]# kubectl rollout history deployment nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
9 kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true
10 kubectl set image deploy nginx nginx=1.18.1 --record=true
您在 /var/spool/mail/root 中有新郵件
[root@k8s-master01 ~]# kubectl rollout history deployment nginx --revision=9
deployment.apps/nginx with revision #9
Pod Template:
Labels: app=nginx
pod-template-hash=67d5b4548c
Annotations: kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true
Containers:
nginx:
Image: nginx:1.20.2
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
[root@k8s-master01 ~]# kubectl rollout undo deployment nginx --to-revision=9
deployment.apps/nginx rolled back
[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image
kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2
- image: nginx:1.20.2
imagePullPolicy: Always
可以看到以上信息版本已經(jīng)回滾到1.20.2版本;另外就算更新時候失敗,新鏡像拉取失敗,舊的副本不會停止工作,會一直持續(xù)工作,直到升級成功。
deployment的擴容和縮容
使用命令擴容:將nginx副本由一個變成兩個,注意擴容RS不會發(fā)生變化,因為Pod的本質(zhì)沒有發(fā)生改變。scale這個單詞在這里是縮放的意思。
[root@k8s-master01 ~]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 17h [root@k8s-master01 ~]# kubectl scale --replicas=2 deployment nginx deployment.apps/nginx scaled [root@k8s-master01 ~]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx 2/2 2 2 17h
deployment的更新暫停及恢復(fù)
更新暫停:這條命令的作用是將更新暫停后,你使用kubectl set命令修改Pod的配置后不會立刻生效,即使多次修改也只是積累起來不會馬上生效。
[root@k8s-master01 ~]# kubectl rollout pause deployment nginx
暫?;謴?fù):解除之前的更新暫停功能,在暫停期間做過的修改將都會生效
[root@k8s-master01 ~]# kubectl rollout resume deployment nginx
deployment的注意項
- .spec.revisionHistoryLimit: 10:設(shè)置保留RS的舊的版本的個數(shù),為0的話不保存
- .spec.minReadySeconds:可選,指定新創(chuàng)建的Pod在沒有任何容器崩潰的情況下是為Ready的最小秒數(shù),默認(rèn)為0,就是一但創(chuàng)建就被視為可用
滾動更新的策略:就是創(chuàng)建一個新的Pod,然后刪除一個舊的Pod,用新的替換舊的。
spec.strategy.type:更新deploy的方式,默認(rèn)是RollingUpdate
RollingUpdate:滾動更新,可以指定maxSurge和maxUnavailable
maxUnavailable:指定在回滾或更新時最大不可用的Pod數(shù)量,默認(rèn)25%,也可以設(shè)置數(shù)字;如果為0那么maxSurge就不能為0 。
maxSurge:可以超過期望值的的最大Pod數(shù),可選,默認(rèn)為25%。如果為0那maxUnavailable就不能為0 。
Recreate:重建,先刪除舊的Pod,在創(chuàng)建新的Pod。
以上就是Deployment副本無狀態(tài)服務(wù)及水平擴展的詳細(xì)內(nèi)容,更多關(guān)于Deployment無狀態(tài)服務(wù)擴展的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php.ini 啟用disable_functions提高安全
如果想保證服務(wù)器的安全,請將這個函數(shù)加到disable_functions里或者將安全模式打開吧,在安全模式下dl函數(shù)是無條件禁止的2009-07-07
MongoDB學(xué)習(xí)筆記(二) 通過samus驅(qū)動實現(xiàn)基本數(shù)據(jù)操作
傳統(tǒng)的關(guān)系數(shù)據(jù)庫一般由數(shù)據(jù)庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由(database)、集合(collection)、文檔對象(document)三個層次組成2013-07-07
手把手教你低成本獲取AlphaSSL通配符泛域名SSL證書2024仍可用
AlphaSSL 是著名數(shù)字證書認(rèn)證機構(gòu)和SSL證書簽發(fā)商 GlobalSign 旗下的證書品牌,這篇文章主打手把手教你低成本獲取AlphaSSL通配符泛域名SSL證書,需要的朋友可以參考下2024-02-02
win2003服務(wù)器一招廢掉所有木馬(防提權(quán))
木馬的危害,在于它能夠遠(yuǎn)程控制你的電腦。當(dāng)你成為“肉雞”的時候,別人(控制端)就可以進入你的電腦,偷看你的文件、盜竊密碼、甚至用你的QQ發(fā)一些亂七八糟的東西給你的好友2012-03-03
配置管理和服務(wù)發(fā)現(xiàn)之Confd和Consul使用場景詳解
這篇文章主要為大家介紹了配置管理和服務(wù)發(fā)現(xiàn)之Confd和Consul使用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03

