Pod对象
Pod对象
相关的pod控制器,都是以此为基础,pod对象支持的方法,控制器一般也支持
pod对象也是pod控制器,最基础最小的控制单位。而pod控制器又有多种:
- Pod控制器
- ReplicaSet控制器 #过时了
- ReplicationController控制器 #过时了
- Deployment控制器
- StatefulSet控制器
- DaemonSet控制器
- Job控制器
- CronJob控制器
语法格式:
kubectl explain Pod #查看详细语法格式
spec:
annotations: #注解,也是k-v标记,但与label不同,只能为对象提供元数据
activeDeadlineSeconds: <integer> #定义了Pod可以运行的最长时间。时间从Pod开始运行计算,超过了就停止pod
affinity <Object> #亲和,详细内容看调度器部分
automountServiceAccountToken: 布尔值 #是否自动挂载sa
containers <[]Object>
- name <str>
image <str>
imagePullPolicy 方式 #拉取镜像方式
#IfNotPresent为本地没有再去外面找
#Never是只在本地找
#Always是只在外面找
ports: <[]str> #容器端口暴露列表
- name: 名称 #名称不能是数字
containerPort: 容器端口
command <[]str> #启动容器时的命令,若没有指定则使用容器自身的ENTRYPOINT
env <[]Object>
envFrom <[]Object>
args <[]str> #对应dockerfile中的cmd
livenessProbe #生存探测相关
exec #命令探针
command <[]str>
httpGet #http探针
host <string> #默认当前pod的ip
httpHeaders <[]Object> #请求的首部
path <string> #url
port <string>
scheme <string>
tcpSocket #tcp探针
host <str>
port <str>
grpc <Object> #grpc探针,新特性,需要启用GRPCContainerProbe
failureThreshold #失败几次为错误,默认连续失败3次判定
periodSeconds #每次间隔时间,默认10s
timeoutSeconds #每次探测的超时时间,默认1s
initialDelaySeconds #容器启动多久后才开始探测
successThreshold #成功几次转为ok
lifecycle #启动钩子,启动前/后操作
postStart #启动前操作
exec #执行的探针
command
preStop #关闭前操作。用于容器非正常关闭时,执行保存数据什么的
exec #执行的探针
command
readinessProbe #就绪探针,与存活探针一样h
resources <Object> #资源限制,看资源限制部分
volumeMounts <[]Object> #看存储部分
workingDir <string> #指定容器中的工作目录
dnsConfig <Object> #dns配置
dnsPolicy <string> #设置pod的DNS策略。默认为“ClusterFirst”,要与hostNetwork一起设置DNS选项,必须指定DNS策略为'ClusterFirstWithHostNet'
#ClusterFirst,表示pod首先使用集群DNS除非hostNetwork为true,否则如果它可用,则返回到默认(由kubelet决定)DNS设置
#ClusterFirstWithHostNet,表示pod应该使用集群DNS首先,如果它可用,则退回到默认值(由kubelet) DNS设置
#Default,表示pod应该使用默认值(根据实际情况而定)通过kubelet) DNS设置
#None,表示pod使用空DNS设置。DNS诸如名称服务器和搜索路径之类的参数应该通过定义DNSConfig
enableServiceLinks <boolean> #是否将svc信息注入到pod的环境变量中,以匹配Docker链接的语法。默认为true,当集群内svc量比较大时需要关闭,如1.6w个svc自动注入时,会导致cpu利用率多20%
ephemeralContainers: <[]Object> #允许在一个已经存在的Pod中临时添加一个新的容器。可以用来调试Pod
#临时容器在Pod的生命周期结束时不会被重启。
#临时容器不能添加到Pod的规格中,只能通过更新Pod来添加。
#临时容器可以访问Pod的所有共享命名空间,包括网络和IPC
hostAliases: <[]Object> #传入自定义hosts解析,追加到pod的/etc/hosts文件
hostIPC: <boolean> #使用物理机的ipc命名空间,获取所有ipc信息,默认false
hostNetwork: 布尔值 #使用物理机的网络命名空间,获取所有网络信息,默认false
hostname: 名称 #自定义pod中容器名,默认随机字符
hostPID: <boolean> #使用物理机的pid命名空间,获取所有pid,默认false
imagePullSecrets <[]Object> #访问镜像仓库时需要指定密码才用,与底层的cri可以拉镜像是两个单独配置,必须要底层cri可以访问到仓库(包括私有),这里配置访问该仓库的账号密码,且secret类型必须是docker-registry类型的(可直接是被),其他的类似的只能以存储卷方式挂载到:~/.docker/config.json,不能在这里配置,踩坑排了一天才找到问题
initContainers: #初始化容器,在启动普通容器之前,可做一些初始化数据,配置与containers方法一样
nodeName <str> #运行在指定node
nodeSelector <map[string]string> #节点标签选择器
标签名: 值
preemptionPolicy: <string> #定义了Pod的抢占策略。抢占是Kubernetes调度器的一个特性,当集群中没有足够的资源来运行新的Pod时,调度器可以停止一个或多个正在运行的低优先级的Pod,以释放资源给高优先级的Pod
#PreemptLowerPriority,可以抢占低优先级的Pod,默认此
#Never,永远不会抢占其他Pod
priority: int #设置Pod的优先级。值越大,优先级越高。这个字段的值可以是任何32位整数,包括负数
priorityClassName: str #设置Pod的优先级类。优先级类是一种在集群中定义Pod优先级的方式。你可以创建自己的优先级类,也可以使用Kubernetes预定义的优先级类
#system-cluster-critical
#system-node-critical
#high-priority
readinessGates: #指定额外的条件,这些条件必须满足才能将Pod的状态设置为Ready
- conditionType: 自定义状态 #描述Pod状态的键值对。readinessProbe都返回成功时,检查readinessGates列表中的所有条件。如果所有的条件都满足,Pod的状态就会被设置为Ready
restartPolict: 策略 #容器重启策略
#Always,一直重启,每次重启失败后下一次重启时间都叠加
#UnFatlure,只有有错误时
#Never,失败后从不重启
schedulerName: 调度器 #指定pod调度器,空为使用默认的
securityContext:
privileged: true #启用特权用户
runAsUser: 0 #用户uid
runAsNonRoot: true #
serviceAccountName: sa账户 #指定pod使用的sa
setHostnameAsFQDN: 布尔值 #指定是否将Pod的完全限定域名(FQDN)设置为其主机名。如果设置为true,Pod的FQDN将被设置为其主机名,而不是只有主机名,默认false
shareProcessNamespace: 布尔值 #指定Pod中的所有容器是否共享同一个进程命名空间,默认false关闭
subdomain: str #指定Pod的子域名。这个字段通常与hostname字段一起使用,以构造Pod的完全限定域名(FQDN)
terminationGracePeriodSeconds: 秒 #pod优雅终止时间,发起关闭pod信号后多久kill,默认30s
tolerations <[]Object> #看调度器部分
topologySpreadConstraints <[]Object> #描述Pod在拓扑上的分布约束。每个约束都指定了一种拓扑类型(如节点、区域等),一个匹配标签的选择器,以及一个期望的分布策略(如平均分布等)。这个特性可以用来确保Pod在集群的拓扑上均匀分布,从而提高集群的可用性和性能
- labelSelector:
matchExpressions:
matchLabels:
maxSkew: <integer> -required #描述在拓扑域中允许的最大偏差。例如,如果设置为1,那么在任何拓扑域中,Pod的数量最多可以比其他域多1个
minDomains: int #描述满足约束的最小拓扑域的数量
topologyKey: <string> -required #指定拓扑类型。例如,如果设置为kubernetes.io/hostname,那么约束将应用于每个节点
whenUnsatisfiable: <string> -required #描述当约束不能满足时的行为
#DoNotSchedule,不调度Pod
#ScheduleAnyway,无论如何都调度Pod
volumes <[]Object> #看存储部分
配置文件案例:
例1:简单运行pod
apiVersion: v1
kind: Pod
metadata:
name: pod-t1
namespace: default
labels:
app: my-t1
tier: frontend
spec:
containers:
- name: t1-alpine
image: alpine
command: ["tail","-f","/etc/hosts"]
- name: t1-box
image: busybox
command:
- "sh"
- "-c"
- "sleep 3000"
pod生命周期:
一个pod创建时可能有多个容器运行,但必须有一个主容器。也可能有多个初始化容器,串行初始化,初始化完成后,可能运行主容器启动前容器(可运行启动前的操作),再是主容器,最后是启动后容器
- 初始化容器: initcontainer
- 主容器启动: containers
- 执行各个探针,直到pod停止
pod创建过程:
- 调用apiserver
- apiserver把目标状态保持在etcd中,controller manager从api-server监听到创建pod请求,处理请求
- scheduler从api-server监听到未绑定(调度)pod,开始资源评估,如果调度成功就把结果更新在etcd中
- node节点的kubelet从api-server中监听到有pod调度到本地,开始获取任务清单,在本地创建pod
pod生命终止:
- 默认30s,发送终止pod指令后,发送15信号,并等待30s,超过则发送9信号
pod状态:
第一阶段出现:
- pending 正在创建pod,但未创建完。此时pod在检查依赖、存储挂载、镜像、调度功能是否正常
- failed 有容器启动失败导致pod异常
- succeeded pod中所有容器被成功终止(terminated)
- unkonwn node的kubelet故障
第二阶段出现:
- unschedulable pod不能被调度,调度器内有匹配到合适的node节点。如cpu、内存、标签没有满足的没有满足的
- podscheduled pod正处于调度中,调度器刚开始调度 的时候,还没有将pod分配指定的pid,还在调度器的筛选阶段
- initialized 所有pod的初始化容器已经完成
- imagepullbackoff pod的所在的node节点镜像下载失败
- crashLoopBackOff pod启动失败,陷入无线重启死循环。可能因为容器自身主进程启动错误、存活性探测有问题
- running pod内部的容器已经被创建并完成
- ready 表示pod中的容器已经可以提供访问服务
其他状态:
Error #pod启动过程中发生错误
NodeLost #Pod所在节点失联
waiting #Pod等待启动
Terminating #Pod正在被销毁
InvalidImageName #node节点无法解析镜像名称导致的镜像无法下载
ImageInspectError #无法校验镜像,镜像不完整导致
ErrImageNeverPull #策略禁止拉取镜像,镜像中心权限是私有等
RegistryUnavailable #镜像服务器不可用,网络原因或harbor岩机
ErrImagePull #镜像拉取出错,超时或下载被强制终止
CreatecontainerconfigError #不能创建kubelet使用的容器配置
createContainerError #创建容器失败
PreStartCcontainer #执行prestart hook报错,Pod hook(钩子)是由Kubernetes管理的 kubelet 发起的。当容器中的进程启动前或者容器中的进程终止之前运行,比如容器创建完成后里面的服务启动之前可以检查一下依赖的其它服务是否启动,或者容器退出之前可以把容器中的服务先通过命令停止。
PostStartHookError #执行postStart hook报错
RunContainerError #pod运行失败,容器中没有初始化PID为1的守护进程等
ContainersNotInitialized #pod没有初始化完毕
ContainersNotReady #pod没有准备完毕
ContainerCreating #pod正在创建中
PodInitializing #pod正在初始化中
DockerDaemonNotReady #node节点decker服务没有启动
NetworkPluginNotReady #网络插件还没有完全启动
容器探测:
在主容器的启动等待时间内,做状态探测,每隔3s做一次
生命周期的重要行为:
- 初始化容器
- 容器探测
2种探测类型: #可同时配置
- 存活性探测(liveness): 主容器是否处于运行状态
- 就绪性探测(realiness): 主容器内的主进程是否就绪,且可以提供服务
3种探针类型: #两种探测都使用这三个
- ExecAction 执行shell命令探测
- TCPSocketAction tcp探测
- HTTPGetAction http探测
容器钩子:
可实现容器启动之前、关闭之前的操作。支持3种探针,一般使用exec探针
- postStart 容器启动之前执行
- preStop 容器关闭之前执行
案例:
例1:生存探测使用exec探针
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
name: liveness
spec:
replicas: 1
selector:
matchLabels:
app: live
template:
metadata:
labels:
app: live
spec:
containers:
- name: liveness
image: busybox
imagePullPolicy: IfNotPresent
#正常运行
command: ["sh","-c","touch /tmp/xxx; sleep 30; chmod +x /tmp/xxx; sleep 3600"]
#模拟故障
#command: ["sh","-c","touch /tmp/xxx; sleep 30; rm -rf /tmp/xxx; sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/xxx"]
initialDelaySeconds: 1
periodSeconds: 3
例2:生存探测使用httpget探针
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-get
spec:
replicas: 1
selector:
matchLabels:
app: http-get
template:
metadata:
labels:
app: http-get
spec:
containers:
- name: ngx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
livenessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
例3: 就绪探测使用http探针
apiVersion: apps/v1
kind: Deployment
metadata:
name: ready-http
spec:
replicas: 1
selector:
matchLabels:
app: ready-http
template:
metadata:
labels:
app: ready-http
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
例4: 容器启动前钩子
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-hook
spec:
replicas: 1
selector:
matchLabels:
app: hook
template:
metadata:
labels:
app: hook
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["sh","-c","echo xxxx > /tmp/index.html"]
command: ["sh","-c","sleep 3000"]