date: 2020-08-14title: k8s知识点汇总 #标题
tags: k8s知识点汇总 #标签
categories: 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
spec:
containers:
- image: 'nginx:latest'
imagePullPolicy: IfNotPresent
name: nginx1
hostAliases:
- hostnames:
- a.b.c
- c.d.b
ip: 192.168.20.55
- hostnames:
- aa.bb.cc
ip: 10.2.3.3
restartPolicy: Always
当更新了deployment的镜像标签后发生了什么
其实不管是更新deployment也好,还是daemonset、statefulset,更新过程都是一样的,如下:
- 启动一个新pod
- 等待新的pod进入ready状态
- 创建endpoint,将新的pod纳入负载均衡
- 移除与旧的pod相关的endpoint,并将旧的pod状态设置为 Terminating,此时将不会有新的请求到达旧的pod
- 给旧的pod发送sigterm信号,并且等待一段时间(terminationGracePeriodSeconds 字段用于控制等待时间,默认为30s)
- 超过默认等待的30s后,将直接强制kill进程并删除旧的pod
- 滚动更新完成