赞
踩
pod 是k8s 中可以调度的最小单位
每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:
用户程序所在的容器,数量可多可少
Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:
可以以它为依据,评估整个Pod的健康状态
可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信
yaml 格式
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' # 环境变量的值
resources:
requests: # 最少需要多少资源
cpu: 100m # 限制 cpu 最少使用 0.1 个核心
memory: 128Mi # 限制内存最少使用 128兆
limits: # 最多可以用多少资源
cpu: 200m # 限制 cpu 最多使用 0.2 个核心
memory: 256Mi # 限制 最多使用 256兆
restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
在整个生命周期中,Pod会出现5种状态(相位),分别如下:
探针是容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态,根据生命周期图可以看出探针目前存在三种类型
类型 | 描述 | 作用阶段 |
---|---|---|
StartupProbe | 1.16 版本新增的探针,用于判断应用程序是否已经启动了。 | 容器启动阶段 |
LivenessProbe | 用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。 | 容器运行过程中 |
ReadinessProbe | 用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的 | 容器启动之后检测 |
注:
当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。
三种探针的探测方式都是支持,httpGet tcpSocket 和 exec 三种方式。按需使用
startupProbe:
httpGet:
path: /api/startup
port: 80
host: 127.0.0.1 #主机地址
scheme: HTTP #支持的协议,http或者https
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
successThreshold: 1 # 检查 1 次成功就表示成功
failureThreshold: 2 # 监测失败 2 次就表示失败
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30 # 容器启动后等待30秒再开始执行探针检查
periodSeconds: 10 # 每10秒执行一次探针检查
readinessProbe:
exec:
command:
- sh
- init.sh # 用来检查数据库是否初始化
为容器配置探针(LivenessProbe、ReadinessProbe 和 StartupProbe)时,需要根据应用程序的特性和需求来合理设置参数。以下是一些建议,帮助您配置这些探针的参数:
总之,合理配置探针参数需要综合考虑应用程序的特性、集群规模、资源限制以及业务需求等多个因素。通过不断测试和调整,您可以找到最适合您应用程序的探针配置。
初始化容器是在pod的主容器启动之前要运行的容器,主要是做一些主容器的前置工作,它具有两大特征:
初始化容器有很多的应用场景,下面列出的是最常见的几个:
apiVersion: v1
kind: Pod
metadata:
name: pod-initcontainer
namespace: dev
spec:
containers:
- name: main-container
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- name: nginx-port
containerPort: 80
initContainers: # 初始化容器执行操作 执行完之后才会启动主容器
- name: test-mysql
image: busybox:1.30
command: ['sh', '-c', 'until ping 172.26.25.71 -c 1 ; do echo waiting for mysql...; sleep 2; done;']
- name: test-redis
image: busybox:1.30
command: ['sh', '-c', 'until ping 172.26.25.71 -c 1 ; do echo waiting for reids...; sleep 2; done;']
pod 生命周期中,有两个钩子函数,PreStart 和 PreStop,
PreStart 在主容器创建之后执行,如果失败,就会重启容器(PreStart使用频率少,因为与有init 和 startupprobe 都处于容器启动前阶段,并且使用不当会与startupprobe 冲突)
PreStop 在主容器销毁之前执行,执行完成之后终止容器(用来在容销毁前,在注册中心下线,清理/销毁 数据)
同样钩子处理器支持 exec tcpScoke httpGet 三种方式.下面以PreStop 为例, 配置在containers: 下
lifecycle:
preStop:
exec:
command:
- sh
- -c
- 'sleep 20; kill pgrep java'
执行preStop 时,pod 会处于Termination 状态挂起
但是需要注意,由于 k8s 默认给 pod 的停止宽限时间为 30s,如果我们停止操作会超过 30s 时,不要光设置 sleep 50,还要将 terminationGracePeriodSeconds: 30 也更新成更长的时间,否则 k8s 最多只会在这个时间的基础上再宽限几秒,不会真正等待 50s
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。