Как kubelet синхронизировать события с apiserver?
Недавно я исследовал, как kubelet синхронизирует события с apiserver, но не могу найти, где находится код.
1 ответ
Источник kubelet доступен здесь.
Kubelet может получить конфигурации Pod, требуемые локальным узлом, несколькими способами. Наиболее важным способом является Apiserver. Kubelet также может получить конфигурации Pod, указав каталог файлов или получив доступ к указанному HTTP-порту.
При запуске Kubelet, PodConfig
объект создан. Код https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/config/config.go#L58:
type PodConfig struct {
pods *podStorage
mux *config.Mux
// the channel of denormalized changes passed to listeners
updates chan kubetypes.PodUpdate
...
}
PodConfig
по сути является мультиплексором конфигураций Pod. Встроенныйmux
может прослушивать источники различных конфигураций Pod (включая apiserver, file и http) и периодически синхронизировать состояние конфигурации Pod источников.
Код https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/types/pod_update.go#L80:
type PodUpdate struct {
Pods []*v1.Pod
Op PodOperation
Source string
}
Op
определяет тип изменения Pod. Например, это могут быть такие значения, как ADD
или же REMOVE
, В конце концов все типы PodUpdate
будет введен в updates
из podConfig
, Так что есть только необходимость слушать update
Канал для получения обновлений Pod конфигурации локального узла.
После завершения запуска Kubelet syncLoop
функция выполнена. Код https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet.go#L1806:
// syncLoop is the main loop for processing changes. It watches for changes from
// three channels (file, apiserver, and http) and creates a union of them. For
// any new change seen, will run a sync against desired state and running state. If
// no changes are seen to the configuration, will synchronize the last known desired
// state every sync-frequency seconds. Never returns.
func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHandler) {
...
for {
...
if !kl.syncLoopIteration(updates, handler, syncTicker.C, housekeepingTicker.C, plegCh) {
break
}
...
}
Весь процесс подробно описан в следующей статье: Понимание фрейма выполнения Kubelet Core.