1、存活探测(liveness probe)
-
判断pod内容器是否是在运行状态
-
当探测失败的时候,k8s根据重启策略是否重启
-
适合发生故障的时候,立刻进行重启的操作
- 探测的方式
-
exec
-
httpget,大于200小于400就是健康的
-
tcpsocket
-
curl localhost:80/index.html
- tcpget
1、httpget
#httpget
apiVersion: v1
kind: Pod
metadata:
name: qqq
namespace: dev
spec:
containers:
- name: qqq
imagePullPolicy: IfNotPresent
image: docker.io/library/nginx
livenessProbe:
httpGet: #curl localhost:80/index.html
path: /index.html
port: 80
initialDelaySeconds: 5 #pod启动后首次进行检查等待的时间,秒
periodSeconds: 3 #检查的间隔时间,默认为10s
timeoutSeconds: 1 #探针执行检测请求后,等待响应的超时时间,默认为1s
successThreshold: 1 #连续探测几次成功后,才认为探测成功,默认为1,在liveness中必须为1,最小值为1
failureThreshold: 3 # 探测失败的重试次数,重试一定次数后认为失败,在readiness中,pod会被标记为就绪,默认为3,最小为1
restartPolicy: "Always"
#如果删除了这个/index.html这个文件的话,pod就会自动重启,并且文件也会恢复
[root@master live]# kubectl exec -ti -n dev qqq -c qqq -- rm -rf /usr/share/nginx/html/index.html
#发现自动重启了
[root@master live]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
qqq 1/1 Running 2 (2s ago) 2m18s
2、exec方式
使用命令来检测容器是否运行了,执行的结果为0就成功了,否则失败
[root@master live]# cat lexec.yaml
apiVersion: v1
kind: Pod
metadata:
name: lexec
namespace: dev
spec:
containers:
- name: lexec
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- "test"
- "-f"
- "/usr/share/nginx/html/index.html" 或者这种写法 ["test","-f","/usr/share/nginx/html/index.html" ]
initialDelaySeconds: 3
periodSeconds: 2
restartPolicy: Always
#删除这个文件也是一样的
3、tcpsocket
探针会对定义的端口发起tcp连接
[root@master live]# cat ltcp.yaml
apiVersion: v1
kind: Pod
metadata:
name: ltcp
namespace: dev
spec:
containers:
- name: ltcp
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
#如果将tcp端口监听的为81的话,就会重启
[root@master live]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
lexec 1/1 Running 1 (6m9s ago) 7m22s
ltcp 1/1 Running 1 (4s ago) 34s
qqq 1/1 Running 2 (13m ago) 15m
#停掉nginx nginx -s stop
2、就绪探测(readiness probe)
-
检测Pod容器中服务是否启动了,就会运行流量转发到容器里面
-
容器起来了,但是里面的服务还没有起来,还不能提供对外提供服务,需要进行加载才行
-
适合应用程序启动较长的时间的应用场景
-
探测失败的话,就不会将流量转发到该容器
-
这个检测失败的话,容器不会自动重启,不会将流量转发到对应的Pod上的
-
失败的话,从对应的svc中的endpoint删除掉
1、httpget方式
[root@master live]# cat readhttp.yaml
apiVersion: v1
kind: Pod
metadata:
name: readn1
namespace: dev
labels:
app: my-pod
spec:
containers:
- name: readn1
image: nginx
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 30 #等待30秒开始检测,然后就绪了
periodSeconds: 4
#写一个服务关联pod,提供服务
apiVersion: v1
kind: Service
metadata:
name: s1
namespace: dev
spec:
selector: #选择pod标签为app:my-pod的关联
app: my-pod
ports:
- port: 30080 #svc端口
targetPort: 80 #容器目标端口
#查看svc详细信息
[root@master live]# kubectl describe svc -n dev s1
Name: s1
Namespace: dev
Labels: <none>
Annotations: <none>
Selector: app=my-pod
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.104.29.163
IPs: 10.104.29.163
Port: <unset> 30080/TCP
TargetPort: 80/TCP
Endpoints: 10.244.104.28:80 #关联pod,请求转发到这个ip去
Session Affinity: None
Events: <none>
ipvsadm -Ln可以看到访问svc然后转发到对应的pod,kube-proxy会进行转发
#删除这个/index.html,svc和pod就会出现问题,就绪失败了
[root@master live]# kubectl exec -n dev -ti readn1 -- /bin/bash
root@readn1:/# rm -rf /usr/share/nginx/html/index.html
#就会出现了问题,未就绪的状态
[root@master live]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
qqq 1/1 Running 2 (69m ago) 72m
readn1 0/1 Running 0 119s
3、启动探测
-
只会在容器启动时执行一次
-
判断是否启动了并且已经准备好流量的转发
-
失败的话,自动重启该容器
-
使用了启动探测的话,禁用所有其他的探测,直到他成功为止
[root@master live]# cat start.yaml
apiVersion: v1
kind: Pod
metadata:
name: start1
namespace: dev
spec:
containers:
- name: start1
image: nginx
imagePullPolicy: IfNotPresent
startupProbe:
httpGet:
path: /
port: 80
4、三种探测方式使用
5、探测的总结
-
启动探测是最高的
-
就绪和存活探测是一样的
5、pod生命周期
1、初始化容器
- 必须先初始化容器,才能运行主容器
[root@master pod]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: initpod
spec:
#在执行之前创建一个文件
initContainers:
- name: init-pod1
command: ["/bin/bash","-c","touch /11.txt"]
image: docker.io/library/tomcat
containers:
- name: busybox
image: docker.io/library/busybox:1.28
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 36000"]
2、postStart
-
容器运行之前进行的操作,必须执行成功,pod里面的容器才能运行成功
-
失败的话,一直进行重启的操作
#失败的列子,使用错误的命令
[root@master pod]# cat pod-start.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-start
spec:
containers:
- name: busybox
image: docker.io/library/busybox:1.28
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 36000"]
lifecycle:
postStart:
exec:
command: ["/bin/bash","-c","qwe /11.txt"]
#会一直处于这个状态,只有启动前的钩子正确的执行了,才能运行主容器
[root@master pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
initpod 1/1 Running 0 2m39s
pod-start 0/1 ContainerCreating 0 16s
3、preStop
-
容器快结束后,执行操作
-
会阻塞pod里面的容器死亡
[root@master pod]# cat pod-stop.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-stop
spec:
containers:
- name: busybox
image: docker.io/library/busybox:1.28
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 36000"]
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","touch 11.xtt"]