学习目标:
- 了解探针和探测容器的方式
- Pod的状态值
- Pod分类及控制器说明
学习内容:
容器探针
探针是由kubelet对容器执行的定期诊断,kubelet调用由容器实现的Handler,有三种类型的处理程序:
- ExecAction:在容器内执行指定命令,如果命令退出时返回码为0,则认为诊断成功
- TCPSocketAction:对指定端口上的容器的ip地址进行TCP检查,如果端口打开,则诊断被认为是成功的
- HTTPGetAction:对指定的端口和路径上的容器的ip地址进行HTTP Get请求,如果响应的状态码大于等于200且小于400,则诊断被认为是成功的
备注:每次探测都将获得以下三种结果之一:
- 成功:容器通过了诊断
- 失败:容器未通过诊断
- 未知:诊断失败,因此不会采取任何行动
探测方式
- livenessProbe:指示容器是否正常运行,如果存活探测失败,则kubelet会杀死容器,并且容器将收到重启策略的影响,如果容器不提供存活探针,则默认状态为Success
- readinessProbe:指示容器是否准备准备好接受服务请求,如果就绪探测失败,端点控制器将从与Pod匹配的所有Service的端点中删除该Pod的ip地址,初始延迟之前的就绪状态默认为Failure,如果容器不提供就绪探针,则默认状态为Success
Pod phase可能存在的值
- 挂起(Pending):Pod已经被kubernetes系统接受,但有一个或多个容器镜像尚未创建,等待时间包括调度Pod的时间和通过网络下载镜像的时间,这可能需要花点时间
- 运行中(running):该Pod已经绑定到一个节点上,Pod中所有的容器已经被创建,至少有一个容器正在运行,或者正处于启动或重启状态
- 成功(Succeeded):Pod中所有容器都被成功终止,并且不会再重启
- 失败(Failed):Pod中所有容器都已终止了,并且至少有一个容器是因为失败终止,也就是说,容器以非0状态退出或被系统终止
- 未知(Unknown):因为某些原因无法取得Pod的状态,通常是因为与Pod所在主机通信失败
Pod的分类
- 自主式Pod:Pod退出了,此类型的Pod不会被创建
- 控制器管理的Pod:在控制器的生命周期里,始终要维持Pod的副本数目
说明:
-
RC和RS:RC用来确保容器应用的副本数目始终保持在用户定义的数目,即容器异常退出,会自动创建新的Pod来代替,而如果异常多出的容器会回收;新版本K8S的RS取代了RC,并且RS支持集合试Selector,即标签labels。
-
Deployment:为Pod和RS提供了一个声明式定义方法,用来替代以前的RC来方便管理应用,典型场景包括:
定义Deployment来创建Pod和RS 滚动升级和回滚应用 扩容和缩容 暂停和继续Deployment
-
DaemonSet:确保全部或一些Node上运行一个Pod副本,当有Node加入集群时,也会为他们新增一个Pod,当有Node从集群移除时,这些Pod也会被回收,删除DaemonSet将会删除它创建的所有Pod,典型场景:
运行集群存储daemon 在每个Node上运行日志收集daemon 在每个Node上运行监控daemon
-
Job:负责批处理任务,即执行一次的任务,它保证批处理的一个或多个Pod成功结束
-
CronJob:基于时间管理的Job,即在给定时间内只运行一次,周期性的给定时间点运行,典型场景:
数据库备份 发送邮件
-
StatefulSet:作为controller为Pod提供唯一的标识,保证部署和scale的顺序,解决有状态服务的问题(对应Deployments和RS是为无状态服务而设计)典型场景:
稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC实现 稳定的网络标识,即Pod重新调度后PodName和HostName不变,基于Headless service(即没有Cluster IP的service)来实现 有序部署,扩展,即Pod是有顺序的,在部署或者扩展是要依据定义的顺序依次进行(即从0到N-1),在下一个Pod运行之前所有之前的Pod必须都是Running状态,基于init containers来实现 有序收缩,有序删除(即从N-1到0)
-
HPA(Horizontal Pod Autoscaling):使Pod水平自动缩放