date: 2020-08-14title: k8s知识点汇总 #标题
tags: k8s知识点汇总 #标签
categories: k8s # 分类

用于记录下k8s中一些重要概念。

通用知识点

镜像下载策略

imagePullPolicy 字段和 image tag的可能取值将影响到 kubelet 如何获取镜像:

  • imagePullPolicy: IfNotPresent 仅在节点上没有该镜像时,从镜像仓库抓取。
  • imagePullPolicy: Always 每次启动 Pod 时,从镜像仓库抓取。
  • imagePullPolicy 未填写,镜像 tag 为 :latest 或者未填写,则同 Always 每次启动 Pod 时,从镜像仓库抓取。
  • imagePullPolicy 未填写,镜像 tag 已填写但不是 :latest,则同 IfNotPresent 仅在节点上没有该镜像时,从镜像仓库抓取。
  • imagePullPolicy: Never,Kubernetes 假设本地存在该镜像,并且不会尝试从镜像仓库抓取镜像。

注:在生产环境部署时,应该避免使用 :latest tag,如果这样做,将无法追踪当前正在使用的镜像版本,也无法正确地执行回滚动作。

pod生命周期阶段

Pod phase 代表其所处生命周期的阶段。Pod phase 并不是用来代表其容器的状态,也不是一个严格的状态机。

pod几个常见的生命周期状态如下:

生命周期阶段 描述
Pending Kubernetes 已经创建并确认该 Pod。此时可能有两种情况:(1)Pod还未完成调度(例如没有合适的节点);(2)正在从仓库下载镜像。
Running 该 Pod 已经被绑定到一个节点,并且该 Pod 所有的容器都已经成功创建。其中至少有一个容器正在运行,或者正在启动/重启
Succeeded Pod 中的所有容器都已经成功终止,并且不会再被重启
Failed Pod 中的所有容器都已经终止,至少一个容器终止于失败状态:容器的进程退出码不是 0,或者被系统 kill
Unknown 因为某些未知原因,不能确定 Pod 的状态,通常的原因是 master 与 Pod 所在节点之间的通信故障

pod健康检查

Probe(探针) 是指 kubelet 周期性地检查容器的状况。有三种类型的 Probe:

  • ExecAction: 在容器内执行一个指定的命令。如果该命令的退出状态码为 0,则成功。
  • TCPSocketAction: 探测容器的指定 TCP 端口,如果该端口处于 open 状态,则成功。
  • HTTPGetAction: 探测容器指定端口/路径上的 HTTP Get 请求,如果 HTTP 响应状态码在 200 到 400(不包含400)之间,则成功。

Probe 有三种可能的结果:

  • Success: 容器通过检测。
  • Failure: 容器未通过检测。
  • Unknown: 检测执行失败,此时 kubelet 不做任何处理。

Kubelet 可以在两种情况下对运行中的容器执行 Probe:

  • readinessProbe:就绪检查,确定容器是否已经就绪并接收服务请求。如果就绪检查失败,kubernetes 将该 Pod 的 IP 地址从所有匹配的 Service 的资源池中移除掉。
  • livenessProbe:健康检查,确定容器是否正在运行。如果健康检查失败,kubelete 将结束该容器,并根据 restart policy(重启策略)确定是否重启该容器。

何时使用 健康检查/就绪检查?

如果希望在容器的进程无响应后,将容器 kill 掉并重启,则指定一个健康检查 liveness probe,并同时指定 restart policy(重启策略)为 Always 或者 OnFailure

如果想在探测 Pod 确实就绪之后才向其分发服务请求,请指定一个就绪检查 readiness
probe。此时,就绪检查的内容可能和健康检查相同。就绪检查适合如下几类容器:

  • 初始化时需要加载大量的数据、配置文件
  • 启动时需要执行迁移任务

pod重启策略

定义 Pod 或工作负载时,可以指定 restartPolicy,可选的值有:

  • Always (默认值)
  • OnFailure
  • Never

restartPolicy 将作用于 Pod 中的所有容器。kubelete 将在五分钟内,按照递延的时间间隔(10s, 20s, 40s ……)尝试重启已退出的容器,并在十分钟后再次启动这个循环,直到容器成功启动,或者 Pod 被删除。

注:控制器 Deployment/StatefulSet/DaemonSet 中,只支持 Always 这一个选项,不支持 OnFailure 和 Never 选项。

部署和伸缩statefulset时的执行顺序

  • 在创建一个副本数为 N 的 StatefulSet 时,其 Pod 将被按 {0 … N-1} 的顺序逐个创建
  • 在删除一个副本数为 N 的 StatefulSet (或其中所有的 Pod)时,其 Pod 将按照相反的顺序(即 {N-1 … 0})终止和删除
  • 在对 StatefulSet 执行扩容(scale up)操作时,新增 Pod 所有的前序 Pod 必须处于 Running(运行)和 Ready(就绪)的状态
  • 终止和删除 StatefulSet 中的某一个 Pod 时,该 Pod 所有的后序 Pod 必须全部已终止

网络插件 fannel、calico、Weave该如何选择?

参考: kuboard官网

配置pod的 /etc/hosts

  1. spec:
  2. containers:
  3. - image: 'nginx:latest'
  4. imagePullPolicy: IfNotPresent
  5. name: nginx1
  6. hostAliases:
  7. - hostnames:
  8. - a.b.c
  9. - c.d.b
  10. ip: 192.168.20.55
  11. - hostnames:
  12. - aa.bb.cc
  13. ip: 10.2.3.3
  14. restartPolicy: Always

当更新了deployment的镜像标签后发生了什么

其实不管是更新deployment也好,还是daemonset、statefulset,更新过程都是一样的,如下:

  • 启动一个新pod
  • 等待新的pod进入ready状态
  • 创建endpoint,将新的pod纳入负载均衡
  • 移除与旧的pod相关的endpoint,并将旧的pod状态设置为 Terminating,此时将不会有新的请求到达旧的pod
  • 给旧的pod发送sigterm信号,并且等待一段时间(terminationGracePeriodSeconds 字段用于控制等待时间,默认为30s)
  • 超过默认等待的30s后,将直接强制kill进程并删除旧的pod
  • 滚动更新完成