3.1 POD
3.1.1 Pod 配置文件
apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-demo # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义 label 标签,名字为 type,值为 app
test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
containers: # 对于 Pod 中的容器描述
- name: nginx # 容器的名称
image: nginx:1.7.9 # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
command: # 指定容器启动时执行的命令
- nginx
- -g
- 'daemon off;' # nginx -g 'daemon off;'
workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
ports:
- name: http # 端口名称
containerPort: 80 # 描述容器内要暴露什么端口
protocol: TCP # 描述该端口是基于哪种协议通信的
- env: # 环境变量
name: JVM_OPTS # 环境变量名称
value: '-Xms128m -Xmx128m' # 环境变量的值
reousrces:
requests: # 最少需要多少资源
cpu: 100m # 限制 cpu 最少使用 0.1 个核心
memory: 128Mi # 限制内存最少使用 128兆
limits: # 最多可以用多少资源
cpu: 200m # 限制 cpu 最多使用 0.2 个核心
memory: 256Mi # 限制 最多使用 256兆
restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
3.1.2 探针
3.1.2.1 概念
用于探测容器中应用是否正在运行,如果探测失败,kubectl会根据配置的重启策略进行重启.没有配置默认容器启动成功,不会重启.
3.1.2.2类型
-
StartupProbe: 优先与下面<会先禁用其他探针>,用于判断用用是否启动,启动成功后开放下面(LiveNessProbe,ReadinessProbe)的探针- 为什么需要 Startup Probe : 为了解决一个特定问题:对于那些启动速度非常慢的应用程序(例如大型Java应用、需要初始化大量数据的应用),在启动完成之前,它们的存活探针和就绪探针肯定会失败。如果没有
startupProbe:- 存活探针 (
livenessProbe) 会在失败多次后,误以为应用启动失败,从而错误地重启这个正在努力启动的容器,导致它永远无法成功启动。
- 存活探针 (
- 有了
startupProbe:-
在启动探针成功之前,存活探针和就绪探针都会被禁用。
-
启动探针拥有非常高的
failureThreshold,允许容器在较长时间内(例如5分钟)持续报告"未启动",而不会触发重启。一旦应用程序自己准备好了,启动探针成功,控制权就交给livenessProbe和readinessProbe来负责运行时的健康检查。startupProbe: # 定义了一个启动探针,用于检测容器内的应用程序是否已完成启动。
# 它的主要目的是保护慢启动容器,在其完成启动前,暂停存活探针和就绪探针的执行。
httpGet: # 指定使用HTTP GET请求的方式进行启动检查。
path: /api/startup # HTTP GET请求访问的服务器路径。这里检查的是容器内服务的'/api/startup'端点。
# 这个端点通常被设计为在应用程序完全启动成功后才返回成功响应。
port: 80 # HTTP GET请求访问的容器端口号。这里检查的是容器内80端口(标准的HTTP端口)。
-
- 为什么需要 Startup Probe : 为了解决一个特定问题:对于那些启动速度非常慢的应用程序(例如大型Java应用、需要初始化大量数据的应用),在启动完成之前,它们的存活探针和就绪探针肯定会失败。如果没有
-
LiveNessProbe: 重启相关,判断是否运行. # 用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。-
等待 :容器启动后,先等待
60秒 (initialDelaySeconds)。 -
开始检查 :60秒后,发起第一次健康检查。向容器内
8080端口的/health路径发送一个 HTTP GET 请求。 -
等待响应 :它期望在
5秒内 (timeoutSeconds) 收到一个成功的 HTTP 响应状态码 (2xx 或 3xx)。 -
判定结果 :
- 如果请求在5秒内成功返回,则探测成功。
- 如果请求超时(5秒内无响应)或返回错误状态码(如4xx, 5xx),则探测失败。
-
后续检查 :无论第一次成功与否,它都会每
10秒 (periodSeconds) 重复一次步骤2-4的检查 -
失败处理 :如果连续
5次 (failureThreshold) 探测都失败了,Kubernetes 就会判定容器不健康,并重启这个容器。 -
恢复处理 :一旦失败后(比如连续失败了3次),只要有一次探测成功,失败计数器就会被重置。因为
successThreshold是1livenessProbe: # 定义了一个存活探针,用于检测容器是否仍在健康运行。如果探测失败,k8s会重启容器。
failureThreshold: 5 # 连续探测失败5次后,k8s才会将容器判定为不健康并重启它。这提供了一定的缓冲,避免因临时故障重启。
httpGet: # 指定使用HTTP GET请求的方式进行健康检查。
path: /health # HTTP GET请求访问的服务器路径。这里检查的是容器内Web服务的'/health'端点。
port: 8080 # HTTP GET请求访问的容器端口号。这里检查的是容器内8080端口。
scheme: HTTP # 用于连接的健康检查的协议(HTTP 或 HTTPS)。这里使用的是HTTP协议。
initialDelaySeconds: 60 # 容器启动后,等待60秒后才开始第一次执行存活探测。给应用足够的启动时间。
periodSeconds: 10 # 每次执行存活探测的间隔时间是10秒。即每10秒检查一次。
successThreshold: 1 # 探测失败后,只要有一次成功,即被认定为探测成功。对于livenessProbe,此值必须为1。
timeoutSeconds: 5 # 每次探测请求的超时时间为5秒。如果5秒内没有响应,则本次探测判定为失败。
-
-
ReadinessProbe: 是否接受消息<监听>,用于探测容器内的程序是否健康-
检查容器是否准备好工作。失败只会停止向该容器发送流量,但不会重启它。
readinessProbe: # 定义了一个就绪探针,用于检测容器是否已准备就绪,可以开始接收外部流量。
failureThreshold: 3 # 连续探测失败3次后,k8s会将容器标记为"未就绪"(Unready)。该容器将从服务的负载均衡器中移除,不再接收任何流量。
httpGet: # 指定使用HTTP GET请求的方式进行就绪检查。
path: /ready # HTTP GET请求访问的服务器路径。这里检查的是容器内Web服务的'/ready'端点。
port: 8181 # HTTP GET请求访问的容器端口号。这里检查的是容器内8181端口。
scheme: HTTP # 用于连接的健康检查的协议(HTTP 或 HTTPS)。这里使用的是HTTP协议。
periodSeconds: 10 # 每次执行就绪探测的间隔时间是10秒。即每10秒检查一次容器是否就绪。
successThreshold: 1 # 对于就绪探针,探测失败后,只要有一次成功,该容器就会被标记为"就绪"(Ready),并重新开始接收流量。
timeoutSeconds: 1 # 每次探测请求的超时时间为1秒。如果1秒内没有响应,则本次探测判定为失败。
-
3.1.2.3 探测方式
-
ExecAction : 在容器内部执行一个命令,看返回值
livenessProbe:
exec:
command:
- cat
- /health -
TCPSocketAction : 通过TCP连接检测容器端口是否开放,判断是否健康
livenessProbe:
tcpSocket:
port: 80 -
HTTPGetAction : 配置HTTP请求,看状态码
livenessProbe:
failureThreshold: 5 # 允许失败的阈值
httpGet:
path: /health
port: 8080
scheme: HTTP # 通过http请求8080端口的/healthAPI,检测容器是否健康
httpHeaders:
- name: xxx
value: xxx
3.1.2.4 参数配置 :
| 参数 | 说明 |
|---|---|
| initalDelayScconds | 初始化时间 |
| timeoutSeconds | 超时时间 |
| priodSeconds | 间隔时间 |
| successThreshold | 检查几次成功算成功 |
| failureThreshold | 检查几次失败算失败 |
3.1.2.5 常用命令
kubectl create -f nginx-po.yml # 通过指定的资源文件创建资源
kubectl describe po nginx-po # 查看指定资源的具体情况,在这里可以看到探针的处理情况
kubectl get po nginx-po # 获取指定pod资源的启动情况
kubectl exec -it nginx-po -c nginx -- cat /inited # 查看指定pod资源的初始化日志
3.1.3 生命周期

初始化 -> 容器创建完成 -> posStart钩子 -> 对容器的各种操作 -> preStop钩子 -> 销毁容器
apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-po # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义 label 标签,名字为 type,值为 app
test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行po
# 变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作。
terminationGracePeriodSeconds: 30
containers: # 对于 Pod 中的容器描述
- name: nginx # 容器的名称
image: nginx:1.7.9 # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
# 可以控制容器创建之后和容器停止之前完成的额外的动作....
lifecycle:
postStart: # 容创建完成后执行的动作,不能保证该操作一定在容器的 command 之前执行,一般不使用
exec: # 可以是 exec / httpGet / tcpSocket
command:
- sh
- -c
- 'mkdir /data'
preStop: # 在容器停止前执行的动作
httpGet: # 发送一个 http 请求
path: /
port: 80
exec: # 执行一个命令
command:
- sh
- -c
- sleep 9
startupProde: # 应用启动探针配置
tcpSocket:
port: 80
failureThreshold: 3 # 失败3次才算真正的失败
periodSecond: 10 # 间隔时间
successThreshold: 1 # 多少次成功算成功
timeoutSeconds: 5 # 超时时间
command: # 指定容器启动时执行的命令
- nginx
- -g
- 'daemon off;' # nginx -g 'daemon off;'
workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
ports:
- name: http # 端口名称
containerPort: 80 # 描述容器内要暴露什么端口
protocol: TCP # 描述该端口是基于哪种协议通信的
- env: # 环境变量
name: JVM_OPTS # 环境变量名称
value: '-Xms128m -Xmx128m' # 环境变量的值
reousrces:
requests: # 最少需要多少资源
cpu: 100m # 限制 cpu 最少使用 0.1 个核心
memory: 128Mi # 限制内存最少使用 128兆
limits: # 最多可以用多少资源
cpu: 200m # 限制 cpu 最多使用 0.2 个核心
memory: 256Mi # 限制 最多使用 256兆
restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
Pod 的退出流程, endpoint 删除 pod 的IP 地址 -> Pod 状态变为 terminating 状态 -> 执行 perStop 钩子函数(注册中心下线,数据的清理与销毁)