• Deployment 是一个控制器,能够用来控制 pod 数量跟期望数量一致,配置 pod 的发布方式 Deployment 会按照给定策略进行发布指定 pod,保证在更新过程中不可用数量在限定范围内.

  • Deployment 控制 ReplicatSet, ReplicateSet控制 pod 副本的数量,pod 所属于 Replicaset,同一个 Replicaset 下的 pod 都是一样的

  • ReplicaSet 管理多个 Pod 副本,当有一个副本出现故障时,会不断的重启,重启的时间间隔以指数级增长,直到 5 分钟,不会自动转移。你或许会很奇怪,为什么 Pod 不会自动移除或者重新调度,这是因为 ReplicaSet 并不关心 Pod 是否处于正常运行状态,它只关心期望的副本数量和当前的副本数量是否一致。

  • 一个 Pod 中可以包含多个容器,如果想查看其中单个 Container 容器,可以使用 kubectl logs client-pod -c client-container

  • 如果一个容器依赖与另外一个容器,使用 initContainer 来延迟 Pod 主容器的启动。同时 initContainer 是顺序启动容器。但更建议你添加 Readisness 就绪探针来探测服务是否正常启动,如果这个服务没有准备好,那么 Kubernetes 就会阻止这个服务成为服务端点。

  • volumeMount 数据卷挂载,通常我们会通过定义 pv pvc 把容器内部数据挂载持久性存储卷或者宿主机特定目录。不过我就曾经发现有人把配置和证书等信息放置持久存储卷到特定目录,然后 mount 到容器内部。从管理和使用的角度不建议使用这种方式,更推荐使用 ConfigMap 和Secret。

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

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

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

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

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

1.apiServer 发出 http delete 请求后,apiserver 不会直接删除 Pod 而是给 Pod 设置一个删除时间,拥有删除时间的 Pod 就开始停止了。

2.kublet 检测到有需要停止的 Pod ,kublet 会给每个容器一定时间来优雅的停止 Pod,这个时间叫做终止宽限期,这个时间每个 Pod 可以单独配置。终止进程开始之后,计时器开始倒计时,然后执行以下操作:

  • 执行停止前钩子(如果配置了的话),然后等待执行完毕
  • 向容器主进程发送sigterm信号
  • 等待容器优雅的关闭或者等待终止宽限期超时
  • 如果容器主进程没有优雅地关闭,那么使用sigkill强制终止进程。即使此时停止前钩子没有执行完成。

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

  • 停止前钩子没有执行完成怎么办,比如现在运行的有状态服务是数据库,数据库所在 Pod 缩容之后,需要进行数据转移。现在使用了停止前钩子进行数据转移。这个时候更建议使用 DaemonSet 定时任务专门处理此类问题,不要过度依赖停止前钩子函数,因为它无法预料到 Pod 生命周期何时结束。
  • Pod 关闭时客户端连接断开怎么办,因为移除 iptable 规则的时间很可能比删除 Pod 时间要慢,这就导致之后外部请求到内部 Pod 发生 Connection refused,这种场景很难被解决,但是可以从一定程度上去避免,比如在停止前钩子,延迟 5-10s 关闭时间,尽可能多处理一定量请求,具体时间根据场景进行控制。

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 等。

  • 首先出现问题后注意使用 kubectl describe deployment 查看 deployment 状态, 如果 deployment 一切正常、开始查看 kubectl describe replicaset,如果这两个控制器不正常,查看原因,一般 events 中会有提示。

  • 如果一切正常,kubectl describe pod 查看 pod 运行状况,如果看不出问题所在,那么执行 kubectl logs pod 当然你的日志可能没有输出到控制台,你可以到你挂载日志所在宿主机或者日志收集中心查看日志。(前提是你的所有日志文件都已经 mount 到宿主机)

  • 如果通过日志仍然无法看出问题或者根据异常信息不能分析出问题所在,其实可以通过 kubectl cp values.yaml pod-9fbfdbf89-rcwhc:/home/(把本地文件拷贝到 pod)也可以通过 kubectl cp pod-deployment-9fbfdbf89-rcwhc:home/values.yaml values.yaml(把镜像内部复制到宿主机)把一些你认为能够排除问题的工具复制到 Pod 内部进行协助问题排除。

  • 最后如果仍然无法找到问题,那么你可以考虑运行一个没有问题的进程,最简单的就是创建一个普通的 centos 容器进行实现,通过如下命令,保证容器启动时拥有一个前台进程 command: ["/bin/bash","-c","while true; do sleep 1000; done"] 然后把有问题的服务 mount 进去,手动执行。

Deployment必须包含资源对象的更多相关文章

  1. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  2. Kubernetes 资源对象

    概述 我将它们简单的分类为以下几种资源对象: 类别 名称 资源对象 Pod.ReplicaSet.ReplicationController.Deployment.StatefulSet.Daemon ...

  3. prometheus-常用资源对象

    监控 Kubernetes 常用资源对象 Prometheus 来自动发现 Kubernetes 集群的节点,用到了 Prometheus 针对 Kubernetes 的服务发现机制kubernete ...

  4. k8s管理pod资源对象(上)

    一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...

  5. k8s资源对象及API群组

    REST是representational state transfer的缩写,意为“表征状态转移”,它是一种程序架构风格,基本元素为资源(resource).表征(representation)和行 ...

  6. 6.K8s集群升级、etcd备份和恢复、资源对象及其yaml文件使用总结、常用维护命令

    1.K8s集群升级 集群升级有一定的风险,需充分测试验证后实施 集群升级需要停止服务,可以采用逐个节点滚动升级的方式 1.1 准备新版本二进制文件 查看现在的版本 root@k8-master1:~# ...

  7. PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象

    PHP常用缓存方式:第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件.在需要缓存数据的时候,通过include方式引入,并使用.第二种,把需要的数据通过serialize函数序列化后直接 ...

  8. [置顶] kubernetes--优雅删除资源对象

    当用户请求删除含有pod的资源对象时(如RC.deployment等),K8S为了让应用程序优雅关闭(即让应用程序完成正在处理的请求后,再关闭软件),K8S提供两种信息通知: 1).默认:K8S通知n ...

  9. 【Unity3D】资源对象、预设、查找对象、组合模式等知识点

    1.解释对象与资源区别于联系,根据官方案例,分别总结资源和对象组织的规则/规律.    下载并查看了Adam和Survival Shooter tutorial两个官方资源案例,这些案例作为资源,可以 ...

随机推荐

  1. Windows对拍系统

    有个东西可以帮助对拍,告诉你两个程序的输出哪不一样(但是无法得知错误位置,聊胜于无吧) 一.打开计算机  二.在上方输入$cmd$,摁下回车 三.弹出对话窗如下,输入$fc +$空格,输入两个需要比较 ...

  2. 记一道经典树上Nim游戏

    这道题首先是 Hanriver 提出来的,但是大家都不会做,今天看到了一道一模一样的题目 AT2667 题目大意是,每个人删掉一个不是整棵树的原树的子树,给定一个树问游戏状态. 首先,这是需要用到多个 ...

  3. 新版recon-ng安装模块

    表现:进入后报[*] No modules enabled/installed. 1.直接在recon-ng控制台输入marketplace install all,用来下载所有插件,如果不可以,往下 ...

  4. 01 Mybatis框架添加英雄步骤

    客户端发出请求的几种方式 通过浏览器的地址栏中发出请求 通过html页面中的超链接发出请求 通过html页面中的form表单发出请求 通过前端框架发出请求 工程中使用数据库需要做的几件事: 在pom. ...

  5. 2022.7.9 单向链表&数组优化

    相比起数组,链表解决了数组不方便移动,插入,删除元素的弊端,但相应的,链表付出了更加大的内存牺牲换来的这些功能的实现. 链表概述 包含单链表,双链表,循环单链表,实际应用中的功能不同,但实现方式都差不 ...

  6. Clang-format-12安装

    ubu18 clang-format安装 1.更新源 wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - ...

  7. 2537-springsecurity系列--关于session的管理2-session缓存和共享

    版本信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  8. 5.25 NOI 模拟

    \(T1\)旅行计划 不\(sb\)的题 比较显然转化成求一个点到所有点的最短路和 考虑我们非树边很少,那么可以把非树边连接的点看做是关键点,那么我们可以预处理每个关键点之间的最短路 我们每次询问,对 ...

  9. Python 爬取汽车之家口碑数据

    本文仅供学习交流使用,如侵立删!联系方式见文末 汽车之家口碑数据 2021.8.3 更新 增加用户信息参数.认证车辆信息等 2021.3.24 更新 更新最新数据接口 2020.12.25 更新 添加 ...

  10. 先导,对IOC容器的理解

    先导,对IOC容器的理解 通俗的讲就是把你的class类交给spring的IOC容器去管理 需要对该类的属性注入一些值,就可以通过spring提供的xml文件或者注解进行注入 自己使用时在IOC容器工 ...