Проверки работоспособности и настройка для эксплуатации
HEALTHCHECK, tini и обработка сигналов в контейнерах
«Проверки работоспособности и настройка для эксплуатации» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Конечные точки проверки состояния
Конечная точка проверки состояния позволяет балансировщикам нагрузки и оркестраторам убедиться, что сервис работает и готов принимать трафик. Распространены два вида: проверка работоспособности (запущен ли сервис?) и проверка готовности (может ли он обрабатывать запросы?).
Конечная точка проверки работоспособности
Возвращает 200 OK, если процесс работает. Простой обработчик, который всегда успешно проходит проверку, — достаточно, чтобы процесс был запущен:
mux.HandleFunc("/healthz/live", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
})Конечная точка проверки готовности
Возвращает 200 только тогда, когда сервис готов (подключена база данных, прогрет кэш, выполнены миграции). Во время запуска или при ухудшении состояния возвращает 503:
mux.HandleFunc("/healthz/ready", func(w http.ResponseWriter, r *http.Request) {
if err := db.PingContext(r.Context()); err != nil {
w.WriteHeader(http.StatusServiceUnavailable); return
}
w.WriteHeader(http.StatusOK)
})Проверки Kubernetes
Настройте проверки работоспособности и готовности в спецификации Deployment Kubernetes:
livenessProbe:
httpGet: { path: /healthz/live, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet: { path: /healthz/ready, port: 8080 }
initialDelaySeconds: 3
periodSeconds: 5Настройка GOMAXPROCS
В контейнерах GOMAXPROCS по умолчанию равен количеству процессоров CPU хоста, а не ограничению CPU контейнера. Используйте go.uber.org/automaxprocs, чтобы правильно задать его на основе ограничений cgroup.
import _ "go.uber.org/automaxprocs"Ограничения памяти
Задайте GOMEMLIMIT равным ограничению памяти контейнера, чтобы сборщик мусора мог активнее использовать память до срабатывания средства завершения процессов из-за OOM:
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024) // 512 MiBНастройка сборщика мусора
Задайте GOGC, чтобы управлять частотой работы сборщика мусора. Значение по умолчанию — 100 (сборка мусора выполняется, когда размер кучи удваивается). Меньшие значения уменьшают потребление памяти ценой более частой сборки мусора; большие значения позволяют использовать больше памяти, но сокращают частоту сборки мусора.
os.Setenv("GOGC", "200") // allow heap to grow 2× before GCНастройка pool соединений
Задайте ограничения pool соединений с базой данных с учётом ограничений ресурсов контейнера и значения max_connections базы данных:
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(5 * time.Minute)Предоставление метрик
Предоставляйте метрики Prometheus на отдельном порту, а не на основном порту API, чтобы не раскрывать внутренние данные внешним клиентам:
go func() {
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":9090", nil)
}()Корректное завершение работы в Kubernetes
Задайте terminationGracePeriodSeconds в спецификации пода, чтобы оставить достаточно времени для тайм-аута завершения работы. Сразу возвращайте 503 из проверки готовности после получения SIGTERM.
Профилирование в рабочей среде
Включайте pprof на непубличном порту с аутентификацией. Никогда не предоставляйте его публично — он раскрывает внутреннее состояние и может использоваться для отказа в обслуживании сервиса.
Быстрая проверка
Почему GOMAXPROCS следует задавать на основе ограничений CPU контейнера, а не количества CPU хоста?
Итоги: проверки состояния и настройка рабочей среды
Основные положения:
- Проверка работоспособности: процесс запущен; проверка готовности: сервис может принимать трафик
- automaxprocs задаёт GOMAXPROCS на основе ограничений CPU контейнера
- GOMEMLIMIT предотвращает завершение процессов из-за OOM; GOGC настраивает частоту сборки мусора
- Предоставляйте метрики на отдельном порту, доступном только из внутренней сети
Часто задаваемые вопросы
Урок «Проверки работоспособности и настройка для эксплуатации» бесплатный?
Да — полный текст урока «Проверки работоспособности и настройка для эксплуатации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Проверки работоспособности и настройка для эксплуатации»?
HEALTHCHECK, tini и обработка сигналов в контейнерах Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Проверки работоспособности и настройка для эксплуатации»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Многоэтапная сборка Docker для Go
- Конфигурация окружения и секреты
- Docker Compose для локальной разработки
- Проверки работоспособности и настройка для эксплуатации