首页 > 其他分享 >k8s timeoutSeconds无效且没有按照periodSeconds的间隔时间来执行健康检查

k8s timeoutSeconds无效且没有按照periodSeconds的间隔时间来执行健康检查

时间:2023-07-30 23:33:40浏览次数:38  
标签:07 timeoutSeconds 30 2023 periodSeconds 健康检查 k8s root wjq

健康检查日志没有严格按照periodSeconds间隔时间来打印。

核心代码如下: 
pkg/kubelet/prober/worker.go

pkg/kubelet/prober/prober.go
runProbe方法(kubelet健康检查有3种方式)

httpGet
发送HTTP 请求,返回码介于 200~400 之间(前闭后开)时检查成功。
exec
容器中执行命令,当命令执行成功(返回码为 0)时检查成功。
tcpSocket
当 TCP 连接容器中的指定 TCP 端口成功时,检查成功。

doProbe函数的调用过程是串行的,一旦执行了健康检查,必须等到结果才能执行下一次健康检查。如果健康检查执行时间比较长,那么上一次健康检查执行完,很快就会触发下一次健康检查。

模拟的无状态应用yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        args:
        - /bin/sh
        - -c
        - touch /root/wjq.log; touch /root/wjq.sh; chmod -R 777 /root/*; echo "echo 'begin' >> /root/wjq.log; date '+%Y-%m-%d %H:%M:%S' >> /root/wjq.log; sleep 300; date '+%Y-%m-%d %H:%M:%S' >> /root/wjq.log; echo 'end' >> /root/wjq.log" >> /root/wjq.sh; sleep 3000
        livenessProbe:
          exec:
            command:
            - bash
            - /root/wjq.sh
          initialDelaySeconds: 10
          periodSeconds: 5
          timeoutSeconds: 2
          failureThreshold: 3
        ports:
        - containerPort: 80
        securityContext:
          runAsUser: 0

k8s v1.19.0版本日志输出
情况1:健康检查脚本耗时300s
脚本间隔122s执行,只考虑开始执行时间,忽略end

打印开始执行时间

情况2:健康检查脚本耗时30s
sleep 300改成sleep 30,结果和k8s 1.15.0版本保持一致

k8s v1.15.0版本日志输出(脚本执行时间达到30s,包含了多个5s的periodSeconds,紧挨着执行)

begin 
2023-07-30 07:51:46 
2023-07-30 07:52:16 
end 
begin 
2023-07-30 07:52:16 
2023-07-30 07:52:46 
end 
begin 
2023-07-30 07:52:47 
2023-07-30 07:53:17 
end 
begin 
2023-07-30 07:53:17 
2023-07-30 07:53:47 
end

逻辑改变
pkg/probe/exec/exec.go
Probe方法
直接Run一直等命令结束(v1.15.0)->先start再wait超时后强制命令结束(v1.19.0)

pkg/kubelet/cri/remote/remote_runtime.go
ExecSync方法
超时时间是2分钟+自定义的超时时间即122s,使得看上去不是挨着执行

改成不加2分钟

脚本耗时30s,按照配置2秒就中断

类似于CommandContext方法

package main

import (
	"context"
	"fmt"
	"os/exec"
	"time"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	cmd := exec.CommandContext(ctx, "/bin/sleep", "10")
	out, err := cmd.CombinedOutput()
	fmt.Printf("ctx.Err : [%v]\n", ctx.Err())
	fmt.Printf("error   : [%v]\n", err)
	fmt.Printf("out     : [%s]\n", string(out))
}

标签:07,timeoutSeconds,30,2023,periodSeconds,健康检查,k8s,root,wjq
From: https://www.cnblogs.com/WJQ2017/p/17592362.html

相关文章

  • 离线Linux部署k8s集群环境
    ***********离线部署安装k8s集群环境***********1.机器配置master192.168.245.2014核4gnode1192.168.245.2024核4gnode2192.168.245.2034核4g系统内核:3.10.0-957.el7.x86_642.添加颜色echo"PS1='\[\033[35m\][\[\033[00m\]\[\033[31m\]\u\[\033[33m\]\[\033[3......
  • dolphinscheduler 调度spark on k8s
    dolphinscheduler对于k8s的支持可以使用spark任务模式选择k8s配置,当然也可以直接通过k8s集成通过容器镜像模式运行,两种方式各有利弊,但是完全基于k8s模式会比较方便些集成玩法说明spark任务模式此模式我们需要配置SPARK_HOME给每个dolphinschedulerworker节点,同时对于......
  • centos7 k8s 三节点 全二进制部署 1.23.15
    主机名IP地址Pod网段Service网段master192.168.1.60172.16.0.0/1210.96.0.0/16node01192.168.1.70172.16.0.0/1210.96.0.0/16node02192.168.1.80172.16.0.0/1210.96.0.0/16[root@master~]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2......
  • [k8s]k8s入门笔记
    ......
  • k8s部署单机版nacos
    来源:https://www.jianshu.com/p/4f69d1b369d1mysql安装mysql如下:创建mysql.yml文件如下:[root@DoM01nacos]#catmysql.yamlapiVersion:v1kind:ReplicationControllermetadata:name:mysqlnamespace:nacoslabels:name:mysqlspec:replicas:1......
  • MicroK8s 引起的 kubadm init 失败,端口占用
    前言今天在ubuntu20上安装k8s集群,前面的步骤都完成了,结果在kubeadminit的时候出现了下面的问题。errorexecutionphasepreflight:[preflight]Somefatalerrorsoccurred:[ERRORPort-10259]:Port10259isinuse[ERRORPort-10257]:Port10257isi......
  • 最后的组合:K8s 1.24 基于 Hekiti 实现 GlusterFS 动态存储管理实践
    前言知识点定级:入门级GlusterFS和Heketi简介GlusterFS安装部署Heketi安装部署Kubernetes命令行对接GlusterFS实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)主机名IPCPU内存系统盘数据盘用途ks-master-0192.168.9.912450100KubeS......
  • k8s 按照文档
    一、环境准备两台服务器:1、master2、worker-node3、关闭防火墙:systemctlstopfirewalldsystemctldisablefirewalld4、关闭selinuxsed-i's/enforcing/disabled/'/etc/selinux/configsetenforce05、关闭swapswapoff-ased-ri's/.*swap.*/#&/'/etc/fstab6、服务器规划cat......
  • 创建k8s 镜像仓库登录密钥
    原标题:k8s使用私有镜像仓库的访问凭据配置k8s创建私有仓库凭据有两种方式1.使用kubectl命令创建secret2.使用docker凭证作为k8s的凭据。文章来源地址https://www.yii666.com/blog/458024.html1.使用kubectl命令创建secretkubectlcreatesecretdocker-registry<name>--do......
  • k8s数据卷 Volume 之 hostPath 与 emptyDir
    一、为什么需要volume(数据卷)?容器中的文件在磁盘上是临时存放的,这给容器中运行比较重要的应用程序带来一些问题。问题1:当容器升级或者崩溃时,kubelet会重建容器,容器内文件会丢失问题2:一个Pod中运行多个容器需要共享文件。Kubernetes卷(Volume)这一抽象概念能够解决这两个问题......