1.獲取資源
kubectlget
2.查看資源詳情
kubectl describe <reousrce_type> <reousrce_name>
3.kubernetes設(shè)計Pod中為何要有pause根容器
Pause作為Pod的根容器甸私,可以代表整個容器組的狀態(tài)
Pod里的多個業(yè)務(wù)容器共享Pause容器的IP,共享Pause容器掛接的Volume触趴,簡化了業(yè)務(wù)容器之間的通信問題盛垦,也解決了它們之間文件共享問題
4.修改RC(Replication Controller)的副本數(shù)量來實現(xiàn)Pod的動態(tài)縮放
# 維持三個副本kubectl scale rc --replicas=3
5.創(chuàng)建Horizontal Pod Autoscaler
# 自動進行副本數(shù)量管理腻惠,當(dāng)cpu占用大于90%袁稽,pod副本數(shù)量為1~10kubectl autoscale deployment --cpu-percent=90--min=1--max=10
6.StatefulSet
管理有狀態(tài)服務(wù),如mysql集群抗碰、kafka集群狮斗、zookeeper集群等
StatefulSet可以看作Deployment/RC的變種
如果StatefulSet名稱為kafka,那么第一個Pod叫kafka-0改含,第二個叫kafka-1情龄,以此類推
7.查看資源yaml
kubectlget -o=yaml
8.刪除資源
# 刪除所有Podkubernetes delete pods--all# 刪除包含某個Label的Pod和Servicekubernetes delete pods,services-1name=
9.執(zhí)行容器的命令
# 執(zhí)行Pod的date命令,默認(rèn)使用Pod中的第一個容器執(zhí)行kubectl exec <pod_name> date# 指定Pod中的某個容器執(zhí)行date命令kubectl exec -c date# 通過bash獲得Pod中某個容器的TTY捍壤,相當(dāng)于登錄容器kubectl exec-ti-c /bin/bash
10.查看容器的日志
# 查看容器輸出到stdout的日志kubectl logs <pod_name># 跟蹤查看容器的日志骤视,相當(dāng)于tail -f命令的結(jié)果kubectl logs-f-c
11.創(chuàng)建資源對象
# 根據(jù)yaml配置文件一次性創(chuàng)建Service和RCkubectl create-fmy-service.yaml-fmy-rc.yaml# 根據(jù)<directory>目錄下的所有.yaml、.yml鹃觉、.json文件的定義進行創(chuàng)建kubectl create-f
12.創(chuàng)建或更新資源對象
# 用法與kubectl create類似专酗,但是create不能做更新kubectl apply-fapp.yaml
13.在線編輯運行中的資源對象
# 編輯運行中的deploymentkubectl edit deploy nginx
14.將Pod的開放端口映射到本地
# 將集群上Pod的80端口映射到本地的8888端口,瀏覽器可通過localhost:8888進行訪問kubectl port-forward--address0.0.0.0 \ pod/8888:80
15.在Pod和本地之間復(fù)制文件
# 把Pod上的/etc/fstab 復(fù)制到本地的/tmpkubernetescp:/etc/fstab /tmp
16.資源對象的標(biāo)簽設(shè)置
# 為default namespace設(shè)置testing=truekubectl label namespaces defaulttesting=true
17.檢查可用的API資源類型列表
# 該命令經(jīng)常用于檢查特定類型的資源是否已經(jīng)定義盗扇,列出所有資源對象類型kubectl api-resources
18.通過kubectl創(chuàng)建ConfigMap
# 通過--from-file祷肯,指定文件,key就是文件名疗隶,value就是文件內(nèi)容kubectl create configmap --from-file=--from-file=# 通過--from-file參數(shù)從目錄中進行創(chuàng)建佑笋,該目錄下的每個配置文件名都被設(shè)置為key,文件的內(nèi)容被設(shè)置為valuekubectl create configmap --from-file=# 使用--from-literal斑鼻,直接將指定key和valuekubectl create configmap --from-literal=key1=value1--from-literal=key2=value2
19.Pod掛載ConfigMap
# 環(huán)境變量方式(1)apiVersion: v1kind: Podmetadata:? name: cm-test-podspec:? containers:? ? - name: cm-test? ? ? image: busybox? ? ? command: ["/bin/sh","-c","env | grep APP"]? ? ? env:# 定義環(huán)境變量名稱? ? ? ? - name: APPLOGLEVEL# key"apploglevel"對應(yīng)的值? ? ? ? ? valueFrom:? ? ? ? ? ? configMapKeyRef:# configmap的名稱? ? ? ? ? ? ? name: cm-appvars# key為apploglevel? ? ? ? ? ? ? key: apploglevel? ? ? ? - name: APPDATADIR? ? ? ? ? valueFrom:? ? ? ? ? ? configMapKeyRef:? ? ? ? ? ? ? name: cm-appvars? ? ? ? ? ? ? key: appdatadir? restartPolicy: Never? # 環(huán)境變量方式(2)蒋纬,k8s1.6開始,引入了一個新字段evnFrom,會自動將ConfigMap種所有定義的key-value生成為環(huán)境變量apiVersion: v1kind: Podmetadata:? name: cm-test-podspec:? containers:? ? - name: cm-test? ? ? image: busybox? ? ? command: ["/bin/sh","-c","env"]? ? ? envFrom:? ? ? ? - configMapRef:# configmap名稱? ? ? ? ? name: cm-appvars? restartPolicy: Never? # 通過volumeMount使用ConfigMapapiVersion: v1kind: Podmetadata:? name: cm-test-podspec:? containers:? ? - name: cm-test? ? ? image: busybox? ? ? ports:? ? ? - containerPort: 8087? ? ? volumeMounts:# 引用volume名稱? ? ? ? - name: vname# 掛載到容器內(nèi)的目錄? ? ? ? ? mountPath: /configfiles? volumes:# 定義volume名稱? ? - name: vname? ? ? configMap:# configmap名稱? ? ? ? name: cm-appvars
20.進入容器內(nèi)部
kubectl exec-tibash
21.在容器內(nèi)獲取Pod信息(Downward API)
可以獲取Pod名稱蜀备、命名空間关摇、IP等;通過查看Pod日志獲取信息
# 環(huán)境變量方式:將Pod信息注入為環(huán)境變量# metadata.name:Pod的名稱碾阁,當(dāng)Pod通過RC生成時输虱,其名稱是RC隨機產(chǎn)生的唯一名稱。# status.podIP:Pod的IP地址脂凶,之所以叫作status.podIP而非metadata.IP宪睹,是因為Pod的IP屬于狀態(tài)數(shù)據(jù),而非元數(shù)據(jù)艰猬。# metadata.namespace:Pod所在的NamespaceapiVersion: v1kind: Podmetadata:? name: dapi-test-podspec:? containers:? ? - name: dapi-test? ? ? image: busybox? ? ? command:? ? ? ? - /bin/sh? ? ? ? - '-c'? ? ? ? - env? ? ? env:? ? ? ? - name: MY_POD_NAME? ? ? ? ? valueFrom:? ? ? ? ? ? fieldRef:? ? ? ? ? ? ? fieldPath: metadata.name? ? ? ? - name: MY_POD_NAMESPACE? ? ? ? ? valueFrom:? ? ? ? ? ? fieldRef:? ? ? ? ? ? ? fieldPath: metadata.namespace? ? ? ? - name: MY_POD_IP? ? ? ? ? valueFrom:? ? ? ? ? ? fieldRef:? ? ? ? ? ? ? fieldPath: status.podIP# 環(huán)境變量方式:將容器資源信息注入為環(huán)境變量apiVersion: v1kind: Podmetadata:? name: dapi-test-podspec:? containers:? ? - name: dapi-test? ? ? image: busybox? ? ? imagePullPolicy: Never? ? ? ports:? ? ? ? - containerPort: 8087? ? ? command:? ? ? ? - /bin/sh? ? ? ? - '-c'? ? ? env:? ? ? ? - name: MY_CPU_REQUEST? ? ? ? ? valueFrom:? ? ? ? ? ? resourceFieldRef:? ? ? ? ? ? ? containerName: dapi-test? ? ? ? ? ? ? resource: requests.cpu? ? ? ? - name: MY_CPU_LIMIT? ? ? ? ? valueFrom:? ? ? ? ? ? resourceFieldRef:? ? ? ? ? ? ? containerName: dapi-test? ? ? ? ? ? ? resource: limits.cpu? ? ? ? - name: MY_MEM_LIMIT? ? ? ? ? valueFrom:? ? ? ? ? ? resourceFieldRef:? ? ? ? ? ? ? containerName: dapi-test? ? ? ? ? ? ? resource: limits.memory# 掛載volume方式---
22.Pod狀態(tài)
Pending:API Server已經(jīng)創(chuàng)建該Pod横堡,但在Pod內(nèi)還有一個或多個容器的鏡像還沒被創(chuàng)建,包括正在下載鏡像的過程冠桃;
Running:Pod內(nèi)所有的容器均已創(chuàng)建命贴,且至少有一個容器處于運行狀態(tài),正在啟動狀態(tài)或正在重啟狀態(tài)食听;
Succeeded:Pod內(nèi)所有容器均已成功執(zhí)行后退出胸蛛,且不會重啟;
Failed:Pod內(nèi)所有容器均已退出樱报,但至少有一個容器退出為失敗狀態(tài)葬项;
Unknow:由于某種原因無法獲取該Pod狀態(tài),可能由于網(wǎng)絡(luò)通信不暢導(dǎo)致迹蛤。
23.Pod重啟策略
Pod重啟策略(RestartPolicy)應(yīng)用于Pod內(nèi)的所有容器民珍,并且在Pod所處的Node上由kubelet進行判斷和重啟操作。當(dāng)某個容器異常退出或健康檢查失敗時盗飒,kubelet將根據(jù)RestartPolicy的設(shè)置來進行相應(yīng)的操作嚷量。
Pod的重啟策略包括 Always(默認(rèn))、OnFailure逆趣、Never:
Always:當(dāng)容器失敗時蝶溶,由kubelet自動重啟該容器;
OnFailure:當(dāng)容器終止運行且退出碼不為0時宣渗,由kubelet重啟該容器抖所;
Never:不論容器運行狀態(tài)如何,kubelet都不會重啟該容器痕囱。
kubelet重啟失效容器的時間間隔以sync-frequnecy乘以2n來計算田轧,例如1、2鞍恢、4傻粘、8倍等巷查,最長延遲5min,并且在重啟后10min后重置該時間抹腿。
Pod重啟策略與控制方式:
RC和DaemonSet:必須設(shè)置為Always,需要保證該容器持續(xù)運行旭寿;
Job:OnFailure或Never警绩,確保容器執(zhí)行完后不會再運行;
Kubelet:在Pod失效時自動重啟它盅称,不論將RestartPolicy設(shè)置為什么值肩祥,也不會對Pod進行健康檢查。
24.Pod健康檢查和服務(wù)可用性檢查
Kubernetes對Pod的健康檢查可以通過兩類探針來檢查:LivenessProbe和ReadinessProbe缩膝。
LivenessProbe探針:用于判斷容器是否存活(Running狀態(tài))混狠,如果LivenessProbe探測到容器不健康,則kubelet將殺死該容器疾层,并根據(jù)容器的重啟策略進行相應(yīng)的處理将饺。如果一個容器不包括LivenessProbe探針,那么kubelet則會認(rèn)為該容器的LivenessProbe探針返回的結(jié)果永遠(yuǎn)是success痛黎。
ReadinessProbe探針:用于判斷容器是否可用(Ready狀態(tài))予弧,達到Ready狀態(tài)的Pod才可以接收請求。對于背Service管理的Pod湖饱,Service與Pod Endpoint的關(guān)聯(lián)關(guān)系也將基于Pod受否Reday進行設(shè)置掖蛤。如果在運行過程中Ready變?yōu)镕lase,則系統(tǒng)自動將其從Service的后端Endpoint列表中隔離出去井厌,后續(xù)再把恢復(fù)到Ready狀態(tài)的Pod加入到Endpoint列表蚓庭。這樣可以保證客戶端再訪問Service時不會被轉(zhuǎn)發(fā)到不可用的Pod實例上。
LivenessProbe和ReadinessProbe均可配置以下三種實現(xiàn)方式:
ExecAction:在容器內(nèi)執(zhí)行一個命令仅仆,如果該命令返回值為0器赞,則表明容器健康。
# initialDelaySeconds 啟動容器后進行首次健康檢查的時間# timeoutSeconds 健康檢查發(fā)送請求后等待響應(yīng)的超時時間# 通過執(zhí)行“cat /tmp/health”命令來判斷一個容器運行是否正常蝇恶。在該Pod運行后拳魁,將在創(chuàng)建/tmp/health文件10s后刪除該文件,而LivenessProbe健康檢查的初始探測時間(initialDelaySeconds)為15s撮弧,探測結(jié)果是Fail潘懊,將導(dǎo)致kubelet殺掉該容器并重啟它apiVersion: v1kind: Podmetadata:? labels:? ? test: liveness? name: liveness-execspec:? containers:? ? - name: liveness? ? ? image: nginx? ? ? args:? ? ? ? - /bin/sh? ? ? ? - '-c'? ? ? ? - echo ok > /temp/healthy; sleep 10; rm -rf /temp/healthy; sleep 600? ? ? livenessProbe:? ? ? ? exec:? ? ? ? ? command:? ? ? ? ? ? - cat? ? ? ? ? ? - /temp/healthy? ? ? ? initialDelaySeconds: 15? ? ? ? timeoutSeconds: 1
TCPSocketAction:通過容器的IP地址和端口號執(zhí)行TCP檢查,如果能夠建立TCP連接贿衍,則表明容器健康授舟。
apiVersion: v1kind: Podmetadata:? labels:? ? test: liveness? name: liveness-execspec:? containers:? ? - name: liveness? ? ? image: nginx? ? ? ports:? ? ? ? - containerPort: 80? ? ? livenessProbe:? ? ? ? tcpSocket:? ? ? ? ? port: 80? ? ? ? initialDelaySeconds: 15? ? ? ? timeoutSeconds: 1
HTTPGetAction:通過容器的IP地址、端口號及路徑調(diào)用HTTP GET方法贸辈,如果響應(yīng)的狀態(tài)碼大于等于200小于400释树,認(rèn)為容器健康。
apiVersion: v1kind: Podmetadata:? labels:? ? test: liveness? name: liveness-execspec:? containers:? ? - name: liveness? ? ? image: nginx? ? ? ports:? ? ? ? - containerPort: 80? ? ? livenessProbe:? ? ? ? httpGet:? ? ? ? ? path: /_status/heathz? ? ? ? ? port: 80? ? ? ? initialDelaySeconds: 15? ? ? ? timeoutSeconds: 1
Kubernetes的ReadinessProbe機制可能無法滿足某些復(fù)雜應(yīng)用對容器內(nèi)服務(wù)可用狀態(tài)的判斷,1.11版本開始奢啥,引入Ready++秸仙,1.14版本達到穩(wěn)定版,稱其為Pod Readiness Gates桩盲。
25.Deployment全自動調(diào)度
# 會創(chuàng)建3個Nginx應(yīng)用的PodapiVersion: apps/v1kind: Deploymentmetadata:? name: nginx-deploymentspec:? replicas: 3? selector:? ? matchLabels:? ? ? app: nginx-server? template:? ? metadata:? ? ? labels:? ? ? ? app: nginx-server? ? spec:? ? ? containers:? ? ? ? - name: nginx-deployment? ? ? ? ? image: nginx? ? ? ? ? ports:? ? ? ? ? ? - containerPort: 80
26.NodeSelector定向調(diào)度
Kubernetes Master上的Scheduler服務(wù)(kubernetes-scheduler進程)負(fù)責(zé)實現(xiàn)Pod的調(diào)度寂纪,整個調(diào)度過程通過執(zhí)行一系列復(fù)雜的算法,最終為每個Pod都計算出一個最佳的目標(biāo)節(jié)點赌结,這一過程是自動完成的捞蛋,通常我們無法知道Pod最終會調(diào)度到哪個節(jié)點上。如果需要將Pod調(diào)度到指定節(jié)點上柬姚,可以通過Node標(biāo)簽(Label)和Pod的nodeSelector屬性相匹配 拟杉。
# 1.通過kubectl label命令給目標(biāo)Node打上標(biāo)簽kubectl label nodes <node_name> <label_key>=<label_value># 2.在Pod的定義中加上nodeSelector的設(shè)置apiVersion: apps/v1kind: Deploymentmetadata:? name: nginx-deploymentspec:? replicas: 3? template:? ? spec:? ? ? containers:? ? ? ? - name: nginx? ? ? ? ? image: nginx? ? ? ? ? ports:? ? ? ? ? ? - containerPort: 80? ? ? nodeSelector:? ? ? ? <label_key>:
27.NodeAffinity親和性調(diào)度
NodeAffinity意為Node親和性的調(diào)度策略,適用于替換NodeSelector的全新調(diào)度策略量承。目前有兩種節(jié)點親和性表達搬设。
RequiredDuringSchedulingIgnoredDuringExecution:必須滿足指定規(guī)則才可以調(diào)度Pod到Node上,相當(dāng)于硬限制撕捍。
PreferredDuringSchedulingIgnoredDuringExecution:強調(diào)優(yōu)先滿 足指定規(guī)則焕梅,調(diào)度器會嘗試調(diào)度Pod到Node上,但并不強求卦洽,相當(dāng)于軟 限制贞言。多個優(yōu)先級規(guī)則還可以設(shè)置權(quán)重(weight)值,以定義執(zhí)行的先 后順序阀蒂。
IgnoredDuringExecution的意思是:如果一個Pod所在的節(jié)點在Pod運 行期間標(biāo)簽發(fā)生了變更该窗,不再符合該Pod的節(jié)點親和性需求,則系統(tǒng)將 忽略Node上Label的變化蚤霞,該Pod能繼續(xù)在該節(jié)點運行酗失。
apiVersion: apps/v1kind: Deploymentmetadata:? name: nginx-deploymentspec:? replicas: 3? selector:? ? matchLabels:? ? ? app: nginx-server? template:? ? metadata:? ? ? labels:? ? ? ? app: nginx-server? ? spec:? ? ? affinity:? ? ? ? nodeAffinity:? ? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:? ? ? ? ? ? nodeSelectorTerms:? ? ? ? ? ? ? - matchExpressions:# kubernetes預(yù)定義標(biāo)簽? ? ? ? ? ? ? ? ? - key: beta.kubernetes.io/arch# 也有NotIn? ? ? ? ? ? ? ? ? ? operator: In? ? ? ? ? ? ? ? ? ? values:? ? ? ? ? ? ? ? ? ? ? - amd64? ? ? ? ? preferredDuringSchedulingIgnoredDuringExecution:? ? ? ? ? ? - weight: 1? ? ? ? ? ? ? preference:? ? ? ? ? ? ? ? matchExpressions:? ? ? ? ? ? ? ? ? - key: disk-type? ? ? ? ? ? ? ? ? ? operator: In? ? ? ? ? ? ? ? ? ? values:? ? ? ? ? ? ? ? ? ? ? - ssd? ? ? containers:? ? ? ? - name: nginx-deployment? ? ? ? ? image: nginx? ? ? ? ? ports:? ? ? ? ? ? - containerPort: 80
注意:如果同時定義了nodeSelector和nodeAffinity,那么必須都得到滿足昧绣;如果nodeAffinity指定了多個nodeSelectorTerms规肴,那么滿足其中一個就可以;如果nodeSelectorTerms種有多個matchExpressions夜畴,則一個點滿足matchExpressions才能運行該Pod拖刃。
28.PodAffinity親和與互斥調(diào)度策略
PodAffinity根據(jù)節(jié)點上正在運行的Pod的標(biāo)簽而不是節(jié)點的標(biāo)簽進行判斷和調(diào)度,要求對節(jié)點和Pod兩個條件進行匹配贪绘。
例如:如果在具有標(biāo)簽X的Node上運行了一個或多個符合條件Y的Pod兑牡,那么Pod應(yīng)該運行在這個Node上;
這里X指的是一個集群中的節(jié)點税灌、機架均函、區(qū)域等概念亿虽,通過Kubernetes內(nèi)置節(jié)點標(biāo)簽中的key來進行聲明,這個key的名字為topologyKey苞也,意為表達節(jié)點所屬的topology范圍洛勉。與節(jié)點不同的是,Pod是屬于某個命名空間的如迟,所以條件Y表達的是一個或者多個命名空間中的一個Label Selecotr坯认。
和節(jié)點親和性相同,Pod親和與互斥的條件設(shè)置也是 requiredDuringSchedulingIgnoredDuringExecution和
preferredDuringSchedulingIgnoredDuringExecution氓涣。Pod的親和性被定義于PodSpec的affinity字段下的podAffinity子字段中。Pod間的互斥性則被定義于同一層次的podAntiAffinity子字段中陋气。
# 1.創(chuàng)建一個名為pod-flag的Pod劳吠,帶有標(biāo)簽security=S1和app=nginx,使用該Pod作為其他Pod親和于互斥的目標(biāo)PodapiVersion: v1kind: Podmetadata:? name: pod-flag? labels:? ? security: S1? ? app: nginxspec:? containers:? ? - name: nginx? ? ? image: nginx# 2.創(chuàng)建第二個pod來說明pod的親和性巩趁,親和標(biāo)簽為security=S1痒玩,對應(yīng)目標(biāo)pod,創(chuàng)建后與pod-flag在同一nodeapiVersion: v1kind: Podmetadata:? name: pod-affinityspec:? affinity:? ? podAffinity:? ? ? requiredDuringSchedulingIgnoredDuringExecution:? ? ? ? - labelSelector:? ? ? ? ? ? matchExpressions:? ? ? ? ? ? ? - key: security? ? ? ? ? ? ? ? operator: In? ? ? ? ? ? ? ? values:? ? ? ? ? ? ? ? ? - S1? ? ? ? ? topologyKey: kubernetes.io/hostname? containers:? ? - name: with-pod-affinity? ? ? image: nginx# 3.pod的互斥性調(diào)度议慰,該pod不與目標(biāo)pod運行在同一節(jié)點# 要求該pod與security=S1的pod為同一個zone蠢古,但不與app=nginx的pod為同一個nodeapiVersion: v1kind: Podmetadata:? name: anti-affinityspec:? affinity:? ? podAffinity:? ? ? requiredDuringSchedulingIgnoredDuringExecution:? ? ? ? - labelSelector:? ? ? ? ? ? matchExpressions:? ? ? ? ? ? ? - key: security? ? ? ? ? ? ? ? operator: In? ? ? ? ? ? ? ? values:? ? ? ? ? ? ? ? ? - S1? ? ? ? ? topologyKey: failure-domain.beta.kubernetes.io/zone? ? podAntiAffinity:? ? ? requiredDuringSchedulingIgnoredDuringExecution:? ? ? ? - labelSelector:? ? ? ? ? matchExpressions:? ? ? ? ? ? ? - key: app? ? ? ? ? ? ? ? operator: In? ? ? ? ? ? ? ? values:? ? ? ? ? ? ? ? ? - nginx? ? ? ? ? topologyKey: kubernetes.io/hostname? containers:? ? - name: with-pod-affinity? ? ? image: nginx
29.Taints和Tolerations(污點和容忍)
Taint需要和Toleration配合使用,讓Pod避開那些不適合的Node别凹。在Node上設(shè)置一個或多個Taint之后草讶,除非Pod明確聲明能夠容忍這些污點,否則無法在這些Node上運行炉菲。Toleration是Pod的屬性堕战,讓Pod能夠運行在標(biāo)注了Taint的Node上。
# 污點值:NoSchedule(一定不被調(diào)度) PreferNoSchedule(盡量不被調(diào)度) NoExecute(不被調(diào)度拍霜,并且驅(qū)除已有pod)# 設(shè)置污點嘱丢,key、value隨便寫kubectl taintnode =:污點值# 刪除污點kubectl taintnode :NoSchedule-# 這里的key可以不用指定valuekubectl taintnode :NoExecute-kubectl taintnode -kubectl taintnode :NoSchedule-
這個設(shè)置為node加上了一個Taint祠饺,該Taint的鍵為key越驻,值為value,Taint的效果是NoSchedule道偷。意味著除非Pod明確聲明可以容忍該Taint缀旁,否則不會被調(diào)度到該node上。
# 設(shè)置污點容忍勺鸦,該Pod可以運行在污點為<key>的node上apiVersion: v1kind: Podmetadata:? name: taint-podspec:? tolerations:? ? - key: ? ? ? operator: Equal? ? ? value: value# operator: Exists 效果與以上相同? ? ? effect: NoSchedule? containers:? ? - name: nginx? ? ? image: nginx
Pod的Toleration聲明中的key和effect需要與Taint的設(shè)置保持一致诵棵,并且滿足以下條件之一:
operator的值是Exists(無需指定value)。
operator的值是Equal并且value相等祝旷。
如果不指定operator履澳,則默認(rèn)為Equal嘶窄,另外,有如下兩個特例:
空的key配合Exists操作符能夠匹配所有的鍵和值距贷。
空的effect匹配所有的effect柄冲。
effect取值:
NoSchedule:Pod沒有聲明容忍該taint,則調(diào)度器不會把該Pod調(diào)度到這一節(jié)點上忠蝗。
PreferNoSchedult:調(diào)度器會嘗試不把該Pod調(diào)度到這個節(jié)點上(不強制)现横。
NoExecute:如果該Pod已經(jīng)在該節(jié)點運行,則會被驅(qū)逐阁最;如果沒有戒祠,則調(diào)度器不會把該Pod調(diào)度到這一節(jié)點( 可以設(shè)置驅(qū)逐時間,eg:tolerationSeconds =5000速种,在5s鐘后被驅(qū)逐)姜盈。
30.Pod Priority Preemption:Pod優(yōu)先級調(diào)度
當(dāng)發(fā)生資源不足的情況時,系統(tǒng)可以選擇釋放一些不重要的負(fù)載(優(yōu)先級最低的)配阵,保障最重要的負(fù)載能夠有足夠的資源穩(wěn)定運行馏颂。
# 1.定義一個名為high-priority的優(yōu)先級類別,優(yōu)先級為1000000棋傍,數(shù)字越大救拉,優(yōu)先級越大,超過一億的數(shù)字被系統(tǒng)保留瘫拣,用于指派給系統(tǒng)組件apiVersion: scheduling.k8s.io/v1kind: PriorityClassmetadata:? name: high-priorityvalue: 1000000globalDefault: falsedescription: This priority class should be used for XYZ service pods only# 2.在Pod上引用上述Pod優(yōu)先級類別亿絮,priorityClassName: high-priorityapiVersion: v1kind: Podmetadata:? name: nginxspec:? containers:? ? - name: nginx? ? ? image: nginx? ? ? imagePullPolicy: IfNotPresent? priorityClassName: high-priority
31.DaemonSet:在每個Node上都調(diào)度一個Pod
DaemonSet的Pod調(diào)度策略與RC類似,除了使用系統(tǒng)內(nèi)置的算法在每個Node上進行調(diào)度麸拄,也可以在Pod的定義中使用NodeSelector或NodeAffinity來指定滿足條件的Node范圍進行調(diào)度壹无。
# 每個Node上都啟動一個fluentd容器,其中掛載了物理機的兩個目錄/var/log和/var/lib/docker/containersapiVersion: apps/v1kind: DaemonSetmetadata:? name: fluentd-cloud-logging? namespace: kube-system? labels:? ? k8s-app: fluentd-cloud-loggingspec:? selector:? ? matchLabels:? ? ? k8s-app: fluentd-cloud-logging? template:? ? metadata:? ? ? namespace: kube-system? ? ? labels:? ? ? ? k8s-app: fluentd-cloud-logging? ? spec:? ? ? containers:? ? ? ? - name: fluentd-cloud-logging? ? ? ? ? image: ist0ne/fluentd-elasticsearch? ? ? ? ? imagePullPolicy: IfNotPresent? ? ? ? ? resources:? ? ? ? ? ? limits:? ? ? ? ? ? ? cpu: 100m? ? ? ? ? ? ? memory: 200Mi? ? ? ? ? env:? ? ? ? ? ? - name: FLUENTD_ARGS? ? ? ? ? ? ? value: '-q'? ? ? ? ? volumeMounts:? ? ? ? ? ? - name: varlog? ? ? ? ? ? ? mountPath: /var/log? ? ? ? ? ? ? readOnly: false? ? ? ? ? ? - name: containers? ? ? ? ? ? ? mountPath: /var/lib/docker/containers? ? ? ? ? ? ? readOnly: false? ? ? volumes:? ? ? ? - name: containers? ? ? ? ? hostPath:? ? ? ? ? ? path: /var/lib/docker/containers? ? ? ? - name: varlog? ? ? ? ? hostPath:? ? ? ? ? ? path: /var/log
32.Init Container:初始化容器
用于在啟動應(yīng)用容器之前啟動一個或多個初始化容器感帅,完成應(yīng)用容器所需的預(yù)置條件斗锭。init container與應(yīng)用容器在本質(zhì)上是一樣的,但它們是僅運行一次就結(jié)束的任務(wù)失球。根據(jù)Pod的重啟策略(RestarPolicy)岖是,當(dāng)init container執(zhí)行失敗,而且設(shè)置了RestartPolicy=Never時实苞,Pod將會啟動失敳虺拧;而設(shè)置RestartPolicy=Always時黔牵,Pod將會被系統(tǒng)重啟聪轿。
# initContainersapiVersion: v1kind: Podmetadata:? name: nginx-podspec:? initContainers:? ? - name: install? ? ? image: busybox? containers:? ? - name: nginx? ? ? image: nginx? ? ? ports:? ? ? ? - containerPort: 80
33.Deployment的升級與回滾
# 修改鏡像名稱kubectlsetimage deployment =:# 查看修改狀態(tài)kubectl rollout status deployment <deployment_name># 查看歷史版本kubectl rollout history deployment <deployment_name># 回滾到上個版本kubectl rollout undo deployment <deployment_name># 回滾到指定版本(3是查看歷史版本里面的版本號)kubectl rollout undo deployment --to-revision=3
34.暫停和恢復(fù)Deployment的部署操作,以完成復(fù)雜的修改
對于一次復(fù)雜的Deployment配置修改猾浦,為了避免頻繁觸發(fā)Deployment的更新操作陆错,可以先暫停Deployment的更新操作灯抛,然后進行配置修改,再恢復(fù)Deployment音瓷,一次性觸發(fā)完整的更新操作对嚼,就可以避免不必要的Deployment更新操作。
# 暫停deployment更新操作kubectl rollout pause deployment <deployment_name># 修改deployment鏡像信息kubectlsetimage deployment =:# 查看修改deployment的歷史記錄绳慎,發(fā)現(xiàn)并沒有觸發(fā)新的deployment部署操作kubectl rollout history deploy <deploy_name># 再次更新容器資源限制kubectlsetresources deploy -c=--limits=cpu=200m,memory=512Mi# 最后纵竖,恢復(fù)這個deployment的部署操作kubectl rollout resume deploy <deploy_name>
注意:暫停狀態(tài)的Deployment無法回滾!
35.使用kubectl rolling-update命令完成RC的滾動升級
kubectl rolling-update --image=:
36.Pod手動擴容機制
# 將pod數(shù)量維持在10個kubectl scale deploy --replicas10
37.Pod自動擴容機制
Kubernetes從1.1版本開始杏愤,新增了名為Horizontal Pod AutoScaler(HPA)的控制器靡砌,用于實現(xiàn)基于CPU使用率進行自動Pod擴縮容的功能。HPA控制器基于Master的kube-controller-manager服務(wù)啟動參數(shù)--horizontal-pod-autoscaler-sync-period定義探測周期(默認(rèn)為15s)珊楼,周期性地檢測目標(biāo)Pod的資源性能指標(biāo)通殃,并與HPA資源對象中的擴縮容條件進行對比,在滿足條件時對Pod副本數(shù)量進行調(diào)整亥曹。
HPA工作原理:
Kubernetes中的某個Metrics Server(Heapster或自定義Metrics Server)持續(xù)采集所有Pod副本的指標(biāo)數(shù)據(jù)。HPA控制器通過Metrics Server的API(Heapster的API或聚合API)獲取這些數(shù)據(jù)恨诱,基于用戶定義的擴縮容規(guī)則進行計算媳瞪,得到目標(biāo)Pod副本數(shù)量。當(dāng)目標(biāo)Pod數(shù)量與當(dāng)前副本數(shù)量不同時照宝,HPA控制器就向Pod的副本控制器(Deployment蛇受、RC或ReplicaSet)發(fā)起scale操作,調(diào)整Pod的副本數(shù)量厕鹃,完成擴縮容操作兢仰。
HPA配置詳解:
Kubernetes將HPA資源對象提供給用戶來定義擴縮容的規(guī)則。
HPA資源對象處于Kubernetes的API組“autoscaling”中剂碴,目前包括v1和v2兩個版本把将。其中autoscaling/v1僅支持CPU使用率的自動擴縮容,autoscaling/v2則用于支持基于任意指標(biāo)的自動化擴縮容配置忆矛,包括基于資源使用率察蹲、Pod指標(biāo)、其他指標(biāo)等類型的指標(biāo)數(shù)據(jù)催训。
(1)基于autoscaling/v1版本的HPA配置洽议,僅可設(shè)置CPU使用率:
apiVersion: autoscaling/v1kind: HorizontalPodAutoscalermetadata:? name: php-apachespec:# 目標(biāo)作用對象,可以是Deployment漫拭、ReplicationController或ReplicaSet? scaleTargetRef:? ? apiVersion: apps/v1? ? kind: Deployment? ? name: php-apache# Pod副本數(shù)量的最小值和最大值? minReplicas: 1? maxReplicas: 10# 期望每個Pod的CPU使用率都為50%亚兄,該使用率基于Pod設(shè)置的CPU Request值進行計算? targetCPUUtilizationPercentage: 50
注意:使用autoscaling/v1版本的HPA,需預(yù)先安裝Heapster組件或Metrics Server采驻,用于采集CPU使用率审胚。
(2)基于autoscaling/v2beta2的HPA配置:
apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:? name: php-apachespec:# 目標(biāo)作用對象匈勋,可以是Deployment、ReplicationController或ReplicaSet? scaleTargetRef:? ? apiVersion: apps/v1? ? kind: Deployment? ? name: php-apache# Pod副本數(shù)量的最小值和最大值? minReplicas: 1? maxReplicas: 10# 目標(biāo)指標(biāo)菲盾。在metrics中通過參數(shù)type定義指標(biāo)類型颓影;通過參數(shù)target定義響應(yīng)的指標(biāo)目標(biāo)值,系統(tǒng)將在指標(biāo)數(shù)據(jù)達到目標(biāo)值觸發(fā)擴縮容操作? metrics:? ? - type: Resource? ? ? resource:? ? ? ? name: cpu? ? ? ? target:? ? ? ? ? type: Utilization? ? ? ? ? averageUtilization: 50
可以將metrics中的type(指標(biāo)類型)設(shè)置為以下三種:
Resource:基于資源的指標(biāo)值懒鉴,可以設(shè)置的資源為CPU和內(nèi)存诡挂。
Pods:基于Pod的指標(biāo),系統(tǒng)將對全部Pod副本的指標(biāo)值進行平均值計算临谱。
Object:基于某種資源對象(如Ingress)的指標(biāo)或應(yīng)用系統(tǒng)的任意自定義指標(biāo)璃俗。
Resource類型的指標(biāo)可以設(shè)置CPU和內(nèi)存。對于CPU使用率悉默,在target參數(shù)中設(shè)置averageutilization定義目標(biāo)平均CPU使用率城豁。對于內(nèi)存資源,在target參數(shù)中設(shè)置AverageValue定義目標(biāo)平均內(nèi)存使用值抄课。指標(biāo)數(shù)據(jù)可以通過API“metrics.k8s.io”進行查詢唱星,要求預(yù)先啟動Metrics Server服務(wù)。
Pods類型和Object類型都屬于自定義指標(biāo)類型跟磨,指標(biāo)的數(shù)據(jù)通常需要搭建自定義Metrics Server和監(jiān)控工具進行采集和處理间聊。指標(biāo)數(shù)據(jù)可以通過API“custom.metrics.k8s.io”進行查詢,要求預(yù)先自定義Metrics Server服務(wù)抵拘。
類型為Pods的指標(biāo)數(shù)據(jù)來源于Pod對象本身哎榴,其target類型只能使用AverageValue。
# 其中Pod的指標(biāo)名為packets-per-second僵蛛,在目標(biāo)指標(biāo)平均值為1000時觸發(fā)擴縮容操作metircs:? - type: Pods? ? pods:? ? ? metric:? ? ? ? name: packets-per-second? ? ? target:? ? ? ? type: AverageValue? ? ? ? averageValue: 1k
類型為Object的指標(biāo)數(shù)據(jù)來源于其他資源對象或任意自定義指標(biāo)尚蝌,其target指標(biāo)類型可以使用Value或Average Value(根據(jù)副本數(shù)計算平均平均值)進行設(shè)置。
# 例1:設(shè)置指標(biāo)的名稱為requests-per-second充尉,其值來源于Ingress“main-route”飘言,將目標(biāo)值設(shè)置為2000,即在Ingress的每秒請求達到2000時觸發(fā)擴縮容操作驼侠。metircs:? - type: Object? ? object:? ? ? metric:? ? ? ? name: requests-per-second? ? ? describedObject:? ? ? ? apiVersion: extensions/v1Beta1? ? ? ? kind: Ingress? ? ? ? name: main-route? ? ? target:? ? ? ? type: value? ? ? ? value: 2k# 例2:設(shè)置指標(biāo)的名稱為http_requests热凹,并且在該資源對象具有標(biāo)簽“verb=GET”,在指標(biāo)平均值達到500時觸發(fā)擴縮容操作泪电。metircs:? - type: Object? ? object:? ? ? metric:? ? ? ? name: http_requests? ? ? ? selector: verb=GET? ? ? target:? ? ? ? type: AverageValue? ? ? ? averageValue: 500
在同一個HorizontalPodAutoscaler資源對象中定義多個類型的指標(biāo)般妙,系統(tǒng)將針對每種類型的指標(biāo)都計算副本的目標(biāo)數(shù)量,以最大值為準(zhǔn)進行擴縮容準(zhǔn)備相速。
apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:? name: php-apache? namespace: defaultspec:# HPA的伸縮對象描述碟渺,HPA會動態(tài)修改該對象的pod數(shù)量? scaleTargetRef:? ? apiVersion: apps/v1? ? kind: Deployment? ? name: php-apache# HPA的最小pod數(shù)量和最大pod數(shù)量? minReplicas: 1? maxReplicas: 10# 監(jiān)控的指標(biāo)數(shù)組,支持多種類型的指標(biāo)共存? metrics:# Object類型的指標(biāo)? ? - type: Object? ? ? object:? ? ? ? metric:# 指標(biāo)名稱? ? ? ? ? name: requests-per-second# 監(jiān)控指標(biāo)的對象描述突诬,指標(biāo)數(shù)據(jù)來源于該對象? ? ? ? describedObject:? ? ? ? ? apiVersion: networking.k8s.io/v1beta1? ? ? ? ? kind: Ingress? ? ? ? ? name: main-route# Value類型的目標(biāo)值苫拍,Object類型的指標(biāo)只支持Value和AverageValue類型的目標(biāo)值? ? ? ? target:? ? ? ? ? type: Value? ? ? ? ? value: 10k# Resource類型的指標(biāo)? ? - type: Resource? ? ? resource:? ? ? ? name: cpu# Utilization類型的目標(biāo)值芜繁,Resource類型的指標(biāo)只支持Utilization和AverageValue類型的目標(biāo)值? ? ? ? target:? ? ? ? ? type: Utilization? ? ? ? ? averageUtilization: 50# Pods類型的指標(biāo)? ? - type: Pods? ? ? pods:? ? ? ? metric:? ? ? ? ? name: packets-per-second# AverageValue類型的目標(biāo)值,Pods指標(biāo)類型下只支持AverageValue類型的目標(biāo)值? ? ? ? target:? ? ? ? ? type: AverageValue? ? ? ? ? averageValue: 1k# External類型的指標(biāo)(用于對外部系統(tǒng)指標(biāo)的支持)? ? - type: External? ? ? external:? ? ? ? metric:? ? ? ? ? name: queue_messages_ready# 該字段與第三方的指標(biāo)標(biāo)簽相關(guān)聯(lián)? ? ? ? ? selector:? ? ? ? ? ? matchLabels:? ? ? ? ? ? ? env: stage? ? ? ? ? ? ? app: myapp# External指標(biāo)類型下只支持Value和AverageValue類型的目標(biāo)值? ? ? ? target:? ? ? ? ? type: AverageValue? ? ? ? ? averageValue: 30