k8s-Pod
one-container-per-pod”是k8s中最常见的使用方式,此时,您可以认为pod容器组是该容器的warpper,k8s通过pod管理容器,而不是直接管理容器。用于探测容器中的应用是否运行,如果探测失败,kubelet会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。生产环境用的较多的方式,发生HTTP请求倒容器内的应用程序,如果接口返回的状态码在 2
Pod
Pod(容器组)是k8s中最小的可部署单元。一个Pod包含了一个应用程序容器(某些情况下是多个容器)、存储资源、一个唯一的网络IP地址、以及一些确定容器该如何运行的选项。Pod容器组代表了k8s中一个独立的应用程序运行实例,该实例可能由单个容器或者几个紧耦合在一起的容器组成。
k8s集群中的pod存在如下两种使用途径:
-
一个Pod中只运行一个容器。“one-container-per-pod”是k8s中最常见的使用方式,此时,您可以认为pod容器组是该容器的warpper,k8s通过pod管理容器,而不是直接管理容器。
-
一个pod中运行多个需要互相协作的容器。可以将多个紧密耦合、共享资源且始终在一起运行的容器编排在同一个Pod中,
配置文件(常见的清单)
apiVersion: v1 #api文档版本
kind: Pod #资源对象类型,也可以配置为Deployment Service StatsfulSet这一类的对象资源
metadata: # Pod相关的元数据,用于描述Pod的数据
name: nginx-server #Pod的名称
labels: #定义Pod的标签
type: app #自定义label标签,名字为type 至为app
version: 1.0.0 #自定义label标签,描述pod版本号,也可以写其他值,例如 test: xxx
namespace: 'default' # 命名空间的配置
spec: #期望Pod按照这里面的描述进行创建
containers: # 对于Pod中的容器描述
- name: nginx #容器的名称
image: nginx:1.14.2 #指定容器的镜像
imagePullPolicy: IfNotPresent #定义镜像拉取策略,有Always(默认,每次尝试重新拉取镜像)\Never(表示仅适用本地镜像)\IfNotPresent(本地有镜像就用本地镜像,没有则拉取在线镜像) 可选
command: #指定容器启动时执行的命令
- nginx
- -g
- 'daemon off;' # nginx -g 'daemon off;'
workingDir: /usr/share/nginx/html #指定容器启动后的工作目录
ports: #
- name: http #端口名称
containerPort: 80 #描述容器内需要暴漏的端口
protocol: TCP #描述该端口是基于哪种协议通信的 默认TCP
env: #指定容器运行前需设置的环境变量列表
- name: JVM_OPTS #环境变量名称
value: '-Xms128m -Xmx128m' #环境变量值
resources: #指定资源限制和资源请求的值
requests: #最少需要多少资源
cpu: 100m #限制cpu最少使用0.1c 1c为1000m
memory: 128Mi #限制内存最少使用128兆
limits: #最多可以用多少资源
cpu: 200m #限制cpu最多使用0.2c 1c为1000m
memory: 256Mi #限制内存最多使用256兆
restartPolicy: Always #定义pod的重启策略
#Always(默认,无论是如何终止,kubelet都将重启他)、
#Onfailure(只有pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则不重启) #Never(Pod终止后,kubelet将退出码报告给master,不会重启该Pod)
根据 pod描述(kubectl describe po xxxx)可以看出
探针
容器内应用的监控机制,根据不同的探针来判断容器应用当前的状态。
类型
StartupProbe(启动探针)
k8s 1.16后新增该探针,用于判断应用程序是否已经启动了。
当配置了 startupProbe后,会先禁用其他探针,直到startupProbe成功后,其他探针才会继续。
作用:由于有时候不能准确预估应用一定是多长时间启动成功,因此配置另外两种凡是不方便配置初始化时长来检测,而配置了startupProbe后,只有再应用启动成功了,才会执行另外两种探针,可以更加方便的结合使用另外两种探针。
startupProbe:
failureThreshold: 5 #错误次数
httpGet:
path: /api/startup
port: 80
initialDelaySeconds: 60 #初始化时间
periodSeconds: 10 #检测间隔时间
successThreshold: 1 #检测1次成功就表示成功
timeoutSeconds: 5 #超时时间
LivenessProbe(存活探针)
用于探测容器中的应用是否运行,如果探测失败,kubelet会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。
前提:容器启动成功后
可以根据LivenessProbe实现容器自动恢复
livenessProbe:
failureThreshold: 5 #错误次数,检测失败5次就表示失败
httpGet: #探测方式 基于http请求探测
path: /health #http请求路径
port: 8080 # 请求端口
scheme: HTTP
initialDelaySeconds: 60 #初始化时间
periodSeconds: 10 #检测间隔时间
successThreshold: 1 #检测1次成功就表示成功
timeoutSeconds: 5 #超时时间
ReadinessProbe(就绪探针)
用于探测容器内的程序是否健康,他的返回值如果返回success,那么就任务该容器已经完全启动,并且该容器时可以接收外部流量的。
前提:容器启动成功后
启动成功则可以允许外部来请求该容器
readinessProbe:
failureThreshold: 3 #错误次数
httpGet:
path: /ready
port: 8181
scheme: HTTP
periodSeconds: 10 #间隔时间
successThreshold: 1
timeoutSeconds: 5
探测方式
ExecAction
在容器内部执行的一个命令,如果返回值为0,则任务容器是健康的。
livenessProbe: #在任一探针配置文件中写下列命令
exec:
command:
- sh
- -c
- "sleep 5; echo 'success' > /inited;"
TCPSocketAction
通过tcp连接检测容器内端口是否开放,如果开放则证明该容器健康。
livenessProbe:
tcpSocket:
port: 80
HTTPGetAction
生产环境用的较多的方式,发生HTTP请求倒容器内的应用程序,如果接口返回的状态码在 200-400之间,则认为容器是健康的。
java应用比较广泛,因为端口可能很早就启动了,不适合TCP方式检测
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
httpHeaders:
- name: xxx
value: xxx
生命周期(lifecycle)
postStart: 容器创建完成后执行的动作,不能保证该操作一定在容器的command之前执行,一般不使用。
preStop: 在容器停止前的动作。
spec:
terminationGracePeriodSeconds: 30 #当pod被删除是,给这个pod宽限多长时间来进行删除操作;默认30
container:
- name: xxx #容器名称
lifecycle: #生命周期的配置
postStart: # 生命周期启动阶段做的事情,不一定在容器的command之前运行
exec:
command:
- sh
- -c
- "echo '<h1>poststart</h1>' > /usr/share/nginx/html/test.html"
preStop: #在容器停止前的动作
exec:
command:
- sh
- -c
- "sleep 50; echo '<h1>pre stop</h1>' >> /usr/share/nginx/html/test.html"
# 如果预计preStop中耗时大于30s ,注意修改terminationGracePeriodSeconds 值
[参考] https://www.modb.pro/db/619459
「pod对象从开始创建到终止退出的时间范围称为生命周期」。它主要包含以下的过程
-
pod创建过程
-
运行初始化容器(init container)过程
-
运行主容器(main container)
-
容器启动后钩子(post start)、容器终止前钩子(pre stop)
-
容器的存活性检测(liveness probe)、就绪性检测(readiness probe)
-
-
pod终止过程
更多推荐
所有评论(0)