5. kubernetes pod控制器應(yīng)用
[TOC]
本文基于馬哥的docker和k8s視頻總結(jié), 在此致謝馬哥.
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels: # 直接在metadata中打標(biāo)簽
app: myapp
tier: frontend # 分層標(biāo)簽
annotations: # 自定義的資源注解
alexti/created-by: "cluster admin"
spec:
containers:
- name: myapp # 創(chuàng)建的第一個(gè)容器的容器名
image: nginx:1.14-alpine # 容器所使用的鏡像
ports: # 暴露端口
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox # 創(chuàng)建的第二個(gè)容器的容器名
image: busybox:latest
imagePullPolicy: IfNotPresent
command: # 修改容器啟動(dòng)時(shí)使用的默認(rèn)命令
- "/bin/sh"
- "-c"
- "sleep 3600"
nodeSelector: # 選擇安裝在標(biāo)簽為diskytpe且值為ssd的node上, 需要先給節(jié)點(diǎn)打上標(biāo)簽
disktype: ssd # 必須要裝在有此標(biāo)簽的node上, 找不到此標(biāo)簽, pod會(huì)被pending
配置Pod資源中的spec
內(nèi)嵌字段
spec.containers <[]object>
- name <string>
image <string> # 指定特定路徑中的鏡像
imagePullPolicy <string>
# Always, Never, IfNotPresent, 此字段在對(duì)象創(chuàng)建后不可更改
# Always: 就算本地有鏡像, 也不用而是直接去下載, latest標(biāo)簽的鏡像默認(rèn)使用Always
# Never: 本地有就用, 沒(méi)有則不下載, 想用必須用戶(hù)手動(dòng)下載
# IfNotPresent: 本地存在就用, 沒(méi)有就去下載
ports <[]object>
# name <string>
# containerPort <interger> -required-
args <[]object>
# 如果自行手動(dòng)指定了args參數(shù), 則會(huì)覆蓋鏡像中CMD指定的內(nèi)容
# 特別注意變量引用使用的格式: $(VAR_NAME)
# 如果一定要使用命令引用的方式: $$(VAR_NAME)
command <[]object>
# Entrypoint array. Not executed within a shell
# 一旦定義了command, 鏡像中的Cmd和Entrypoint都會(huì)失效
# 如果只定義了args, 沒(méi)定義command,
# 則會(huì)將args定義的值作為參數(shù)傳遞給鏡像中的Entrypoint
livenessProbe <object>
readinessProbe <object>
# exec
# httpGet
# tcpSocket
# initialDelaySeconds <integer> 初始化之后延遲探測(cè)時(shí)間, 默認(rèn)立刻探測(cè)
# failureThreshold <integer> 探測(cè)幾次失敗, 才認(rèn)為是失敗的, 默認(rèn)3次
# periodSeconds <integer> 每次探測(cè)間隔, 默認(rèn)10s
# timeoutSeconds <integer> 每次探測(cè)無(wú)響應(yīng)時(shí)等待時(shí)間, 默認(rèn)1s
lifecycle
# postStart
# preStop
# exec
# httpGet
# tcpSocket
spec.nodeSelector <map[string]string>
# 節(jié)點(diǎn)標(biāo)簽選擇器
spec.nodeName <string>
# 指定部署在哪個(gè)節(jié)點(diǎn)上
spec.restartPolice <string>
# Always, OnFailure, Never. Default to Always
# Always 一旦容器掛了, 就會(huì)重啟
# OnFailure 只有狀態(tài)為Failure時(shí)才重啟, 正常終止時(shí)不會(huì)重啟
# Never 從不重啟
metadata.annotations
# 與label不同的是, 它不能用于挑選資源對(duì)象, 僅用于為對(duì)象提供"元數(shù)據(jù)"
- args和command區(qū)別示例:
args和command區(qū)別示例.png
標(biāo)簽
標(biāo)簽與對(duì)象是多對(duì)多的關(guān)系(一個(gè)標(biāo)簽可以貼多個(gè)對(duì)象, 一個(gè)對(duì)象也可以被貼多個(gè)標(biāo)簽)
- key=value
- key和value字符長(zhǎng)度都要小于等于63
- key不可為空, value可為空
# 顯示標(biāo)簽為app的那類(lèi)pod
kubectl get pods -l app [--show-labels]
kubectl get pods -l app=myapp,tire!=frontend
kubectl get pods -l "release notin (canary,beta,alpha)"
# 顯示標(biāo)簽以及標(biāo)簽值
kubectl get pods -L app,run
# 打標(biāo)簽, 已有標(biāo)簽時(shí)會(huì)報(bào)錯(cuò), 除非使用--overwrite
kubectl label pods pod-demo release=canary
kubectl get pods -l app [--show-labels]
標(biāo)簽選擇器
- 等值關(guān)系:
=, ==, !=
- 集合關(guān)系:
KEY in|notin (VALUE1, VALUE2, ...)
-
!KEY
: 不存在此鍵的資源
許多資源支持內(nèi)嵌字段定義其使用的標(biāo)簽選擇器:
matchLabels: # 直接給定鍵值
matchExpressions: # 基于給定的表達(dá)式來(lái)定義使用的標(biāo)簽選擇器,
# {key:"KEY", operator:"OPERATOR", values:[VAL1,VAL2,...]}
# 操作符: In, NotIn values字段的值必須為非空列表
# Exists, NotExists values字段的值必須為空列表
Pod的生命周期
- 狀態(tài): Pending (掛起), Running(運(yùn)行), Failed, Succeeded, Unknown
- Pod生命周期中的重要行為:
- 初始化容器
- 容器探測(cè):
- 存活性探測(cè) liveness
- 就緒性探測(cè) readiness
Pod的生命周期.png
探針類(lèi)型
- (1) ExecAction
- (2) TCPSocketAction
- (3) HTTPGetAction
liveness
和readiness
對(duì)于容器來(lái)講一般要做存活性探測(cè)和就緒性探測(cè) !
exec
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
command:
- "/bin/sh"
- "-c"
- "touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"
livenessProbe:
exec:
command:
- "test -e /tmp/healthy"
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: OnFailure
httpGet
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
- name: readiness-httpget-container
image: nginx:1.14-alpine
ports:
name: http
containerPort: 80
livenessProbe:
httpGet:
port: http # 可以直接根據(jù)ports的name進(jìn)行指定, 也可以直接設(shè)置為80
path: /index.html # 指定請(qǐng)求內(nèi)容
initialDelaySeconds: 1
periodSeconds: 3
readinessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: OnFailure
postStart
和preStop
-
特別要注意
postStart
內(nèi)command
和containers
內(nèi)command
執(zhí)行的先后順序 !!!-
containers
內(nèi)的command
先執(zhí)行,postStart
內(nèi)command
后執(zhí)行!
-
apiVersion: v1
kind: Pod
metadata:
name: poststart-pod
namespace: default
spec:
containers:
- name: busybox-httpd
image: busybox:latest
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "mkdir -p /data/web/html/"
command:
- "/bin/sh"
- "-c"
args:
- "sleep 3600"
# 如果去掉上面代碼塊中的第15,16兩行, 創(chuàng)建pod然后連入pod中的容器查看進(jìn)程,
# 會(huì)發(fā)現(xiàn)PID為1的進(jìn)程會(huì)有一開(kāi)始設(shè)置的/bin/sh替換為sleep 3600, 所以后面
# exec中的command指定的命令會(huì)有報(bào)錯(cuò).
kubectl create -f /tmp/poststart-pod.yml
kubectl exec poststart-pod -c busybox-httpd -it -- /bin/sh
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep 3600
11 root 0:00 /bin/sh
17 root 0:00 ps -ef