存活探测器应该检查什么:简易的存活探测器可以仅检查服务器是否响应,但为了更好地进行存活检查,需要将探测器配置为请求特定的 URL 路径(如 /health ),并让应用从内部对内部运行的所有重要组件执行状态检查,以确保它们都没有终止或停止响应。 P88
确保 /health 不需要认证,否则探测会一直失败,导致容器无限重启
检查应用的内部,检查结果不能受任何外部因素的影响。例如数据库连不上时,存活探测器不应该返回失败,如果问题在数据库,那么重启容器不会解决问题。
保持探测器轻量 P89
不应消耗太多计算资源
运行不应花太长时间。默认情况下,探测器执行的频率相对较高,必须在一秒之内执行完毕
无须在探测器中实现重试:探测器的失败阈值是可配置的,并且通常在容器被终止之前探测器必须失败多次 P89
存活探测器小结:存活探测由 pod 上的 Kubelet 执行, Kubernetes 控制面板不会参与。因此节点奔溃时,控制面板会为所有随节点停止运行的 pod 创建替代者,但不会为直接创建的 pod 创建替代者,因为这些 pod 只被节点上的 Kubelet 管理。为了避免这种情况发生,我们应该使用控制器或类似机制管理 pod 。 P89
了解 Deployment P89注:本节中提到的 pod 受 Deployment 管理等说法为简化说法,实际上 pod 由受 Deployment 管理创建的 ReplicaSet 进行管理创建。
Deployment 是一种 Kubernetes 资源,可确保它的 pod 始终保持运行状态。如果 pod 因为任何原因消失(例如节点从集群中消失或由于该 pod 已从节点中逐出),则 Deployment 会注意到缺少了 pod 并创建替代者。 P89
上图的节点 1 有两个节点, Pod A 是被直接创建的,而 Pod B 由 Deployment 管理。节点异常退出后, Deployment 会创建一个新的 Pod B2 来替换减少的 Pod B ,而 Pod A 由于没有东西负责重建而完全丢失。 P89
Deployment 的操作 P90Deployment 会持续监控正在运行的 pod 列表,并保证匹配标签选择器(03. pod: 运行于 Kubernetes 中的容器 中介绍过标签选择器及使用方式)的 pod 数目与期望相符。 P90
介绍控制器的协调流程 P91
Deployment 的工作是确保 pod 数量始终与其标签选择器匹配。 P91
了解 Deployment 的三部分 P91
标签选择器 (label selector) :用于确定 Deployment 作用域中有哪些 pod
副本个数 (replica count) :指定应运行的 pod 数量
pod 模版 (pod template) :用于创建新的 pod 副本
Deployment 的副本个数、标签选择器和 pod 模版都可以随时修改,但只有副本数目但变更会影响现有的 pod 。 P92
更改控制器的标签选择器或 pod 模版的效果 P92
更改标签选择器和 pod 模版对现有的 pod 没有影响。更改标签选择器会使现有的 pod 脱离 Deployment 的范围,因此控制器会停止关注它们。更改模版仅影响由此 Deployment 创建的新 pod 。 P92
使用 Deployment 的好处 P92
确保 pod 持续运行:在现有 pod 丢失时启动一个新 pod
集群节点发生故障时,为故障节点上运行的受 Deployment 管理的所有 pod 创建替代副本
轻松实现 pod 水平伸缩——手动和自动都可以
注意: pod 实例永远不会重新安置到另一个节点。 Deployment 会创建一个全新的 pod 实例,它与正在替换的实例无关。 P92
创建一个 Deployment P92我们可以通过以下描述文件 kubia-deployment.yaml 创建一个 Deployment ,它确保符合标签选择器 app=kubia 的 pod 实例始终是三个。
# 遵循 v1 版本的 Kubernetes API apiVersion: apps/v1 # 资源类型为 Deployment kind: Deployment metadata: # Deployment 的名称 name: kubia spec: # 指定与标签选择器匹配的 pod 数目为 3 replicas: 3 # 指定 Deployment 操作对象 selector: # 需要匹配以下指定的标签 matchLabels: app: kubia # 启动 pod 使用的模版(可以发现模版内容与 kubia-manual.yaml 对应部分一致) template: metadata: # 指定标签为 app=kubia labels: app: kubia spec: containers: # 容器的名称 - name: kubia # 创建容器所使用的镜像 image: idealism/kubia # 应用监听的端口 ports: - containerPort: 8080 protocol: TCP模版中的 pod 标签必须和 Deployment 的标签选择器匹配, API 服务器会校验 Deployment 的定义,不会接受错误配置。 P93
若不指定选择器,它会自动根据 pod 模版中的标签自动配置,这样可以让描述文件更简洁。 P93
使用 Deployment P94kubectl create -f kubia-deployment.yaml 会创建一个名为 kubia 的 Deployment ,它会根据 pod 模版启动三个新 pod 。 P94