大佬教程收集整理的这篇文章主要介绍了kubelet监控静态Pod,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
静态Pod路径默认是空。
当静态Pod路径是空时,路径会被设置成/etc/kubernetes/manifests。
/var/lib/kubelet/config.yaml配置了FilecheckFrequency值是20s即List的间隔周期是20s。
pkg/kubelet/config/file_linux.gostartWatch函数
如果watch失败,那么看错误是否支持重试。1. 支持重试,继续watch。2. 不支持重试,进入回退流程。创建BACkoff对象后,每隔1s调用doWatch函数(如果处于回退流程中,那么需要等待,不会调用doWatch函数)。
const (
// 回退最小时间
retryPeriod = 1 * time.Second
// 回退最大时间
maxRetryPeriod = 20 * time.Second
)
func (s *sourceFilE) startWatch() {
// 创建BACkoff对象
BACkOff := flowcontrol.NewBACkOff(retryPeriod, maxRetryPeriod)
BACkOffId := "watch"
go wait.Forever(func() {
if BACkOff.IsInBACkOffSinceupdate(BACkOffId, time.Now()) {
return
}
if err := s.doWatch(); err != nil {
klog.Errorf("Unable to read config path %q: %v", s.path, err)
if _, retryable := err.(*retryableError); !retryable {
BACkOff.Next(BACkOffId, time.Now())
}
}
}, retryPeriod)
}
staging/src/k8s.io/client-go/util/flowcontrol/BACkoff.goNewBACkOff函数
type Duration int64
type BACkoff struct {
sync.Mutex
Clock clock.Clock
defaultDuration time.Duration
maxDuration time.Duration
perItemBACkoff map[String]*BACkoffEntry
}
type BACkoffEntry struct {
// 回退间隔时间
BACkoff time.Duration
// 回退开始时间
lastupdate time.Time
}
type RealClock struct{}
// 参数值分别是1s和20s
func NewBACkOff(initial, max time.Duration) *BACkoff {
return &BACkoff{
perItemBACkoff: map[String]*BACkoffEntry{},
Clock: clock.RealClock{},
defaultDuration: initial,
maxDuration: max,
}
}
staging/src/k8s.io/client-go/util/flowcontrol/BACkoff.goIsInBACkOffSinceupdate函数
如果函数返回false,那么说明还在回退流程中;否则,说明回退流程已经结束。
1. 加锁。2. 获取map里面key是“watch”对应的value,即BACkoffEntry。3. 如果没有该key,那么返回false。4. 如果当前时间与回退开始时间差值>2倍maxDuration,那么返回false。(此步多余,第5步已经覆盖了,2倍maxDuration>BACkoff)5. 如果当前时间与回退开始时间差值<回退间隔时间,那么返回false;否则,返回true。6. 释放锁。
func (p *BACkoff) IsInBACkOffSinceupdate(id String, eventTime time.TimE) bool {
p.Lock()
defer p.Unlock()
entry, ok := p.perItemBACkoff[id]
if !ok {
return false
}
if hasExpired(eventTime, entry.lastupdate, p.maxDuration) {
return false
}
return eventTime.Sub(entry.lastupdatE) < entry.BACkoff
}
staging/src/k8s.io/client-go/util/flowcontrol/BACkoff.goNext函数
1. 加锁。2. 获取map里面key是“watch”对应的value,即BACkoffEntry。3. 如果没有该key或者当前时间与回退开始时间差值>2倍maxDuration,那么初始化(插入key-“watch”对应的BACkoffEntry);否则,BACkoffEntry的回退间隔时间BACkoff翻倍,最大值是maxDuration即20s。4. 更新BACkoffEntry里面的lastupdate即回退开始时间。5. 释放锁。
// 当前时间与回退开始时间差值最大是2倍maxDuration。
func hasExpired(eventTime time.Time, lastupdate time.Time, maxDuration time.Duration) bool {
return eventTime.Sub(lastupdatE) > maxDuration*2
}
func (p *BACkoff) initEntryUnsafe(id String) *BACkoffEntry {
// 起始回退间隔时间是1s。
entry := &BACkoffEntry{BACkoff: p.defaultDuration}
p.perItemBACkoff[id] = entry
return entry
}
func (p *BACkoff) Next(id String, eventTime time.TimE) {
p.Lock()
defer p.Unlock()
entry, ok := p.perItemBACkoff[id]
// 只有第一次回退或者当前时间与回退开始时间差值超过2倍maxDuration即40s,才会把回退间隔时间重置成1s。
if !ok || hasExpired(eventTime, entry.lastupdate, p.maxDuration) {
entry = p.initEntryUnsafe(id)
} else {
delay := entry.BACkoff * 2 // exponential
// 确保回退间隔时间最大是20s。
entry.BACkoff = time.Duration(Integer.Int64Min(int64(delay), int64(p.maxDuration)))
}
entry.lastupdate = p.Clock.Now()
}
1s |
2s |
4s |
8s |
16s |
20s |
... |
20s |
一开始,呈现2的指数级变化,直到16s。最后,一直20s。除非当前时间与回退开始时间差值超过2倍maxDuration即40s,从而重置回退间隔时间为1s。
cd kubelet-monitor-manifests-demo
go build main.go
./main
/root/test目录下放入a.log和b.log,内容分别如下:
$ cat a.log
{"Namespace":"Bett", "Name":"McLaugh", "Desc":"beijing"}
$ cat b.log
{"Namespace":"abc", "Name":"McLaugh", "Desc":"xxx"}
缓存1的全量数据是最新的,缓存2的全量数据是旧的。缓存1和缓存2对比方式:遍历缓存1中所有的key,如果缓存1中的key在缓存2中没有,那么说明该info需要增加;如果缓存1中的key在缓存2中有而且value发生了变化,那么该info需要更新。遍历缓存2中所有的key,如果缓存2中的key在缓存1中没有,那么说明该info需要删除。把变化的信息发送到缓冲通道,交给数据处理中心。
以上是大佬教程为你收集整理的kubelet监控静态Pod全部内容,希望文章能够帮你解决kubelet监控静态Pod所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。