Pod详解
▶ Pod资源清单
apiVersion: v1
kind: Pod
metadata:
name: string
namespace: string
labels:
- name: string
spec:
initContainers:
- name: test -mysql
image: busybox
command: ["/bin/sh","-c","until ping xx.xx.xx.x -c 1;do echo xxx;done"]
#检测MySQL启动了,才启动主容器
containers:
- name: string
image: string
imagePullPolicy: [Always|Never|IfNotPresent] #获取镜像策略
command: [string] #容器的的启动命令,如不指定,使用打包时的命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #存储卷名称
mountPath: string #存储卷在容器内mount的绝对路径
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hosotPort: int #容器所在主机需要监听的端口号
protocol: string #端口协议,支持TCP和UPD,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源上限
cpu: string
memory: string
requests: #资源下限
cpu: string
memory: string
lifecycle: #生命周期钩子
postStart: #容器启动后立刻执行此钩子,如果失败,根据重启策略重启
exec #在容器内执行一次命令
tcpSocket #在容器内尝试访问指定的端口
httpGet #在容器内向某url发起http请求
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #对pod内各容器健康检查的设置,当探测无响应几次后重启
StartupProbe| ReadinessProbe| livenessProbe
---|---|---
启动探针| 就绪探针| 存活探针
commed httpget tcpsocket
**exec: #对pod容器内检查方式设置为exec方式**
command: [string] #exec方式需要制定的命令或脚本
**httpGet: #健康检查方法**
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
**tcpSocket: #健康检查方法**
port: number
initialDelaySeconds: 0 #首次探测的时间/s
timeoutSeconds: 0 #健康检查探测超时时间,默认1秒
periodSeconds: 0 #定期探测时间,默认10秒一次

successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
nodeName: <string> #设置该Pod将被调度到哪个node节点上
nodeSelector: object #设置将该Pod调度到包含这个label的节点上
imagePullSecrets: #pull镜像时使用的secret名称
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false
volumes: #在该pod上定义共享存储卷列表
- name: string #卷名(columes类型有很多种)
emptyDir: {} #类型为emptyDir,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath,表示挂载pod所在宿主机的目录
path: string
secret: #类型为secret,挂载集群与定义的secret对象到容器内部,存放密码、密钥、token这类敏感信息
secretname: string
items:
- key: string
path: string
configMap: #类型为configMap,挂载预定义的configMap对象到容器内部,存放配置文件、环境配置
name: string
items:
- key: string
path: string
### ▶ pod的创建过程
1.要创建的pod信息提交给apiServer
2.apiServer生成pod对象的信息,将信息存入etcd
3.其他组件使用list--watch机制来跟踪检查apiServer上的变动
4.scheduler发现有新的pod对象要创建,开始为pod分配主机并将结果信息更新至apiServer
5.node节点上的kubelet发现有pod调度过来,尝试调用docker启动容器,并将结果回送至apiServer
6.apiServer将接收到的pod状态信息存入etcd
▶ pod的生命周期过程
1.提交清单 准入校验
用户提交pod资源清单,交给apiServer做认证、鉴权、准入校验
• 校验失败------>直接准入失败
• 校验通过------>pod进入pending阶段,等待调度、拉镜像、挂载存储
2.调度+pause容器+初始化容器(Init Container)
调度器成功分配节点之后,判断有没有init容器
• 有init容器:顺序串行执行所有init容器。只要任意init容器启动失败/退出码非0,按重启策略重启,失败则状态置为Failed。全部Init容器执行成功,才会启动主容器。
• 无init容器:直接启动主容器
3.PostStart钩子 进入Running
主容器启动后,立刻执行PostStart生命周期钩子(容器启动后触发,钩子异常不会重试)。钩子成功执行后,Pod进入Running阶段,开始执行三类探针:
• StartupProbe启动探针:
判断容器是否成功启动,失败会触发容器重启
• ReadinessProbe就绪探针:
就绪失败时,会把Pod从Service的Endpoint擦除(不再接收流量,但Pod继续运行)
• LivenessProbe存活探针:
连续探测失败,判定容器卡死,触发容器重启。
探针全部正常,则容器对外正常提供业务服务
4.终止流程(Terminating阶段)
两种场景进入终止:
• 执行kubectl delete收到SIGTERM信号
• 节点宕机/网络失联(节点失联时Pod标记为Unknown)
5.进入优雅终止宽限期,执行PreStop钩子(容器关闭前的清理逻辑)
6.钩子执行完,向容器进程发送SIGTERM信号
7.等待容器进程退出
• 进程退出码=0:正常完成任务----->Pod状态Succedded
• 进程退出码!=0:异常退出,进入重启策略判断
8.重启策略RestartPolicy分支
• Always/OnFailure:
触发重启,多次失败后进入CrashLoopBackOff(指数退避等待重试)
• Never:
不重启,Pod直接标记为Failed
▶ Pod调度
1.自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
2.定向调度:NodeName、NodeSelector
3.亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
4.污点/容忍调度:Taints(节点上设置)、Toleration(Pod上设置)
• 定向调度
▪ NodeName
优先级最高,NodeName强制约束调度(忽略污点),因为是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点
**即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已**
yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: pod-nodename
namespace: demo
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeName: node1 #指定调度到node1节点上
### ▪ NodeSelector
用于将pod调度到添加了指定标签的node节点上
1.为node节点添加标签:
kubectl label nodes node1 tag=test
2.创建yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: nodeselector
namespace: demo
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeSelector:
tag: test #指定调度到具有tag=test标签的节点上
#### • 亲和性调度(节点亲和性、pod亲和性、pod反亲和性)
### ▪ NodeAffinity(node亲和性)
yaml文件:
……
……
containers:
……
affinity: #亲和性设置
nodeAffinity: #设置node亲和性
requiredDuringSchedulingIgnoredDuringExecution:
#硬限制
nodeSelectorTerms:
- matchExpressions: #匹配env的值
- key: env
operator: In
values: ["xxx","yyy"]
### ▪ PodAffinity(pod亲和性)
yaml文件
……
containers:
……
affinity:
podAffinity: #pod亲和性
require…………
- labelSelector:
matchExpressions: #匹配值
- key: tag
operator: In
values: ["xxx","yyy"]
topologyKey: kubernetes.io/hostname
### ▪ PodAntiAffinity(pod反亲和性)
yaml文件
affinity:
podAntiAffinity:
………………
………………
#### • 污点和容忍
### 污点(Taints):只有工作节点可以配置污点
▪ PreferNoSchedule:尽量不来,除非没办法
▪ NoSchedule:新的不要来,在这里的就别动了
▪ NoExecute:新的不要来,在这里的赶紧走
**命令操作:**
设置污点:
kubectl taint nodes node1 key=value:effect
去除污点:
kubectl taint nodes node1 key:effect-
去除所有污点:
kubectl taint nodes node1 key-
查看节点污点:
kubectl describe pods | grep -i taint
容忍(Toleration):pod上配置容忍
配置yaml文件:
……
……
containers:
……
……
tolerations:
- key: "tag" #要容忍的污点
operator: "Equal" #操作符
value: "hello" #容忍的污点的value
effect: "NoExecute" #添加容忍的规则,必须和污点相同