k8s之wait工具包

wait包位于github.com/kubernetes/apimachinery/pkg/util/wait,提供了通过监听一个条件的变化执行指定函数的工具函数.。 这些函数可以分为四大类:

Until 类: 根据 channel 的关闭或者 context.Done 的信号 来决定函数是否继续执行(能够控制开始时/完成时计时,建议JitterUntilWithContext)

Poll 类:根据 channel 的关闭或者 函数的返回值 来决定函数是否继续执行(函数执行遇到错误能够直接退出,建议PollImmediate);

Wait 类: 根据 WaitFor 函数返回的 channel 来触发函数执行(可以自由控制函数执行时机,建议WaitForWithContext)

Backoff 类:根据 Backoff 返回的时间间隔来循环触发函数的执行(可以限制次数,建议ExponentialBackoffWithContext)

Jitter函数

在介绍具体函数前,介绍一下对时间间隔进行抖动干扰的函数 Jitter

func Jitter(duration time.Duration, maxFactor float64) time.Duration {
    if maxFactor <= 0.0 {
        maxFactor = 1.0
    }
    return duration + time.Duration(rand.Float64()*maxFactor*float64(duration))
}

Jitter 会返回一个 [duration, (duration+maxFactor*duration) ) 区间的时间间隔

Until 类

根据 channel 的关闭或者 context.Done 的信号 来决定函数是否继续轮询执行(能够控制开始时/完成时计时,建议JitterUntilWithContext)

until 类 的函数参数都具有相同的意义

  • f 表示具体执行的函数

  • period 表示轮询的时间间隔

  • jitterFactor 表示对轮询时间间隔加一个抖动 Jitter(period, jitterFactor)

  • sliding 为 True 表示执行函数的时间间隔是从 f 函数执行就开始计时,False 表示 f 函数执行完成后开始计时

  • stopCh 表示当 stopCh 被关闭则结束轮询

  • ctx 表示当 ctx.Done 是结束函数的轮询

根据函数名称可以一些规律:

Jitter* 表示带时间抖动参数 jitterFactor

NoSliding* 即sliding为false,表示时间间隔从 f 函数执行完成后开始计时

Until* 即sliding为true,表示时间间隔从 f 函数执行就开始计时

函数作用
func JitterUntil(f func(), period time.Duration, jitterFactor float64, sliding bool, stopCh <-chan struct{})先执行 f 之后会再等待 period 的时间
func JitterUntilWithContext(ctx context.Context, f func(context.Context), period time.Duration, jitterFactor float64, sliding bool)
func Until(f func(), period time.Duration, stopCh <-chan struct{})相当于 sliding 为 True ,无抖动的 JitterUntil
func NoSlidingUntil(f func(), period time.Duration, stopCh <-chan struct{})sliding 为 False
func UntilWithContext(ctx context.Context, f func(context.Context), period time.Duration)
func NoSlidingUntilWithContext(ctx context.Context, f func(context.Context), period time.Duration)
func Forever(f func(), period time.Duration)永久轮询执行 f,相当于 Until(f, period, NeverStop)

建议直接全参数的 JitterUntilWithContext

Poll 类型

根据 channel 的关闭 或者 轮询函数的返回值 来决定函数是否继续轮询执行(函数执行遇到错误能够直接退出,建议PollImmediate)

当调用 ConditionFunc 返回 true 或者 error 时,结束对 ConditionFunc 的轮询,并且如果 ConditionFunc 返回了 error 那么Poll* 也会返回该错误

Poll 类型的轮询函数同样具有一些相同意义的参数:

  • interval 为执行 ConditionFunc 的时间间隔

  • timeout 表示 Poll 类型函数的总执行超时时间,如果在 timeout 时间内 ConditionFunc 都没有返回 true 或者 error 时,返回 ErrWaitTimeout

函数作用
func Poll(interval, timeout time.Duration, condition ConditionFunc) error在执行 ConditionFunc 之前会先等待 interval 的时间
func PollUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error监听 stopChPoll
func PollImmediate(interval, timeount time.Duration, condition ConditionFunc) error先执行 ConditionFunc 之后会再等待 interval 的时间
func PollImmediateInfinite(interval time.Duration, condition ConditionFunc) error没有过期时间的 PollImmediate
func PollImmediateUntil(interval time.Duration, condition ConditionFunc, stopCh <- chan struct{}) error监听 stopCh 是否关闭 的 PollImmediate

Poll*PollImmediate* 两种函数的区别是: PollImmediate* 会先执行 ConditionFunc ,然后在等待 interval 的时间,而 Poll* 会先等待 interval再执行ConditionFunc

建议直接全参数的 PollImmediate,其实完全可以被Util类型函数替代。

Wait类型

根据 WaitFor 函数返回的 channel 来触发函数执行(可以自由控制函数执行时机,建议WaitForWithContext)

WaitFor(wait WaitFunc, fn ConditionFunc, done <-chan struct{}) error

WaitFunc 返回一个 channel,当 channel 每可读一次时会执行一次 ConditionFunc,如果 channel 已被关闭,则退出ConditionFunc

done 关闭时,会直接返回 ErrorWaitTimeout。

Backoff类型

根据 Backoff 返回的时间间隔来循环触发函数的执行(可以限制次数,建议ExponentialBackoffWithContext)

type Backoff struct {
    // 时间间隔,用于调用 Step 方法时返回的时间间隔
    Duration time.Duration
    // 用于计算下次的时间间隔
    // Factor 大于 0 时,Backoff 在计算下次的时间间隔时都会根据 Duration * Factor,Factor * Duration 不能大于 Cap
    // 不能为负数
    Factor float64
    // Jitter > 0 时,每次迭代的时间间隔都会额外加上 0 - Duration * Jitter 的随机时间,并且抖动出的时间不会设置为 Duration,而且不受 Caps 的限制
    Jitter  float64
    // 进行指数回退(*Factor) 操作的次数
    // 当 Factor * Duration > Cap 时 Steps 会被设置为 0, Duration 设置为 Cap
    // 也就是说后续的迭代时间间隔都会返回 Duration
    Steps int
    // 最大的时间间隔
    Cap time.Duration
}

BackoffManger 定义了 Backoff 方法,返回一个定时器,用于触发函数的执行。

func BackUntil(f func(), backoff BackoffManager, sliding book, stopCh <-chan struct{})根据 Backoff 的定时器来循环触发 f,直到 stopCh 关闭
func ExponentialBackoff(backoff Backoff, condition ConditionFunc) error根据 backoff 的时间间隔来循环执行 f
func ExponentialBackoffWithContext(ctx context.Context, backoff Backoff, condition ConditionFunc) error
  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 有很多工具可以用来检测 Kubernetes(k8s)中的 Pod,以下是其中几个比较常用的工具: 1. kubelet:Kubernetes 中的组件,负责管理 Pod 的生命周期,可以通过它来检测 Pod 的状态。 2. kubectl:Kubernetes CLI 工具,可以使用它来获取 Pod 的状态信息。 3. Prometheus:开源的监控系统,可以通过它来监控 Kubernetes 集群中的各种组件,包括 Pod。 4. Grafana:可视化监控系统,可以与 Prometheus 集成,以便更好地展示 Pod 的状态信息。 5. Nagios:常用的监控工具,可以通过插件来监控 Kubernetes 集群中的 Pod。 6. Zabbix:另一个常用的监控工具,也可以通过插件来监控 Kubernetes 集群中的 Pod。 这些工具可以根据具体的需求和场景选择使用。 ### 回答2: K8s Pod检测工具是一种用于监测和诊断Kubernetes中Pod状态和运行情况的工具。它可以帮助开发人员和运维人员快速定位问题并进行故障排除。 Kubernetes Pod是K8s中最小的可部署单元,Pod检测工具通常会通过与集群中Pod的API交互来获取Pod的状态和运行指标。它可以检测Pod是否正常运行,是否已经部署成功,以及是否存在错误或故障。 Pod检测工具通常会提供以下功能和特性: 1. 健康检查:Pod检测工具可以定期发送HTTP请求或TCP连接以检查Pod的实时健康状态。这可以帮助我们确定Pod是否已经成功部署,并且正在正常运行。 2. 故障诊断:当Pod发生故障或错误时,Pod检测工具可以捕捉到相关的错误日志和异常,以帮助我们快速诊断和解决问题。它可以提供详细的错误信息和告警,以便我们及时采取措施。 3. 自动重启:当Pod检测工具检测到Pod运行异常时,它可以自动触发Pod的重启操作,以尝试将Pod恢复到正常状态。这可以增加系统的可用性和稳定性。 4. 监控报告:Pod检测工具可以生成监控报告,汇总和展示集群中所有Pod的状态和运行指标。这可以帮助我们全面了解集群的整体健康状况,并进行性能优化和容量规划。 总之,K8s Pod检测工具是一种非常有用的工具,它可以帮助我们更好地管理和监控Kubernetes集群中的Pod,并及时发现和解决问题,保证应用的稳定性和可靠性。 ### 回答3: Kubernetes(简称k8s)是一个用于容器编排和管理的开源平台,可以帮助用户更好地部署、扩展和管理容器化应用程序。在k8s中,Pod是k8s的最小管理单元,一个Pod可以包含一个或多个容器,并共享相同的网络和存储。 为了确保Pod的健康和稳定运行,k8s提供了一些检测工具来监控Pod的状态和健康状况。其中包括以下几个工具: 1. Liveness Probe(活跃探测器):用于检测Pod中容器的健康状况。Liveness Probe会定期向容器发送检测请求,如果容器无响应或返回状态码表示容器不健康,k8s会认为该容器出现问题,并尝试重新启动Pod以恢复容器的健康状态。 2. Readiness Probe(就绪探测器):用于检测Pod是否已经准备好接收流量。Readiness Probe会定期向容器发送检测请求,只有当容器返回成功状态码时,k8s才会将该Pod加入服务负载均衡,使其能够接收请求。这样可以确保只有健康的容器才会被访问。 3. Startup Probe(启动探测器):用于检测Pod中容器的启动过程。Startup Probe会在容器启动后立即开始工作,并定期向容器发送检测请求。只有当容器返回成功状态码时,k8s才会认为容器已成功启动,并将该Pod视为可用。 通过使用这些检测工具,k8s可以及时发现并处理Pod中容器的问题,确保应用程序的稳定性和可用性。同时,用户也可以根据自己的需求,自定义配置这些探测器的参数,以满足特定的应用场景和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值