Как 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.

Другие вопросы по тегам