3. Pod
3.1 什么是Pod?
| Pod是Kubernetes集群中最小部署单元,一个Pod由一个容器或多个容器组成,每个Pod还包含一个Pause容器,Pause容器是Pod的父容器或者叫根容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等 |
| Pod有以下特点: |
| (1)一个Pod可以理解成一个应用实例,提供服务; |
| (2)Pod中容器始终部署在同一个Node上; |
| (3)Pod中容器共享网络,存储资源; |
| (4)Kubernetes集群是直接管理Pod,而不是容器; |
3.2 为什么要引入Pod?
| 1.解决集群之间网络的强依赖性(数据依赖性、网络依赖性、) |
| 2.唯一性Pod的IP地址保证不会冲突 |
| 3.解决集群之间暴露多个端口与Pod中共享一个数据目录 |
3.3 Pod探针
探针是由kubelet对容器执行的定期诊断,以保证pod的状态始终处于运行状态,要执行诊断,kubelet调用由容器实现的Handler(处理程序),也成为Hook(钩子),有三种类型的处理程序:
| ExecAction在容器内执行指定命令,如果命令退出时返回码为0则认为诊断成功 |
- StartupProbe启动探针(容器开始运行时执行)
| StartupProbe:在k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了StartupProbe就会先禁止其它的探测,直到它成功为止,成功后将不在进行探测。 |
- LivenessProbe存活探针(探针检查失败是否重启容器)
| LivenessProbe:用于探测容器是否运行如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。 |
- ReadinessProbe就绪探针(容器是否正常运行)
| ReadinessProbe:一般用于探测容器内的程序是否健康,它的返回值如果为success,那么久代表这个容器已经完成启动,并且程序已经是可以接收流量的状态 |
| |
| 如果就绪探针失败,端点控制器将从与Pod匹配的所有Service的端点中删除该Pod的IP地址,初始延迟之前的就绪状态默认为Failure(失败),如果容器不提供就绪探针,则默认状态为Success,readinessProbe用于控制Pod是否添加至service |
3.4 Pod探针的检测方式
| ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康 |
| TCPSocketAction:通过TCP连接检查容器内的程序是否健康,它的返回值如果为success,那么久代表这个容器已经完成启动,并且程序已经是可以接受流量的状态 |
| HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码为200~400之间,则认为容器健康 |
3.5 探针检查参数配置
| initialDelaySeconds: 60 |
| timeoutSeconds: 2 |
| periodSeconds: 5 |
| successThreshold: 1 |
| failureThreshold: 2 |
3.6 Pod常见状态
| Unschedulable: |
| PodScheduled: |
| Pending: |
| Failed: |
| Unknown: |
| Initialized: |
| ImagePullBackOff: |
| Runing: |
| Ready: |
| Error: |
| NodeLost: |
| Waiting: |
| Terminating: |
| CrashLoopBackOff: |
| InvalidImageName: |
| ImageInspectError: |
| ErrImageNeverPull: |
| RegistryUnavailable: |
| CreateContainerConfigError: |
| CreateContainerError: |
| RunContainerError: |
| ContainersNotReady: |
| ContainersNotInitialized: |
| ContainerCreating: |
| PodInitializing: |
| DockerDaemonNotReady: |
| NetworkPluginNotReady: |
3.7 Pod调度流程

| 1.客户端创建Pod由api-server接收请求并鉴权(/root/kube/config) |
| 2.然后写入到etcd、并返回给api-server |
| 3.Scheduler会收到api-server任务信息,Scheduler将不能调度node过滤掉,在可用的节点中进行打分或者选举然后进行调度,调度成功了。把结果返回给api-server这个返回的过程叫 bind pod,然后在写入到etcd,在返回给api-server(写入完成),然后在同步给Scheduler,调度完成 |
| 4.kubelet进行对api-server进行一个监听,进行获取事件调用运行时来运行pod |
| 5.运行时会访问harbor进行一个拉取镜像 |
| 6.kubelet创建完pod在把任务返回给api-server、api-server在写入到etcd中 |
3.8 Pause
| Pause容器,又叫Infra容器,是pod的基础容器,镜像体积只有几百KB左右,配置在kubelet中,注意的功能是一个Pod中多个容器的网络通信。 |
| |
| Infra容器被创建后会初始化Network Namespace,之后其它容器就可以加入到Infra容器中共享Infra容器的网络了,因此如果一个Pod中的两个容器A和B,那么关系如下: |
| 1.A容器和B容器能过直接使用localhost通信 |
| 2.A容器和B容器可以看到网卡、IP与端口监听信息。 |
| 3.Pod只有一个IP地址,也就是该Pod的Network Namepace对应的IP地址(由Infra容器初始化并创建) |
| 4.k8s环境中的每个Pod有一个独立的IP地址(前提是地址足够用),并且此IP被当前Pod中所有容器在内部共享使用 |
| 5.Pod删除后Infra容器随机被删除,其IP被回收 |
| |
| Pause容器共享的Namespace: |
| 1.NET Namespace: Pod中的多个容器共享同一个网络命名空间,即使用相同的IP和端口信息 |
| 2.IPC Namespace: Pod中的多个容器可以使用System VIPC或POSIX消息队列进行通信 |
| 3.UTS Namespace: Pod中的多个容器共享一个主机名 |
| |
3.9 init容器-简介
| init容器的作用: |
| 1.可以为业务容器提前准备好业务容器的运行环境,比如将业务容器需要的配置文件提前生成并放在指定位置、检查数据权限或完整性、软件版本等基础运行环境 |
| 2.可以在运行业务容器之前准备好需要的业务数据,比如从OSS对象存储下载,或者从其它位置copy |
| 3.检查依赖的服务是否能够访问 |
| |
| init容器的特点: |
| 1.一个pod可以有多个业务容器还能在有多个init容器、但是每个init容器和业务容器的运行环境都是隔离的 |
| 2.init容器会比业务容器先启动 |
| 3.init容器运行成功之后才会继续运行业务容器 |
| 4.如果一个pod有多个init容器,则需要从上到下逐个运行并且全部成功,最后才会运行业务容器 |
| 5.init容器不支持探针检测(因为初始化完成后就退出再也不运行了) |
3.10 Pod容器重启策略
Pod一旦配置探针,在检测失败的时候,会基于restartPolicy对Pod进行下一步操作
| Always:当容器异常时,k8s自动重启该容器,ReplicationController/Replicaset/Deployment,默认为Always |
| OnFailure:当容器失败时(容器停止运行且退出码不为0)k8s自动重启该容器 |
| Never:不论容器运行状态如何都不会重启该容器Job或CronJob |
3.11 Pod镜像拉取策略
| IfNotPresent:node节点没有此镜像就去指定的镜像仓库拉取,node有就使用node本地镜像 |
| Always: 每次重建pod都会重新拉取镜像 |
| Never: 从不拉取镜像,只使用本地镜像 |
3.12 探针通用配置参数
| initialDelaySeconds: 120 |
| 初始化延迟时间,告诉kubelet在执行第一次探测前应该等待多少秒,默认是0秒,最小值是0 |
| |
| periodSeconds: 60 |
| 探测周期间隔时间,指定了kubelet应该每多少秒执行一次存活探测,默认是10秒,最小值是1 |
| |
| timeoutSeconds: 5 |
| 单次探测超时时间,探测的超时后等待多少秒,默认值是1秒,最小值是1 |
| |
| successThreshold: 1 |
| 从失败转为成功的重试册数,探测器在失败后,被视为成功的最小连续成功数,默认值是1,存活探测的这个值必须是1,最小值是1 |
| |
| failureThreshold: 3 |
| 从成功转为失败的重试次数,当Pod启动了并且探测到失败,kubernetes的重试次数,存活探测情况下的放弃就意味着重新启动容器,就绪探测情况下的放弃Pod会被打上未就绪的标签,默认值是3,最小值是1 |
3.13 TCP探针参数
| 探针是由kubelet对容器执行的定期诊断,以保证Pod的状态始终处于运行状态,要执行诊断,kubelet调用由容器实现的Handler(处理程序),也成为Hook(钩子)有三种类型的处理程序: |
| |
| ExecAction: |
| 在容器内执行指定命令,如果命令退出时返回码为0则认为诊断成功 |
| |
| TCPSocketAction: |
| 对指定端口上的容器的IP地址进行TCP检查 |
| |
| HTTPGetAction: |
| 对指定的端口和路径上的容器的IP地址执行HTTPGet请求,如果响应的状态码大于等于200且小于400,则认为诊断是成功的 |
| |
| 每次探测都将获得以下三种结果之一: |
| 成功:容器通过了诊断 |
| 失败:容器未通过诊断 |
| 未知:诊断失败,因此不会采取任何行动 |
3.14 HTTP探针参数
| HTTP探测器可以在httpGet上配置额外的字段: |
| host: |
| 连接使用的主机名,默认是Pod的IP,也可以在HTTP头中设置“Host”来代替 |
| |
| scheme: http |
| 用于设置连接主机的方式(HTTP还是HTTPS),默认是HTTP |
| |
| path: /monitor/index.html |
| 访问HTTP服务的路径 |
| |
| httpHeaders: |
| 请求中自定义的HTTP头,HTTP头字段允许重复 |
| |
| port:80 |
| 访问容器的端口号或者端口名,如果数字必须在 1 ~ 65535 之前 |