k8s 探针

1、存活探测(liveness probe)

  • 判断pod内容器是否是在运行状态

  • 当探测失败的时候,k8s根据重启策略是否重启

  • 适合发生故障的时候,立刻进行重启的操作

  1. 探测的方式
    • 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生命周期

img

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"]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值