控制器Replicaset 和 Deployment

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?端口

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市急凰,隨后出現(xiàn)的幾起案子女仰,更是在濱河造成了極大的恐慌,老刑警劉巖抡锈,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疾忍,死亡現(xiàn)場離奇詭異,居然都是意外死亡床三,警方通過查閱死者的電腦和手機一罩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撇簿,“玉大人聂渊,你說我怎么就攤上這事∷奶保” “怎么了汉嗽?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長找蜜。 經(jīng)常有香客問我饼暑,道長,這世上最難降的妖魔是什么锹杈? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任撵孤,我火速辦了婚禮,結(jié)果婚禮上竭望,老公的妹妹穿的比我還像新娘邪码。我一直安慰自己,他們只是感情好咬清,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布闭专。 她就那樣靜靜地躺著,像睡著了一般旧烧。 火紅的嫁衣襯著肌膚如雪影钉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天掘剪,我揣著相機與錄音平委,去河邊找鬼。 笑死夺谁,一個胖子當著我的面吹牛廉赔,可吹牛的內(nèi)容都是我干的肉微。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜡塌,長吁一口氣:“原來是場噩夢啊……” “哼碉纳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馏艾,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劳曹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琅摩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铁孵,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年迫吐,在試婚紗的時候發(fā)現(xiàn)自己被綠了库菲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡志膀,死狀恐怖熙宇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溉浙,我是刑警寧澤烫止,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站戳稽,受9級特大地震影響馆蠕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惊奇,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一互躬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颂郎,春花似錦吼渡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至替劈,卻和暖如春寄雀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陨献。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工盒犹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓阿趁,卻偏偏與公主長得像膜蛔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脖阵,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容