其他分享
首页 > 其他分享> > Deployment必须包含资源对象

Deployment必须包含资源对象

作者:互联网

存活探针(livenessprobe)和就绪探针(readinessprobe),语法相似,但功能不同,存活探针主要是用于检测服务是否正常启动,如果不正常,则重建 pod,直到正常为止,使用过程中要注意初始化延迟时间,如果设置时间太短,可能会导致 Pod 创建进入死循环,影响服务正常启动。

就绪探针主要是用于服务是否能够正常对外提供服务,如果不正常则从端点服务列表中移除,直到正常为止。

探针这个功能是 Kubernetes 中很接地气的一个设计,分布式系统很棘手的一个问题就是服务数量众多,存在一定量的僵尸服务,常规的做法通过侵入式设计,在服务中添加接口,循环检测,发现问题消息通知,在这种机制下消息往往不能得到及时解决。探针属于监控领域的一部分,要想检测服务是否正常,编排文件必须包含探针。

preStop 和 postStart 是容器生命周期的钩子,它跟存活和就绪探针类似,是在容器内部执行一个命令或者请求,但是这个钩子是和容器主进程并行执行的,postStart 在容器创建成功后立即执行,主要用于资源的部署和环境的准备,比如把某个文件复制到特定目录。

preStop 容器终止前的任务,主要用于优雅的关闭应用程序或者通知第三方服务等操作, 停止前钩子非常重要,编排文件中应该包含。看完了两个生命周期钩子函数,我们也说了停止前钩子非常重要,为什么呢?下面先简单介绍下一个 pod 被删除后发生了什么?

1.apiServer 发出 http delete 请求后,apiserver 不会直接删除 Pod 而是给 Pod 设置一个删除时间,拥有删除时间的 Pod 就开始停止了。
2.kublet 检测到有需要停止的 Pod ,kublet 会给每个容器一定时间来优雅的停止 Pod,这个时间叫做终止宽限期,这个时间每个 Pod 可以单独配置。终止进程开始之后,计时器开始倒计时,然后执行以下操作:

如果仔细思考这个过程中,你会发现会有几个问题?

Kubernetes 通过 cgroup 进行资源限制,主要是通过设置 CPU 和内存请求资源和限制物理资源使用,由高到底分为 Guranteed、Burstable、Besteffort 三种资源限制级别。在生产环境中必须设置服务所需资源,可以考虑结合 limitrange 对命名空间所需资源限制,内部分别设置各个 Pod 所需资源,防止出现服务被驱逐;具体根据服务所需资源进行设置,如果 req 设置太大会导致资源浪费,太小会导致 OOMkilld,requests 建议使用历史峰值 * 1.2(系数)。如果线上环境存在突发流量,可以考虑结合 Kubernetes HPA 根据服务资源占用情况进行动态扩缩容。

经常看到有开发人员为镜像设置 latest 标签,简单,不用推送过多镜像,但是这样存在一定的隐患, 常见的就是当你 ImagesPullPolicy 设置为 IfNotPreset,推送镜像到远端,执行 yaml 文件不生效,那是因为 Kubernetes 发现版本没有变化没有去远端拉取,你不得不把拉取策略修改为 Always,这样一样,每当多产生一个 Pod 都会去联系镜像中心,拖慢了服务运行速度,严重情况下,网络出现问题就会导致整个服务无法正常启动。

另一个严重问题是一直使用同一个镜像标签,当服务出现问题时,导致无法回退到之前的版本。所以每当镜像发生变化时,要使用和之前不一样的标签。

对于一些日志收集或者有状态服务中,可能存在需要获取 pod 名称或者其它信息的需求,可以通过使用 env 对象获取资源对象,不仅如此,当我们需要调试服务的时候通过动态环境注入的方式,很方便的帮助我们进行服务调试,而不用执行重新打镜像操作,比如 java 服务出现内存溢出,可以通过注入如下信息:

在本地、虚拟机或者物理机部署时服务正常运行,换做容器运行各种崩溃,其实出现崩溃并不可怕,关键是分析为什么崩溃。Pod 在运行过程中会经历如下几个状态 Pending、Running、Succeeded、Faild、UnKnown 等。

标签:容器,服务,包含,对象,钩子,探针,Deployment,Pod,pod
来源: https://www.cnblogs.com/sanduzxcvbnm/p/16173164.html