Deployment?官方文檔:
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
這兩個pod?的控制器就是能夠管理?pod缨称,監(jiān)測?pod?運行狀況,當?pod?發(fā)生故障省店,可以自動恢復?pod上沐。也就是說能夠代我們?nèi)ス芾?pod?中間層傍衡,并幫助我 們確保每一個?pod?資源始終處于我們所定義或者我們所期望的目標狀態(tài)羡洁,一旦?pod?資源出現(xiàn)故障辽话,那么 控制器會嘗試重啟?pod?或者里面的容器歇终,如果一直重啟有問題的話那么它可能會基于某種策略來進行重 新布派或者重新編排;如果?pod?副本數(shù)量低于用戶所定義的目標數(shù)量权纤,它也會自動補全;如果多余钓简,也 會自動終止?pod?資源。
Replicaset?概述
ReplicaSet?是?kubernetes?中的一種副本控制器汹想,簡稱?rs外邓,主要作用是控制由其管理的?pod,使
pod?副本的數(shù)量始終維持在預設的個數(shù)古掏。它的主要作用就是保證一定數(shù)量的?Pod?能夠在集群中正常運 行损话,它會持續(xù)監(jiān)聽這些?Pod?的運行狀態(tài),在?Pod?發(fā)生故障時重啟?pod,pod?數(shù)量減少時重新運行新的?Pod?副本丧枪。官方推薦不要直接使用?ReplicaSet光涂,用?Deployments?取而代之,Deployments?是比?ReplicaSet?更高級的概念拧烦,它會管理?ReplicaSet?并提供很多其它有用的特性忘闻,最重要的是?Deployments?支持聲明式更新,聲明式更新的好處是不會丟失歷史變更恋博。所以?Deployment?控制器不 直接管理?Pod?對象齐佳,而是由?Deployment?管理?ReplicaSet,再由?ReplicaSet?負責管理?Pod?對象债沮。
Replicaset?工作原理:如何管理?Pod?
Replicaset?核心作用在于代用戶創(chuàng)建指定數(shù)量的?pod?副本炼吴,并確保?pod?副本一直處于滿足用戶期 望的數(shù)量, 起到多退少補的作用秦士,并且還具有自動擴容縮容等機制缺厉。
Replicaset?控制器主要由三個部分組成:
1永高、用戶期望的?pod?副本數(shù):用來定義由這個控制器管控的?pod?副本有幾個?
2隧土、標簽選擇器:選定哪些?pod?是自己管理的,如果通過標簽選擇器選到的?pod?副本數(shù)量少于我 們指定的數(shù)量命爬,需要用到下面的組件
3曹傀、pod?資源模板:如果集群中現(xiàn)存的?pod?數(shù)量不夠我們定義的副本中期望的數(shù)量怎么辦,需要 新建?pod饲宛,這就需要?pod?模板皆愉,新建的?pod?是基于模板來創(chuàng)建的。
Replicaset?資源清單文件編寫技巧
#查看定義?Replicaset?資源需要的字段有哪些?
]# kubectl explain rs KIND: ReplicaSet
VERSION: apps/v1
DESCRIPTION:
ReplicaSet ensures that a specified number of pod replicas are running at any given time.
FIELDS:
apiVersion?<string> #當前資源使用的?api?版本艇抠,跟?VERSION:?apps/v1?保持一致?kind?<string> #資源類型幕庐,跟?KIND:?ReplicaSet?保持一致
metadata<Object> #元數(shù)據(jù)搀愧,定義?Replicaset?名字的
spec?<Object> ##定義副本數(shù)吆倦、定義標簽選擇器、定義?Pod?模板
status?<Object> #狀態(tài)信息济竹,不能改
#查看?replicaset?的?spec?字段如何定義?
KIND: ReplicaSet
VERSION:? apps/v1
RESOURCE: spec <Object>
DESCRIPTION:
? ? Spec defines the specification of the desired behavior of the ReplicaSet.
? ? More info:
? ? https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
? ? ReplicaSetSpec is the specification of a ReplicaSet.
FIELDS:
minReadySeconds. <integer>?
replicas <integer> #定義的?pod?副本數(shù)絮重,根據(jù)我們指定的值創(chuàng)建對應數(shù)量的?pod
selector <Object> -required- #用于匹配?pod?的標簽選擇器
template <Object> #定義?Pod?的模板冤寿,基于這個模板定義的所有?pod?是一樣的
#查看?replicaset?的?spec.template?字段如何定義?
#對于?template?而言,其內(nèi)部定義的就是?pod青伤,pod?模板是一個獨立的對象
~]# kubectl explain rs.spec.template
kubectl explain rs.spec.template.spec
KIND: ReplicaSet
VERSION:? apps/v1
RESOURCE: spec <Object>
DESCRIPTION:
? ? Specification of the desired behavior of the pod. More info:
? ? https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
? ? PodSpec is a description of a pod.
FIELDS:
metadata<Object>?
spec <Object>
通過上面可以看到督怜,ReplicaSet?資源中有兩個?spec?字段。第一個?spec?聲明的是?ReplicaSet?定義 多少個?Pod?副本(默認將僅部署?1?個?Pod)狠角、匹配?Pod?標簽的選擇器号杠、創(chuàng)建?pod?的模板。第二個?spec?是?spec.template.spec:主要用于?Pod?里的容器屬性等配置丰歌。
.spec.template?里的內(nèi)容是聲明?Pod?對象時要定義的各種屬性姨蟋,所以這部分也叫做?PodTemplate?(Pod?模板)辣吃。還有一個值得注意的地方是:在.spec.selector?中定義的標簽選擇器必須能夠匹配到?spec.template.metadata.labels?里定義的?Pod?標簽,否則?Kubernetes?將不允許創(chuàng)建?ReplicaSet芬探。
Replicaset 使用: ? 部署?Guestbook?留言板
工作節(jié)點 ?docker load -I frontend.tar.gz
cat replicaset.yaml
apiVersion: apps/v1
kind:? ReplicaSet
metadata:
? name: frontend
? labels:
? ? app: guestbook
? ? tier: frontend
spec:
? replicas: 3 ? ? ?#定義副本數(shù)神得,默認是1個
? selector: ? ? ? ? #定義標簽選擇器,用于匹配pod的標簽選擇器
? ? matchLabels:
? ? ? tier: frontend
? template: ? ? ? ? ? #定義模版偷仿,基于這個模版定義所有的pod是一樣的
? ? metadata:
? ? ? labels:
? ? ? ? tier: frontend
? ? spec:
? ? ? containers:
? ? ? - name: php-redis
? ? ? ? image: yecc/gcr.io-google_samples-gb-frontend:v3
? ? ? ? imagePullPolicy: IfNotPresent
kubectl apply -f replicaset.yaml
kubectl get pods
AME READY STATUS RESTARTS AGE
frontend-64pc8? ? ? ? ? 1/1? ? Running? 0? ? ? ? ? 7m17s
frontend-nwxmp? ? ? ? ? 1/1? ? Running? 0? ? ? ? ? 7m17s
frontend-tqvf6? ? ? ? ? 1/1? ? Running? 0? ? ? ? ? 7m17s
#pod?的名字是由控制器的名字-隨機數(shù)組成的
#資源清單詳細說明
apiVersion: apps/v1 #ReplicaSet?這個控制器屬于的核心群組?
kind: ReplicaSet #創(chuàng)建的資源類型
metadata:
name: frontend #控制器的名字?labels:
app: guestbook
tier: frontend spec:
replicas: 3 #管理的?pod?副本數(shù)量?selector:
matchLabels:
tier: frontend #管理帶有?tier=frontend?標簽的?pod
template: #定義?pod?的模板?metadata:
labels:
tier: frontend#pod?標簽哩簿,一定要有,這樣上面控制器就能找到它要管理的?pod?是哪些了?
spec:
containers: #定義?pod?里運行的容器
- name: php-redis #定義容器的名字
image: yecc/gcr.io-google_samples-gb-frontend:v3?
ports: #定義端口
- name: http #定義容器的名字
containerPort: 80 #定義容器暴露的端口
Replicaset?管理?pod:擴容酝静、縮容节榜、更新
#Replicaset?實現(xiàn)?pod?的動態(tài)擴容
ReplicaSet?最核心的功能是可以動態(tài)擴容和回縮,如果我們覺得兩個副本太少了别智,想要增加宗苍,只需 要修改配置文件?replicaset.yaml?里的?replicas?的值即可,原來?replicas: 3薄榛,現(xiàn)在變成?replicaset: 5讳窟, 修改之后,執(zhí)行如下命令更新:
kubectl apply -f replicaset.yaml
kubectl get rs
kubectl get pods
kubectl edit rs frontend
把上面的?spec?下的?replicas?后面的值改成?5敞恋,保存退出丽啡,就可以看到5個frontend前端程序
#Replicaset?實現(xiàn)?pod?的動態(tài)縮容
如果我們覺得?5?個?Pod?副本太多了,想要減少硬猫,只需要修改配置文件?replicaset.yaml?里的?replicas?的值即可补箍,把?replicaset:4?變成?replicas: 2,修改之后啸蜜,執(zhí)行如下命令更新:
#Replicaset?實現(xiàn)?pod?的更新
docker load -i myapp-v2.tar.gz
kubectl edit rs frontend
#修改鏡像?image: yecc/gcr.io-google_samples-gb-frontend:v3?變成- image: ikubernetes/myapp:v2坑雅,修改之后保存退出
# kubectl get rs -o wide
NAME DESIRED CURRENT READY IMAGES frontend 2 2 2 ikubernetes/myapp:v2 #
上面可以看到鏡像變成了?ikubernetes/myapp:v2,說明滾動升級成功了
kubectl get pods -o wide
NAME? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE? IP? ? ? ? ? ? ? NODE? ? ? NOMINATED NODE? READINESS GATES
frontend-64pc8? 1/1? ? Running? 0? ? ? ? ? 22m? 10.244.187.78 ?god62? <none>? ? ? ? ? <none>
frontend-tqvf6? 1/1? ? Running? 0? ? ? ? ? 22m? 10.244.187.77 ?god62? <none>? ? ? ? ? <none>
curl ??10.244.187.78
curl: (7) Failed connect to 10.244.187.78; Connection refused. #如果報錯的話看日志
kubectl logs frontend-64pc8
kubectl describe pod frontend-64pc8 ? ?#看Containers
div style="width: 50%; margin-left: 20px">
<h2>Guestbook
# curl 10.244.187.77 div style="width: 50%; margin-left: 20px">
<h2>Guestbook
#
上面可以看到雖然鏡像已經(jīng)更新了衬横,但是原來的?pod?使用的還是之前的鏡像裹粤,新創(chuàng)建的?pod?才會
使用最新的鏡像
kubectl delete pods frontend-8khvm
kubectl get pods -o wide
kubectl get pods -o wide
NAME? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE? ? IP? ? ? ? ? ? ? NODE? ? ? NOMINATED NODE? READINESS GATES
frontend-hh559? 1/1? ? Running? 0? ? ? ? ? 5m24s? 10.244.187.84 ? god62? <none>? ? ? ? ? <none>
frontend-sgnf7? 1/1? ? Running? 0 ? ? ? ? ? 12s? ? 10.244.209.152 ? ? ?god64? <none>? ? ? ? ? <none>
curl 10.244.209.152
Hello MyApp | Version: v2 | Pod Name
生產(chǎn)環(huán)境如果升級,可以刪除一個?pod冕香,觀察一段時間之后沒問題再刪除另一個?pod蛹尝,但是這樣需 要人工干預多次;實際生產(chǎn)環(huán)境一般采用藍綠發(fā)布,原來有一個?rs1悉尾,再創(chuàng)建一個?rs2(控制器)突那,通過修 改?service?標簽,修改?service?可以匹配到?rs2?的控制器构眯,這樣才是藍綠發(fā)布愕难,這個也需要我們精心的部 署規(guī)劃,我們有一個控制器就是建立在?rs?之上完成的,叫做?Deployment
Deployment?概述
Deployment?是?kubernetes?中最常用的資源對象猫缭,為?ReplicaSet?和?Pod?的創(chuàng)建提供了一種聲明
式的定義方法葱弟,在?Deployment?對象中描述一個期望的狀態(tài),Deployment?控制器就會按照一定的控制 速率把實際狀態(tài)改成期望狀態(tài)猜丹,通過定義一個?Deployment?控制器會創(chuàng)建一個新的?ReplicaSet?控制 器芝加,通過?ReplicaSet?創(chuàng)建?pod,刪除?Deployment?控制器射窒,也會刪除?Deployment?控制器下對應的ReplicaSet?控制器和?pod?資源.
使用?Deployment?而不直接創(chuàng)建?ReplicaSet?是因為?Deployment?對象擁有許多?ReplicaSet?沒有的特性藏杖,例如滾動升級和回滾。
擴展:聲明式定義是指直接修改資源清單?yaml?文件脉顿,然后通過?kubectl apply -f?資源清單?yaml?文件蝌麸,就可以更改資源
Deployment?控制器是建立在?rs?之上的一個控制器,可以管理多個?rs艾疟,每次更新鏡像版本来吩,都會生 成一個新的?rs,把舊的?rs?替換掉蔽莱,多個?rs?同時存在弟疆,但是只有一個?rs?運行。
rs v1?控制三個?pod碾褂,刪除一個?pod兽间,在?rs v2?上重新建立一個,依次類推正塌,直到全部都是由?rs v2?控制,如果?rs v2?有問題恤溶,還可以回滾乓诽,Deployment?是建構(gòu)在?rs?之上的,多個?rs?組成一個?Deployment咒程,但是只有一個?rs?處于活躍狀態(tài).
Deployment?工作原理:如何管理?rs?和?Pod?
Deployment?可以使用聲明式定義鸠天,直接在命令行通過純命令的方式完成對應資源版本的內(nèi)容的修
改,也就是通過打補丁的方式進行修改;Deployment?能提供滾動式自定義自控制的更新;對?Deployment?來講帐姻,我們在實現(xiàn)更新時還可以實現(xiàn)控制更新節(jié)奏和更新邏輯稠集。
什么叫做更新節(jié)奏和更新邏輯呢?
比如說?Deployment?控制?5?個?pod?副本,pod?的期望值是?5?個饥瓷,但是升級的時候需要額外多幾個?pod剥纷,那我們控制器可以控制在?5?個?pod?副本之外還能再增加幾個?pod?副本;比方說能多一個,但是不 能少呢铆,那么升級的時候就是先增加一個晦鞋,再刪除一個,增加一個刪除一個,始終保持?pod?副本數(shù)是?5?個;還有一種情況悠垛,最多允許多一個线定,最少允許少一個,也就是最多?6?個确买,最少?4?個斤讥,第一次加一個, 刪除兩個湾趾,第二次加兩個周偎,刪除兩個,依次類推撑帖,可以自己控制更新方式蓉坎,這種滾動更新需要加?readinessProbe?和?livenessProbe?探測,確保?pod?中容器里的應用都正常啟動了才刪除之前的pod胡嘿。
啟動第一步蛉艾,剛更新第一批就暫停了也可以;假如目標是 5?個,允許一個也不能少衷敌,允許最多可以10?個勿侯,那一次加?5?個即可;這就是我們可以自己控制節(jié)奏來控制更新的方法。
通過?Deployment?對象缴罗,你可以輕松的做到以下事情:
1助琐、創(chuàng)建?ReplicaSet?和?Pod
2、滾動升級(不停止舊服務的狀態(tài)下升級)和回滾應用(將應用回滾到之前的版本)?
3面氓、平滑地擴容和縮容
4兵钮、暫停和繼續(xù)?Deployment
Deployment?資源清單文件編寫技巧
kubectl explain deployment
apiVersion <string>。#該資源使用的?api?版本
kind <string> ? ? ? ?#創(chuàng)建的資源是什么?
metadata <Object> ??#元數(shù)據(jù)舌界,包括資源的名字和名稱空間
spec <Object> ? ? ??#定義容器的
kubectl explain deployment.spec
FIELDS:
minReadySeconds
#Kubernetes?在等待設置的時間后才進行升級
#如果沒有設置該值掘譬,Kubernetes?會假設該容器啟動起來后就提供服務了
paused ?#暫停,當我們更新的時候創(chuàng)建?pod?先暫停呻拌,不是立即更新
progressDeadlineSeconds
# k8s 在升級過程中有可能由于各種原因升級卡住(這個時候還沒有明確的升級失敗)葱轩,比如 在拉取被墻的鏡像,權(quán)限不夠等錯誤藐握。那么這個時候就需要有個?deadline?靴拱,在?deadline?之內(nèi)如果還卡著,那么就上報這個情況猾普,這個時候這個?Deployment?狀態(tài)就被標記為?False袜炕,并且注明原因。但是它并不會阻止?Deployment?繼續(xù)進行卡住后面的操作抬闷。完全由用戶進行控制妇蛀。
replicas ?#副本數(shù)
revisionHistoryLimit <integer> #保留的歷史版本耕突,默認是?10?
selector -required-?#標簽選擇器,選擇它關(guān)聯(lián)的?pod?
strategy ?#更新策略
template -required?#定義的?pod?模板
#查看?Deployment?下的?spec.strategy?字段
kubectl explain deploy.spec.strategy
KIND: Deployment
VERSION:? apps/v1
RESOURCE: strategy <Object>
FIELDS:
? rollingUpdate? ? ? ? <Object>
? ? Rolling update config params. Present only if DeploymentStrategyType =
? ? RollingUpdate.
? type <string>
? ? Type of deployment. Can be "Recreate" or "RollingUpdate". Default is
? ? RollingUpdate.
#支持兩種更新评架,Recreate?和?RollingUpdate
#Recreate?是重建式更新眷茁,刪除一個更新一個
#RollingUpdate?滾動更新,定義滾動更新方式纵诞,也就是?pod?能多幾個上祈,少幾個?
#查看?Deployment?下的?spec.strategy.rollingUpdate?字段
kubectl explain deploy.spec.strategy.rollingUpdate
maxSurge <string>
#我們更新的過程當中最多允許超出的指定的目標副本數(shù)有幾個; 它有兩種取值方式,第一種直接給定數(shù)量浙芙,第二種根據(jù)百分比登刺,百分比表示原本是?5?個,最多 可以超出?20%嗡呼,那就允許多一個纸俭,最多可以超過?40%,那就允許多兩個
maxUnavailable <string>
#最多允許幾個不可用假設有 5?個副本南窗,最多一個不可用揍很,就表示最少有?4?個可用
#查看?Deployment?下的?spec.template?字段
#template?為定義?Pod?的模板,Deployment?通過模板創(chuàng)建?Pod
kubectl explain deploy.spec.template
FIELDS:
metadata #定義模板的名字?
spec <Object>
deployment.spec.template?為?Pod?定義的模板万伤,和?Pod?定義不太一樣窒悔,template?中不 包含?apiVersion?和?Kind?屬性,要求必須有?metadata敌买。deployment.spec.template.spec?為容器的屬性信息简珠,其他定義內(nèi)容和?Pod?一致。
#查看?Deployment?下的?spec.template.spec?字段
kubectl explain deploy.spec.template.spec
FIELDS:
activeDeadlineSeconds
#activeDeadlineSeconds ? ? 表示?Pod?可以運行的最長時間虹钮,達到設置的該值后聋庵,Pod?會自 動停止。
affinity ?#定義親和性芜抒,跟直接創(chuàng)建?pod?時候定義親和性類似
?automountServiceAccountToken <boolean> #身份認證相關(guān)的?
containers <[]Object> -required-?#定義容器屬性?
dnsConfig<Object> #設置?Pod?的?DNS
dnsConfig: nameservers:
- 192.xxx.xxx.6 searches:
- ?god.svc.cluster.local
- my.dns.search.god
dnsPolicy # dnsPolicy ?決定?Pod?內(nèi)預設的?DNS?配置策略
None?無任何策略:使用自定義的策略
Default?默認:使用宿主機的?dns?配置珍策,/etc/resolv.conf
ClusterFirst ?集群?DNS?優(yōu)先,與?Default?相反宅倒,會預先使用?kube-dns (或?CoreDNS )?的信息當預設置參數(shù)寫入到該?Pod?內(nèi)的?DNS?配置。
ClusterFirstWithHostNet?集群?DNS?優(yōu)先屯耸,并伴隨著使用宿主機網(wǎng)絡:同時使用
hostNetwork?與?kube-dns?作為?Pod?預設?DNS?配置拐迁。
enableServiceLinks <boolean>?
ephemeralContainers <[]Object> #定義臨時容器
臨時容器與其他容器的不同之處在于,它們?nèi)鄙賹Y源或執(zhí)行的保證疗绣,并且永遠不會自 動重啟线召,因此不適用于構(gòu)建應用程序。臨時容器使用與常規(guī)容器相同的?ContainerSpec?段 進行描述多矮,但許多字段是不相容且不允許的缓淹。
臨時容器沒有端口配置哈打,因此像?ports,livenessProbe讯壶,readinessProbe?這樣的字 段是不允許的料仗。
Pod?資源分配是不可變的,因此?resources?配置是不允許的伏蚊。
臨時容器用途:
當由于容器崩潰或容器鏡像不包含調(diào)試應用程序而導致 kubectl exec?無用時立轧,臨時容器對于交互式故障排查很有用。
hostAliases <[]Object> #在?pod?中增加域名解析的
hostAliases:
–?ip: "10.1.2.2"
hostnames:?–?"mc.local"
–?"rabbitmq.local"?–?ip: "10.1.2.3"
hostnames:
–?"redis.local"
–?"mq.local"
hostIPC <boolean> #使用主機?IPC
hostNetwork #
是否使用宿主機的網(wǎng)絡
hostPID <boolean> #可以設置容器里是否可以看到宿主機上的進程躏吊。True?可以?hostname
imagePullSecrets <[]Object>
initContainers <[]Object>?
#定義初始化容器
nodeName ?#定義?pod?調(diào)度到具體哪個節(jié)點上
nodeSelector ?#定義節(jié)點選擇器
overhead #overhead?是?1.16?引入的字段氛改,在沒有引入
Overhead?之前,只要一個節(jié)點的資源可用量大于等于?Pod?的?requests?時比伏,這個?Pod?就可以被調(diào)度到這個節(jié)點上胜卤。引入?Overhead?之后,只有節(jié)點的資源可用量大于等于?Overhead?加上?requests?的和時才能被調(diào)度上來赁项。
preemptionPolicy ??<string>
priority. <integer>
priorityClassName.?<string>
readinessGates <[]Object>?
restartPolicy. ?<string>??#Pod?重啟策略
runtimeClassName <string>
schedulerName. ?<string>
securityContext.?<Object>. ?#是否開啟特權(quán)模式
serviceAccount. ??<string>
serviceAccountName ?<string>
setHostnameAsFQDN?<boolean>. #只能布耳值True?或是 False葛躏。
shareProcessNamespace ?<boolean>.
subdomain ??<string>
terminationGracePeriodSeconds ??<integer> ? ? ? #優(yōu)雅刪除
#在真正刪除容器之前,K8S?會先發(fā)終止信號(kill -15 {pid})給容器肤舞,默認?30s?
tolerations <[]Object> ??#定義容忍度
topologySpreadConstraints <[]Object紫新。?
volumes <[]Object> ? ? ? ?# ? 掛載存儲卷
Deployment?使用:創(chuàng)建一個?web?站點
deployment?是一個三級結(jié)構(gòu),deployment?管理?replicaset李剖,replicaset?管理?pod芒率,
myapp-blue-v1.tar.gz?和?myapp-blue-v2.tar.gz ?上傳到工作節(jié)點
cat deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: myapp-v1
spec:
? replicas: 2. ? ? ? ?#管理兩個副本
? selector:
? ? matchLabels:
? ? ? app: myapp
? ? ? version: v1
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: myapp
? ? ? ? version: v1
? ? spec:
? ? ? containers:
? ? ? - name: myapp
? ? ? ? image: janakiramm/myapp:v1
? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ports:
? ? ? ? - containerPort: 80
kubectl apply -f deploy-demo.yaml
#kubectl apply:表示聲明式的定義,既可以創(chuàng)建資源篙顺,也可以動態(tài)更新資源
查看?deploy?狀態(tài):
kubectl get deploy
NAME ? ? ? ? ? READY ? ? ?UP-TO-DATE ? ? AVAILABLE ? ? ?AGE
myapp-v1. ? 2/2 2 ? ? ? ? ? ? 2 ? ? ? ? ? ? ? ? ? ? ? ? ? ?2 ? ? ? ? ? ? ? ? 60s
#創(chuàng)建的控制器名字是?myapp-v1
1.NAME?
:列出名稱空間中?deployment?的名稱偶芍。
2.READY:顯示?deployment?有多少副本數(shù)。它遵循?ready/desired?的模式德玫。?
3.UP-TO-DATE: 顯示已更新到所需狀態(tài)的副本數(shù)匪蟀。
4.AVAILABLE: 顯示你的可以使用多少個應用程序副本。
5.AGE?:顯示應用程序已運行的時間宰僧。
kubectl get rs?顯示如下:?
創(chuàng)建的控制器名字是?myapp-v1 kubectl get rs
顯示如下:
AME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DESIRED ? ? ? ? CURRENT ? ? ? READY ? ? ?AGE?
myapp-v1-67fd9fc9c8 ? ? ? ? 2 ? ? ? ? ? ? ? 2 ? ? ? ? ? ? ? ? ? ? 2 ? ? 2m35s
#創(chuàng)建?deploy?的時候也會創(chuàng)建一個?rs(replicaset)材彪,67fd9fc9c8?這個隨機數(shù)字是我們引 用?pod?的模板?template?的名字的?hash?值
1.NAME: 列出名稱空間中?ReplicaSet?資源?
2DESIRED:顯示應用程序的所需副本數(shù),這些副本數(shù)是在創(chuàng)建時定義的琴儿。這是所需的狀態(tài)段化。
?3.CURRENT: 顯示當前正在運行多少個副本。
4.READY: 顯示你的用戶可以使用多少個應用程序副本造成。
5.AGE?:顯示應用程序已運行的時間显熏。
kubectl get pods -o wide | grep myapp
?myapp-v1-67fd9fc9c8-fcprr 1/1 Running 0 10.244.187.78 ? ? ? ? ?god62
?myapp-v1-67fd9fc9c8-hw4f9 1/1 Running 0 10.244.209.136 ? ?god64
curl 10.244.187.78
background-color:?blue;
#資源清單文件詳細解讀?
apiVersion: apps/v1 ? ? ??#deployment?對應的?api?版本?
kind: Deployment. ? ? ??#創(chuàng)建的資源是?deployment
?metadata: ? ?
name: myapp-v1 ? ? ? ?#deployment?的名字
?spec:
replicas: 2 ? ? ??#deployment?管理的?pod?副本數(shù)
selector: ? ? ? #標簽選擇器
?matchLabels: ?# matchLabels?下定義的標簽需要跟?template.metadata.labels?定義的標簽一致
.... ?....?
spec: #定義容器的屬性
containers:
- name: myapp
image: janakiramm/myapp:v1 #容器使用的鏡像?
ImagePullPolicy: IfNotPresent #鏡像拉取策略?ports:
- containerPort: 80 #容器里的應用的端口
Deployment?管理?pod:擴容、縮容晒屎、滾動更新喘蟆、回滾
#通過?deployment?管理應用缓升,實現(xiàn)擴容,把副本數(shù)變成?3
cat deploy-demo.yaml?直接修改?replicas?數(shù)量蕴轨,如下港谊,變成?3
kubectl apply -f deploy-demo.yaml
kubectl get pods
NAME? ? ? ? ? ? ? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE
myapp-v1-75fb478d6c-69rs9? 1/1? ? Running? 0? ? ? ? ? 2m17s
myapp-v1-75fb478d6c-bqqv4? 1/1? ? Running? 0? ? ? ? ? 2m15s
myapp-v1-75fb478d6c-fjxps? 1/1? ? Running? 0? ? ? ? ? 2m13s
#上面可以看到?pod?副本數(shù)變成了?3?個
#查看?myapp-v1?這個控制器的詳細信息
kubectl describe deploy myapp-v1
Name: myapp-v1
Namespace:? ? ? ? ? ? ? default
CreationTimestamp:? ? ? Fri, 14 May 2021 16:43:08 +0800
Labels:? ? ? ? ? ? ? ? <none>
Annotations:? ? ? ? ? ? deployment.kubernetes.io/revision: 2
Selector:? ? ? ? ? ? ? app=myapp,version=v1
Replicas:? ? ? ? ? ? ? 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:? ? ? ? ? RollingUpdate
MinReadySeconds:? ? ? ? 0
RollingUpdateStrategy:? 25% max unavailable, 25% max surge
#通過?deployment?管理應用,實現(xiàn)縮容尺棋,把副本數(shù)變成?2
cat deploy-demo.yaml?直接修改?replicas?數(shù)量封锉,如下,變成?2spec:replicas: 2?
kubectl apply -f deploy-demo.yaml
通過?deployment?管理應用膘螟,實現(xiàn)滾動更新
kubectl get pods -l app=myapp -w
vim deploy-demo.yaml
把?image: janakiramm/myapp:v1?變成?image: janakiramm/myapp:v2
kubectl apply -f deploy-demo.yaml
再回到剛才執(zhí)行監(jiān)測?kubectl get pods -l app=myapp -w?的那個窗口成福,可以看到信息
myapp-v1-75fb478d6c-x8stq 0/1 Pending
myapp-v1-75fb478d6c-x8stq 0/1 Pending
myapp-v1-75fb478d6c-x8stq 0/1 ContainerCreating
myapp-v1-67fd9fc9c8-fcprr 1/1 Terminating
pending?表示正在進行調(diào)度,ContainerCreating?表示正在創(chuàng)建一個pod,rnning表示運行一個pod荆残,running起來一個pod之后再Terminating(停掉)一個?pod奴艾,以此類 推,直到所有?pod?完成滾動升級
kubectl get rs
NAME? ? ? ? ? ? ? ? ? DESIRED? CURRENT? READY? AGE
frontend? ? ? ? ? ? ? 2? ? ? ? 2? ? ? ? 2? ? ? 2d23h
myapp-v1-67fd9fc9c8? 0? ? ? ? 0? ? ? ? 0? ? ? 45h
myapp-v1-75fb478d6c ?2 ? ? ? ? 2 ? ? ? ? 2 ? ? ? 8m48s
#上面可以看到?rs?有兩個内斯,上面那個是升級之前的蕴潦,已經(jīng)被停掉,但是可以隨時回滾?#查看?myapp-v1?這個控制器的歷史版本
# kubectl rollout history deployment myapp-v1 deployment.apps/myapp-v1
REVISION CHANGE-CAUSE
1 ?<none>
2 ?<none>
回滾一下
kubectl rollout undo deployment myapp-v1 --to-revision=1
deployment.apps/myapp-v1 rolled back
在查看版本信息
kubectl rollout history deployment myapp-v1
REVISION CHANGE-CAUSE
2? ? ? ? <none>
3? ? ? ? <none>
資源限制 ?
kubectl explain deploy.spec.template.spec.containers.resources
Deployment?資源清單詳解
官方文檔無聊看看多學習俘闯,加油
https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/
apiVersion: apps/v1?
kind: Deployment metadata:
name: portal
namespace: ms spec:
replicas: 1 selector:
matchLabels: project: ms app: portal
template: metadata:
labels: project: ms app: portal
spec: containers:
- name: portal
image: god/portal:v1 imagePullPolicy: Always ports:
- protocol: TCP containerPort: 8080
resources: #資源配額
limits: #資源限制潭苞,最多可用的?cpu?和內(nèi)存
cpu: 1
memory: 1Gi
requests:?#最少需要多少資源才可以運行?Pod
cpu: 0.5
memory: 1Gi readinessProbe:
tcpSocket: port: 8080
initialDelaySeconds: 60
periodSeconds: 10 livenessProbe:
tcpSocket: port: 8080
initialDelaySeconds: 60 periodSeconds: 10
livenessProbe:
#存活性探測
#用于判斷容器是否存活,即?Pod?是否為?running?狀態(tài)真朗,如果?LivenessProbe?探針探測到容器不健 康此疹,則?kubelet?將?kill?掉容器,并根據(jù)容器的重啟策略是否重啟遮婶。如果一個容器不包含?LivenessProbe?探針蝗碎,則?Kubelet?認為容器的?LivenessProbe?探針的返回值永遠成功。
tcpSocket:
port: 8080 #檢測?8080?端口是否存在
initialDelaySeconds: 60?#Pod?啟動?60s?執(zhí)行第一次檢查?
periodSeconds: 10?#第一次檢查后每隔?10s?檢查一次
readinessProbe: #就緒性探測
有時候應用程序可能暫時無法接受請求旗扑,比如?
Pod?已經(jīng)?Running?了蹦骑,但是容器內(nèi)應用程序尚未啟動成 功,在這種情況下臀防,如果沒有?ReadinessProbe眠菇,則?Kubernetes?認為它可以處理請求了,然而此時袱衷, 我們知道程序還沒啟動成功是不能接收用戶請求的琼锋,所以不希望?kubernetes?把請求調(diào)度給它,則使用?ReadinessProbe?探針祟昭。
ReadinessProbe?和?livenessProbe?可以使用相同探測方式,只是對?Pod?的處置方式不同怖侦,?ReadinessProbe?是將?Pod IP:Port?從對應的?EndPoint?列表中刪除篡悟,而?livenessProbe?則?Kill?容器并 根據(jù)?Pod?的重啟策略來決定作出對應的措施谜叹。
ReadinessProbe?探針探測容器是否已準備就緒,如果未準備就緒則?kubernetes?不會將流量轉(zhuǎn)發(fā)給此?Pod搬葬。
tcpSocket: port: 8080
initialDelaySeconds: 60
periodSeconds: 10
#在?Pod?運行過程中荷腊,K8S?仍然會每隔?10s?檢測?8080?端口