ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

容器探针

2021-09-21 18:01:14  阅读:151  来源: 互联网

标签:容器 name kubectl 探针 nginx html pod


容器探测时pod对象生命周期中的一项重要的日常任务,它是kubelet对容器周期性执行的健康状态诊断,诊断操作由容器的处理器进行定义。k8s支持三种容器探针用于pod探测:

  • ExecAction:在容器中执行一个命令,并根据其返回的状态码进行诊断的操作称为Exec探测,状 态码为0表示成功,否则即为不健康状态
  • TCPSocketAction:通过与容器的某TCP端口尝试建立连接进行诊断,端口能够成功打开即为正 常,否则为不健康状。
  • HTTPGetAction:通过向容器IP地址的某指定端口的指定path发起HTTP GET请求进行诊断,响应 码大于等于200且小于400时即为成功

任何一种探测方式都可能存在三种结果:

  • success(成功):容器通过了诊断
  • failure(失败):容器未通过了诊断
  • unknown(未知):诊断失败,因此不会采取任何行动

kubelet可在活动容器上执行两种类型的检测:

  • (livenessProbe)存活性检测:用于判定容器是否处于运行状态,一旦此类检测未通过,kubelet将杀死容器并根据restartPolicy决定是否将其重启;未定义存活性检测的容器的默认状态未success
  • (readinessProbe)就绪性检测:用于判断容器是否准备就绪并可对外提供服务;未通过检测的容器意味着尚未准备就绪,端点控制器会将其IP从所有匹配到此pod对象的service对象的端点列表中移除;检测通过之后,会再次将其IP添加至端点列表中。

案例

准备镜像

docker pull busybox:1.32.0
docker pull nginx:1.17.10-alpine

readinessProbe(就绪检测)

readinessprobe.yml

apiVersion: v1
kind: Pod
metadata:
  name: readinessprobe-test
  labels:
    app: readinessprobe-test
spec:
  containers:
    - name: readinessprobe-test
      image: nginx:1.17.10-alpine
      imagePullPolicy: IfNotPresent
      readinessProbe:
        httpGet:
          port: 80
          path: /index1.html
        initialDelaySeconds: 1
        periodSeconds: 3
  restartPolicy: Always

查看

创建pod
kubectl apply -f readinessprobepod.yml

检查pod状态,虽然pod状态显示running但是ready显示0/1,因为就绪检查未通过
kubectl get pods

查看pod详细信息,文件最后一行显示readiness probe failed。。。。
kubectl describe pod readinessprobe-pod

进入pod内部,因为是alpine系统,需要使用sh命令
kubectl exec -it readinessprobe-pod sh

进入容器内目录
cd /usr/share/nginx/html/

追加一个index1.html文件
echo "welcome lagou" >> index1.html

退出容器,再次查看pod状态,pod已经正常启动
exit
kubectl get pods

livenessProbe(存活检测)

案例一

livenessprobepod.yml

apiVersion: v1
kind: Pod
metadata:
  name: livenessprobe-test
  labels:
    app: livenessprobe-test
spec:
  containers:
    - name: livenessprobe-test
      image: busybox:1.32.0
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh","-c","touch /tmp/livenesspod ; sleep 30; rm -rf /tmp/livenesspod; sleep 3600"]
      livenessProbe:
        exec:
          command: ["test","-e","/tmp/livenesspod"]
        initialDelaySeconds: 1
        periodSeconds: 3
  restartPolicy: Always

执行

创建pod
kubectl apply -f livenessprobepod.yml

监控pod状态变化,容器正常启动
kubectl get pod -w

等待30秒后,发现pod的RESTARTS值从0变为1.说明pod已经重启一次
案例二

livenessprobenginxpod.yml

apiVersion: v1
kind: Pod
metadata:
name: livenessprobenginx-pod
labels:
 app: livenessprobenginx-pod
spec:
containers:
 - name: livenessprobenginx-pod
  image: nginx:1.17.10-alpine
  imagePullPolicy: IfNotPresent
  ports:
   - containerPort: 80
    name: nginxhttpget
  livenessProbe:
   httpGet:
    port: 80
    path: /index.html
   initialDelaySeconds: 1
   periodSeconds: 3
   timeoutSeconds: 10
restartPolicy: Always

查看

创建pod
kubectl apply -f livenessprobenginxpod.yml

查看pod状态
kubectl get pod

查看容器IP,访问index.html页面。index.html页面可以正常访问。
kubectl get pod -o wide
curl 10.81.58.199

进入容器内部
kubectl exec -it livenessprobenginx-pod sh

删除index.html文件,退出容器
rm -rf //usr/share/nginx/html/index.html
exit

再次监控pod状态,等待一段时间后,发现pod的RESTARTS值从0变为1.说明pod已经重启一次。
kubectl get pod -w

进入容器删除文件一条命令执行rm -rf命令后退出容器。
kubectl exec -it livenessprobenginx-pod -- rm -rf
/usr/share/nginx/html/index.html

再次监控pod状态,等待一段时间后,发现pod的RESTARTS值从1变为2.说明pod已经重启一次。
kubectl get pod -w

因为liveness监控index.html页面已经被删除,所以pod需要重新启动,重启后又重新创建nginx
镜像。nginx镜像中默认有index.html页面。
案例三

livenessprobenginxpod2.yml

apiVersion: v1
kind: Pod
metadata:
name: livenessprobenginx-pod2
labels:
 app: livenessprobenginx-pod2
spec:
containers:
 - name: livenessprobenginx-pod2
  image: nginx:1.17.10-alpine
  imagePullPolicy: IfNotPresent
  livenessProbe:
   tcpSocket:
    #监测8080端口,如果8080端口没有反馈信息,重启pod
    port: 8080
   initialDelaySeconds: 10
   periodSeconds: 3
   timeoutSeconds: 5
restartPolicy: Always

查看

创建pod
kubectl apply -f livenessprobenginxpod2.yml

查看pod状态
kubectl get pod -w

存活检测监听8080端口,8080端口没有反馈信息后重启pod,RESTARTS值从0变为1

标签:容器,name,kubectl,探针,nginx,html,pod
来源: https://www.cnblogs.com/ltaodream/p/15317056.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有