視頻教程連接:kubernetes快速入門
寫在前面
前面的文章我們深入介紹了Pod的使用移剪,包括Pod定義简识,Pod資源管理和服務(wù)質(zhì)量,Pod健康檢查舍咖,Pod存儲管理,Pod調(diào)度劳跃,當(dāng)Pod所在的node異常時谎仲,Pod無法自動恢復(fù),因此Pod很少單獨使用刨仑,一般以template的形式嵌套在控制器中使用郑诺,下來介紹kubernetes系列教程副本控制器Deployment,ReplicaSet杉武,ReplicationController的使用辙诞。
1. 深入學(xué)習(xí)控制器
1.1 控制器概述
Pod是kubernetes所有運行應(yīng)用或部署服務(wù)的基礎(chǔ),可以看作是k8s中運行的機器人轻抱,應(yīng)用單獨運行在Pod中不具備高級的特性飞涂,比如節(jié)點故障時Pod無法自動遷移,Pod多副本橫向擴(kuò)展祈搜,應(yīng)用滾動升級RollingUpdate等较店,因此Pod一般不會單獨使用,需要使用控制器來實現(xiàn)容燕。
我們先看一個概念ReplicationController副本控制器梁呈,簡稱RC,副本控制是實現(xiàn)Pod高可用的基礎(chǔ)蘸秘,其通過定義副本的副本數(shù)replicas官卡,當(dāng)運行的Pod數(shù)量少于replicas時RC會自動創(chuàng)建Pod蝗茁,當(dāng)Pod數(shù)量多于replicas時RC會自動刪除多余的Pod,確保當(dāng)前運行的Pod和RC定義的副本數(shù)保持一致寻咒。
副本控制器包括Deployment哮翘,ReplicaSet,ReplicationController毛秘,StatefulSet等饭寺。其中常用有兩個:Deployment和StatefulSet,Deployment用于無狀態(tài)服務(wù)熔脂,StatefulSet用于有狀態(tài)服務(wù)佩研,ReplicaSet作為Deployment后端副本控制器柑肴,ReplicationController則是舊使用的副本控制器霞揉。
為了實現(xiàn)不同的功能,kubernetes中提供多種不同的控制器滿足不同的業(yè)務(wù)場景晰骑,可以分為四類:
- Stateless application無狀態(tài)化應(yīng)用适秩,如Deployment,ReplicaSet硕舆,RC等秽荞;
- Stateful application有狀態(tài)化應(yīng)用,需要保存數(shù)據(jù)狀態(tài)抚官,如數(shù)據(jù)庫扬跋,數(shù)據(jù)庫集群;
- Node daemon節(jié)點支撐守護(hù)凌节,適用于在所有或部分節(jié)點運行Daemon钦听,如日志,監(jiān)控采集倍奢;
- Batch批處理任務(wù)朴上,非長期運行服務(wù),分為一次性運行Job和計劃運行CronJob兩種卒煞。
本文我們主要介紹無狀態(tài)服務(wù)副本控制器的使用痪宰,包括Deployment,ReplicaSet和ReplicationController畔裕。
1.2 Deployment
Deployment是實現(xiàn)無狀態(tài)應(yīng)用副本控制器衣撬,其通過declarative申明式的方式定義Pod的副本數(shù),Deployment的副本機制是通過ReplicaSet實現(xiàn)扮饶,replicas副本的管理通過在ReplicaSet中添加和刪除Pod具练,RollingUpdate通過新建ReplicaSet,然后逐步移除和添加ReplicaSet中的Pod數(shù)量贴届,從而實現(xiàn)滾動更新靠粪,使用Deployment的場景如下:
- 滾動升級RollingUpdate蜡吧,后臺通過ReplicaSet實現(xiàn)
- 多副本replicas實現(xiàn),增加副本(高負(fù)載)或減少副本(低負(fù)載)
- 應(yīng)用回滾Rollout占键,版本更新支持回退
1.2.1 Deployment定義
- 我們定義一個Deployment昔善,副本數(shù)為3,Pod以模版Template的形式封裝在Deployment中畔乙,為了結(jié)合之前Pod學(xué)習(xí)內(nèi)容君仆,我們增加了resource和健康檢查的定義,具體實現(xiàn)參考前面介紹的文章牲距。
[root@node-1 happylau]# cat deployment-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata: #Deployment的元數(shù)據(jù)信息返咱,包含名字,標(biāo)簽
name: deployment-nginx-demo
labels:
app: nginx
rc: deployment
annotations:
kubernetes.io/replicationcontroller: Deployment
kubernetes.io/description: "ReplicationController Deployment Demo"
spec:
replicas: 3 #副本數(shù)量牍鞠,包含有3個Pod副本
selector: #標(biāo)簽選擇器咖摹,選擇管理包含指定標(biāo)簽的Pod
matchLabels:
app: nginx
rc: deployment
template: #如下是Pod的模板定義,沒有apiVersion难述,Kind屬性萤晴,需包含metadata定義
metadata: #Pod的元數(shù)據(jù)信息,必須包含有l(wèi)abels
labels:
app: nginx
rc: deployment
spec: #spec指定容器的屬性信息
containers:
- name: nginx-deployment
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports: #容器端口信息
- name: http-80-port
protocol: TCP
containerPort: 80
resources: #資源管理,requests請求資源胁后,limits限制資源
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
livenessProbe: #健康檢查器livenessProbe店读,存活檢查
httpGet:
path: /index.html
port: 80
scheme: HTTP
initialDelaySeconds: 3
periodSeconds: 5
timeoutSeconds: 2
readinessProbe: #健康檢查器readinessProbe,就緒檢查
httpGet:
path: /index.html
port: 80
scheme: HTTP
initialDelaySeconds: 3
periodSeconds: 5
timeoutSeconds: 2
Deployment字段說明:
- deployment基本屬性攀芯,包括apiVersion,Kind,metadata和spec屯断,其中,deployment.metdata指定名稱和標(biāo)簽內(nèi)容侣诺,deployment.spec指定部署組的屬性信息殖演;
- deployment屬性信息包含有replicas,Selector和template紧武,其中replicas指定副本數(shù)目剃氧,Selector指定管理的Pod標(biāo)簽,template為定義Pod的模板阻星,Deployment通過模板創(chuàng)建Pod朋鞍;
- deployment.spec.template為Pod定義的模板,和Pod定義不太一樣妥箕,template中不包含apiVersion和Kind屬性滥酥,要求必須有metadata,deployment.spec.template.spec為容器的屬性信息畦幢,其他定義內(nèi)容和Pod一致坎吻。
- 生成Deployment,創(chuàng)建時加一個--record參數(shù),會在annotation中記錄deployment.kubernetes.io/revision版本
[root@node-1 happylau]# kubectl apply -f deployment-demo.yaml --record
deployment.apps/deployment-nginx-demo created
- 查看Deployment列表宇葱,運行時自動下載鏡像瘦真,如下已運行了3個副本
[root@node-1 happylau]# kubectl get deployments deployment-nginx-demo
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx-demo 3/3 3 3 2m37s
NAME代表名稱,metadata.name字段定義
READY代表Pod的健康狀態(tài)刊头,前面值是readiness,后面是liveness
UP-TO-DATE代表更新诸尽,用于滾動升級
AVAILABLE代表可用
AGE創(chuàng)建至今運行的時長
- 查看Deployment的詳情原杂,可以看到Deployment通過一個deployment-nginx-demo-866bb6cf78 replicaset副本控制器控制Pod的副本數(shù)量
- 查看replicaset的詳情信息,通過Events可查看到deployment-nginx-demo-866bb6cf78創(chuàng)建了三個Pod
- 查看Pod詳情您机,最終通過Pod定義的模版創(chuàng)建container萌衬,資源定義卵沉,健康檢查等包含在Pod定義的模版中
通過上面的實戰(zhàn)演練我們可得知Deployment的副本控制功能是由replicaset實現(xiàn)颖变,replicaset生成Deployment中定義的replicas副本的數(shù)量盖高,即創(chuàng)建多個副本,如下圖所示:
1.2.2 Deployment擴(kuò)容
當(dāng)業(yè)務(wù)比較繁忙時可以通過增加副本數(shù)仲闽,增加副本數(shù)是通過yaml文件中的replicas控制的脑溢,當(dāng)設(shè)置了replias后,Deployment控制器會自動根據(jù)當(dāng)前副本數(shù)目創(chuàng)建所需的Pod數(shù)蔼囊,這些pod會自動加入到service中實現(xiàn)負(fù)載均衡焚志,相反減少副本數(shù)衣迷,這些pod會自動從service中刪除畏鼓。
- 將deployment的副本數(shù)擴(kuò)容至4個,可通過修改yaml文件的replicas個數(shù)或者通過scale命令擴(kuò)展壶谒。
[root@node-1 ~]# kubectl scale --replicas=4 deployment deployment-nginx-demo
deployment.extensions/deployment-nginx-demo scaled
- 查看Deployment副本數(shù)量,已增加至4個副本
[root@node-1 ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx-demo 4/4 4 4 77m
- 副本的擴(kuò)容是如何實現(xiàn)的呢云矫?我們查看replicaset的詳情信息觀察,增加副本的個數(shù)是通過replicaset來擴(kuò)容汗菜,通過模版復(fù)制新的Pod
- 副本縮容
[root@node-1 ~]# kubectl scale --replicas=2 deployment deployment-nginx-demo
deployment.extensions/deployment-nginx-demo scaled
[root@node-1 ~]# kubectl get deployments deployment-nginx-demo
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx-demo 2/2 2 2 7h41m
通過上面的操作演練我們可以得知:Deployment的擴(kuò)容是通過ReplicaSet的模版創(chuàng)建Pod或刪除Pod實現(xiàn)让禀,scale是手動擴(kuò)展實現(xiàn)副本的機制,kubernetes還提供了另外一種副本自動擴(kuò)容機制horizontalpodautoscalers(Horizontal Pod Autoscaling),即通過定義CPU的利用率實現(xiàn)自動的橫向擴(kuò)展陨界,由于需要依賴于監(jiān)控組件巡揍,后續(xù)我們再做介紹。
1.2.3 滾動更新
Deployment支持滾動更新菌瘪,默認(rèn)創(chuàng)建Deployment后會增加滾動更新的策略腮敌,通過逐步替代replicas中的pod實現(xiàn)更新無服務(wù)中斷(需要結(jié)合service),如下圖所示:將一個deployment副本數(shù)為3的應(yīng)用更新俏扩,先更新10.0.0.6 pod糜工,更新pod應(yīng)用,替換新的ip录淡,然后加入到service中捌木,以此類推再繼續(xù)更新其他pod,從而實現(xiàn)滾動更新嫉戚,不影響服務(wù)的升級刨裆。
通過類型為:RollingUpdate澈圈,每次更新最大的數(shù)量maxSurge是replicas總數(shù)的25%,最大不可用的數(shù)量maxUnavailable為25%,如下是通過kubectl get deployments deployment-nginx-demo -o yaml查看滾動更新相關(guān)的策略帆啃。
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
rc: deployment
strategy: #strategy定義的是升級的策略极舔,類型為RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
- 滾動更新是當(dāng)pod.template中定義的相關(guān)屬性變化,如下將鏡像更新到1.9.1链瓦,通過--record會記錄操作命令
[root@node-1 ~]# kubectl set image deployments deployment-nginx-demo nginx-deployment=nginx:1.9.1 --record
deployment.extensions/deployment-nginx-demo image updated
- 查看滾動升級的狀態(tài)(由于第一次nginx的鏡像寫錯了拆魏,容器下載鏡像失敗,寫成nignx慈俯,導(dǎo)致修改后有兩次record)
[root@node-1 happylau]# kubectl rollout status deployment deployment-nginx-demo
deployment "deployment-nginx-demo" successfully rolled out
查看滾動升級版本渤刃,REVSISION代表版本號:
[root@node-1 happylau]# kubectl rollout history deployment deployment-nginx-demo
deployment.extensions/deployment-nginx-demo
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployments deployment-nginx-demo nginx-deployment=nignx:1.9.1 --record=true
3 kubectl set image deployments deployment-nginx-demo nginx-deployment=nignx:1.9.1 --record=true
- 觀察Deployment的升級過程,新創(chuàng)建一個RS deployment-nginx-demo-65c8c98c7b贴膘,逐漸將舊RS中的pod替換卖子,直至舊的RS deployment-nginx-demo-866bb6cf78上的副本數(shù)為0.
- 查看RS的列表,可以看到新的RS的副本數(shù)為2刑峡,其他RS副本數(shù)為0
[root@node-1 ~]# kubectl get replicasets
NAME DESIRED CURRENT READY AGE
deployment-nginx-demo-65c8c98c7b 2 2 2 21m #新的RS洋闽,REVSION為3
deployment-nginx-demo-6cb65f58c6 0 0 0 22m #鏡像寫錯的RS,REVISON為2
deployment-nginx-demo-866bb6cf78 0 0 0 40m #舊的RS突梦,對應(yīng)REVSION為1
- 測試版本升級是否成功
[root@node-1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-nginx-demo-65c8c98c7b-bzql9 1/1 Running 0 25m 10.244.1.58 node-2 <none> <none>
deployment-nginx-demo-65c8c98c7b-vrjhp 1/1 Running 0 25m 10.244.2.72 node-3 <none> <none>
[root@node-1 ~]# curl -I http://10.244.2.72
HTTP/1.1 200 OK
Server: nginx/1.9.1 #鏡像的版本成功更新
Date: Mon, 28 Oct 2019 15:28:49 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 May 2015 15:02:09 GMT
Connection: keep-alive
ETag: "55648af1-264"
Accept-Ranges: bytes
1.2.4 版本回退
如果版本不符合預(yù)期诫舅,kubernetes提供回退的功能,和滾動更新一樣宫患,回退的功能Deployment將替換到原始的RS上刊懈,即逐步將Pod的副本替換到舊的RS上.
- 執(zhí)行回滾,回退到REVISON版本為1
[root@node-1 ~]# kubectl rollout undo deployment deployment-nginx-demo --to-revision=1
deployment.extensions/deployment-nginx-demo rolled back
- 查看Deployment的回退狀態(tài)和歷史版本
[root@node-1 ~]# kubectl rollout status deployment deployment-nginx-demo
deployment "deployment-nginx-demo" successfully rolled out
[root@node-1 ~]# kubectl rollout history deployment deployment-nginx-demo
deployment.extensions/deployment-nginx-demo
REVISION CHANGE-CAUSE
2 kubectl set image deployments deployment-nginx-demo nginx-deployment=nignx:1.9.1 --record=true
3 kubectl set image deployments deployment-nginx-demo nginx-deployment=nignx:1.9.1 --record=true
4 <none>
- 查看Deployment的詳情娃闲,可以看到RS已經(jīng)會退到原始的RS了
- 測試nginx的版本
[root@node-1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-nginx-demo-866bb6cf78-9thtn 1/1 Running 0 3m42s 10.244.1.59 node-2 <none> <none>
deployment-nginx-demo-866bb6cf78-ws2hx 1/1 Running 0 3m48s 10.244.2.73 node-3 <none> <none>
#測試版本
[root@node-1 ~]# curl -I http://10.244.1.59
HTTP/1.1 200 OK
Server: nginx/1.7.9 #回退到1.7.9版本
Date: Mon, 28 Oct 2019 15:36:07 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Dec 2014 16:25:09 GMT
Connection: keep-alive
ETag: "54999765-264"
Accept-Ranges: bytes
小結(jié):通過上面的操作演練可知虚汛,Deployment是通過ReplicaSet實現(xiàn)Pod副本數(shù)的管理(擴(kuò)容或減少副本數(shù)),滾動更新是通過新建RS皇帮,將Pod從舊的RS逐步更新到新的RS上卷哩;相反,回滾版本將會退到指定版本的ReplicaSet上属拾。
1.3 ReplicaSet
ReplicaSet副本集簡稱RS将谊,用于實現(xiàn)副本數(shù)的控制,通過上面的學(xué)習(xí)我們可以知道Deployment實際是調(diào)用ReplicaSet實現(xiàn)副本的控制捌年,RS不具備滾動升級和回滾的特性瓢娜,一般推薦使用Deployment,ReplicaSet的定義和Deployment差不多礼预,如下:
- 定義ReplicaSet
[root@node-1 happylau]# cat replicaset-demo.yaml
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: replicaset-demo
labels:
controller: replicaset
annotations:
kubernetes.io/description: "Kubernetes Replication Controller Replication"
spec:
replicas: 3 #副本數(shù)
selector: #Pod標(biāo)簽選擇器
matchLabels:
controller: replicaset
template: #創(chuàng)建Pod的模板
metadata:
labels:
controller: replicaset
spec: #容器信息
containers:
- name: nginx-replicaset-demo
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- name: http-80-port
protocol: TCP
containerPort: 80
- 創(chuàng)建RS并查看RS列表
[root@node-1 happylau]# kubectl apply -f replicaset-demo.yaml
replicaset.extensions/replicaset-demo created
[root@node-1 happylau]# kubectl get replicasets replicaset-demo
NAME DESIRED CURRENT READY AGE
replicaset-demo 3 3 3 15s
- 擴(kuò)展副本數(shù)至4個
[root@node-1 happylau]# kubectl scale --replicas=4 replicaset replicaset-demo
replicaset.extensions/replicaset-demo scaled
[root@node-1 happylau]# kubectl get replicasets replicaset-demo
NAME DESIRED CURRENT READY AGE
replicaset-demo 4 4 4 76s
- 減少副本數(shù)至2個
[root@node-1 happylau]# kubectl scale --replicas=2 replicaset replicaset-demo
replicaset.extensions/replicaset-demo scaled
[root@node-1 happylau]# kubectl get replicasets replicaset-demo
NAME DESIRED CURRENT READY AGE
replicaset-demo 2 2 2 114s
- 鏡像版本升級眠砾,驗證得知不具備版本升級的能力
[root@node-1 happylau]# kubectl set image replicasets replicaset-demo nginx-replicaset-demo=nginx:1.9.1
replicaset.extensions/replicaset-demo image updated #命令執(zhí)行成功了
ReplicaSet小結(jié):通過上面的演示可以知道,RS定義和Deployment類似,能實現(xiàn)副本的控制褒颈,擴(kuò)展和縮減柒巫,Deployment是更高層次的副本控制器,ReplicaSet主要為Deployment的副本控制器和滾動更新機制谷丸,ReplicaSet本身無法提供滾動更新的能力堡掏。
1.4 ReplicationController
ReplicationController副本控制器簡稱RC,是kubernetes中最早的副本控制器刨疼,RC是ReplicaSet之前的版本泉唁,ReplicationController提供副本控制能力,其定義方式和Deployment揩慕,ReplicaSet相類似亭畜,如下:
- 定義ReplicationController
[root@node-1 happylau]# cat rc-demo.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-demo
labels:
controller: replicationcontroller
annotations:
kubernetes.io/description: "Kubernetes Replication Controller Replication"
spec:
replicas: 3
selector: #不能使用matchLables字符集模式
controller: replicationcontroller
template:
metadata:
labels:
controller: replicationcontroller
spec:
containers:
- name: nginx-rc-demo
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- name: http-80-port
protocol: TCP
containerPort: 80
- 生成RC并查看列表
[root@node-1 happylau]# kubectl apply -f rc-demo.yaml
replicationcontroller/rc-demo created
[root@node-1 happylau]# kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
rc-demo 3 3 3 103s
#查看詳情
[root@node-1 happylau]# kubectl describe replicationcontrollers rc-demo
Name: rc-demo
Namespace: default
Selector: controller=replicationcontroller
Labels: controller=replicationcontroller
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"ReplicationController","metadata":{"annotations":{"kubernetes.io/description":"Kubernetes Replication Controlle...
kubernetes.io/description: Kubernetes Replication Controller Replication
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: controller=replicationcontroller
Containers:
nginx-rc-demo:
Image: nginx:1.7.9
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 113s replication-controller Created pod: rc-demo-hm8s9
Normal SuccessfulCreate 113s replication-controller Created pod: rc-demo-xnfht
Normal SuccessfulCreate 113s replication-controller Created pod: rc-demo-lfhc9
3.副本擴(kuò)容至4個
[root@node-1 happylau]# kubectl scale --replicas=4 replicationcontroller rc-demo
replicationcontroller/rc-demo scaled
[root@node-1 happylau]# kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
rc-demo 4 4 4 3m23s
- 副本縮容至2個
[root@node-1 happylau]# kubectl scale --replicas=2 replicationcontroller rc-demo
replicationcontroller/rc-demo scaled
[root@node-1 happylau]# kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
rc-demo 2 2 2 3m51s
寫在最后
本文介紹了kubernetes中三個副本控制器:Deployment,ReplicaSet和ReplicationController迎卤,當(dāng)前使用最廣泛的是Deployment拴鸵,ReplicaSet為Deployment提供滾動更新機制,RC當(dāng)前是舊版的副本控制器蜗搔,當(dāng)前已廢棄劲藐,推薦使用Deployment控制器,具備副本控制器樟凄,擴(kuò)展副本聘芜,縮減副本,滾動升級和回滾等高級能力不同。
參考文獻(xiàn)
Deployment:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
ReplicaSet:https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
ReplicationController:https://kubernetes.io/docs/concepts/workloads/controllers/
當(dāng)你的才華撐不起你的野心時厉膀,你就應(yīng)該靜下心來學(xué)習(xí)
?
如果覺得文章對您有幫助,請訂閱專欄二拐,分享給有需要的朋友吧??
關(guān)于作者 劉海平(HappyLau )云計算高級顧問 目前在騰訊云從事公有云相關(guān)工作,曾就職于酷狗凳兵,EasyStack百新,擁有多年公有云+私有云計算架構(gòu)設(shè)計,運維庐扫,交付相關(guān)經(jīng)驗饭望,參與了酷狗,南方電網(wǎng)形庭,國泰君安等大型私有云平臺建設(shè)铅辞,精通Linux,Kubernetes萨醒,OpenStack斟珊,Ceph等開源技術(shù),在云計算領(lǐng)域具有豐富實戰(zhàn)經(jīng)驗富纸,擁有RHCA/OpenStack/Linux授課經(jīng)驗囤踩。