Руководство по системному администрированию#
Термины и определения#
Термин/аббревиатура |
Определение |
|---|---|
Платформа |
Платформа оркестрации приложений со средствами автоматизации и управления на основе политик, например, Kubernetes |
Deployment / «kind: Deployment» |
Набор инструкций для запуска приложения в Kubernetes |
Pod / «kind: Pod» |
Набор контейнеров внутри узла кластера Kubernetes |
CLI |
Command line interface — интерфейс командной строки, где выполняются команды с использованием терминала |
SDTM |
Программный компонент Synapse Distributed Transaction Manager (код SDTM) из состава программного продукта Platform V Synapse Service Mesh (код SSM) |
Kubernetes |
Платформа оркестрации приложений со средствами автоматизации и управления на основе политик |
MONA |
Программный компонент Platform V Monitor — Объединенный мониторинг Unimon |
SSM |
Platform V Synapse Service Mesh — Программный продукт на базе Istio SE, обеспечивающий возможность создания сервисной сети поверх Платформенной в Kubernetes |
URL |
Uniform Resource Locator — стандартизированный способ записи адреса ресурса в сети Интернет» |
DTM server |
Приложение, обеспечивающее управление и агрегацию распределенных транзакций |
API расширение |
Cервис, расширяющий API для отправки сообщений Kafkа |
KFGT / Kafka gateway |
Компонент Kafka gateway продукта Platform V Enterprise integration (SEI) |
KFGT dtm-интерфейс |
Расширяющий Sidecar приложения для интеграции сервиса KFGT с DTM server и проведением XA-транзакции |
XA транзакция |
Спецификация распределенных транзакций |
RM |
Менеджер ресурсов (Resource Manager), поддерживающий DTM api (sdk) |
Kafka |
Распределенный программный брокер сообщений |
Сценарии администрирования#
Программный компонент Synapse Distributed Transaction Manager (код SDTM) не имеет собственного пользовательского интерфейса для администрирования. Все действия по управлению им производятся с использованием интерфейсов, предоставляемых Платформой Kubernetes.
Администратору должна быть назначена роль по принципу минимальных полномочий.
Запуск#
С использованием веб-интерфейса Kubernetes
Шаг |
Действие |
|---|---|
Вход в веб-консоль Kubernetes |
Перейти по ссылке (URL) веб-консоли нужного кластера Kubernetes, в окне ввода учетных данных ввести токен пользователя или «kubeconfig» |
Переход в нужный проект |
Выбрать нужный проект можно в выпадающем списке в шапке веб-интерфейса Kubernetes |
Запуск Pod |
1. В меню выберите пункт Workload/Deployments |
Выход из веб-консоли Kubernetes |
1. Нажмите по имени пользователя, чтобы раскрыть меню учетной записи |
Через CLI kubernetes (kubectl)
Шаг |
Действия |
Описание |
|---|---|---|
Вход в kubernetes |
Загрузите «kubeConfig» от вашего «ServiceAccount». Заведите переменную |
— |
Переход в нужный «Namespace» |
Введите команду: |
— |
Запуск приложения |
В консоли выполните команду: |
N > 0 — требуемое количество запущенных Pods приложения |
Остановка#
С использованием веб-интерфейса Kubernetes
Шаг |
Действие |
|---|---|
Логин в веб-консоль Kubernetes |
Перейти по ссылке (URL) веб-консоли нужного кластера Kubernetes, в окне ввода учетных данных ввести токен пользователя или «kubeconfig» |
Переход в нужный проект |
Выбрать нужный проект можно в выпадающем списке в шапке веб-интерфейса Kubernetes |
Остановка компонента |
Выполнить следующие действия: |
Выход из веб-консоли Kubernetes |
Выполнить следующие действия: |
Через CLI kubernetes (kubectl)
Шаг |
Действия |
Описание |
|---|---|---|
Остановка приложения |
В консоли выполнить команду |
— |
Проверка работоспособности#
С использованием веб-интерфейса Kubernetes
Шаг |
Действие |
|---|---|
Вход в веб-консоль Kubernetes |
Перейдите по ссылке (URL) веб-консоли нужного кластера Kubernetes, в окне ввода учетных данных введите токен пользователя или kubeconfig |
Переход в нужный проект |
Выберите нужный проект в выпадающем списке в шапке веб-интерфейса Kubernetes |
Переход во вкладку Pod |
1. В меню выбрать пункт Workload/Pods |
Через CLI kubernetes (kubectl)
Шаг |
Действия |
Описание |
|---|---|---|
Получение имени Pod |
В консоли выполнить команду |
Выбрать Pods с наименованиями «sdtm-api-transaction-manager-kafka-****», «kfgt-dtm-kafka-transactional-gateway-****», указанные наименования пригодятся на следующем шаге (<имя Pod>) |
Проверить работоспособность |
1. В консоли выполнить команду: |
— |
Также проверить отсутствие ошибок в рамках логов приложения.
Настройка выделения ресурсов#
С использованием веб-интерфейса Kubernetes
Шаг |
Действие |
|---|---|
Логин в веб-консоль Kubernetes |
Перейти по ссылке (URL) веб-консоли нужного кластера Kubernetes, в окне ввода учетных данных ввести токен пользователя или «kubeconfig» |
Переход в проект |
Выбрать нужный проект можно в выпадающем списке в шапке веб-интерфейса Kubernetes |
Вход в Deployment |
Выполнить следующие действия: |
Скорректировать параметры |
В окне редактирования найдите параметры: |
Сохранение |
Нажмите кнопку Update |
Проверка конфигурации |
Снова зайти на вкладку Edit в YAML или JSON |
Выход из веб-консоли Kubernetes |
Выполнить следующие действия: |
Через CLI kubernetes (kubectl)
Шаг |
Действие |
Описание |
|---|---|---|
Получить текущие Deployment приложений |
1. В консоли выполнить команду: |
— |
Скорректировать параметры |
В консоли выполнить команду: |
$CONTAINER_NAME — имя конфигурации «kind: Deployment» |
Проверить конфигурацию |
1. В консоли выполнить команду: |
— |
Изменение количества Pods#
С использованием веб-интерфейса Kubernetes
Шаг |
Действие |
|---|---|
Вход в веб-консоль Kubernetes |
Перейти по ссылке (URL) веб-консоли нужного кластера Kubernetes, в окне ввода учетных данных ввести токен пользователя или «kubeconfig» |
Переход в нужный проект |
Выбрать нужный проект можно в выпадающем списке в шапке веб-интерфейса Kubernetes |
Запуск Pod |
1. В меню выберите пункт Workload/Deployments |
Выход из веб-консоли Kubernetes |
1. Нажмите по имени пользователя, чтобы раскрыть меню учетной записи. |
Через CLI kubernetes (kubectl)
Шаг |
Действия |
Описание |
|---|---|---|
Увеличить/уменьшить количество Pods |
В консоли выполнить команду: |
— |
Выгрузка системных логов#
С использованием веб-интерфейса Kubernetes
Шаг |
Действие |
|---|---|
Вход в веб-консоль Kubernetes |
Перейдите по ссылке (URL) веб-консоли нужного кластера Kubernetes, в окне ввода учетных данных введите токен пользователя или kubeconfig |
Переход в нужный проект |
Выберите нужный проект можно в выпадающем списке в шапке веб-интерфейса Kubernetes |
Выгрузить лог |
1. В меню выберите пункт Workload/Pods |
Выход из веб-консоли Kubernetes |
1. Выберите имя пользователя, чтобы раскрыть меню учетной записи |
Через CLI kubernetes (kubectl)
Шаг |
Действия |
Описание |
|---|---|---|
Выгрузить лог |
В консоли выполнить команду: |
— |
События системного журнала#
Системный лог выводится в консоль контейнера приложения.
API расширение#
Уровни логирования ERROR, WARN, INFO, DEBUG, FATAL или PANIC. Уровень логирования задается при старте приложения в настройках «kind: ConfigMap». Уровень по умолчанию: INFO. Уровень логирования устанавливает администратор данного компонента.
Уровень логирования DEBUG не рекомендован для ПРОМ среды.
Наименование контейнера в рамках «kind: Pod» — sdtm-proxy
Логирование об инициализации транзакции
{"level":"info","ts":"2024-11-13 15:04:39.4250","msg":"Client proxy start xa","xa":{"gid":"AL8EtqtZ3gvNdJbpmHVTgE","trans_type":"xa","branch_headers":{"Accept":"*/*","Content-Length":"5","Content-Type":"application/x-www-form-urlencoded","User-Agent":"curl/7.61.1"},"concurrent":false,"protocol":"","Phase2URL":""}}
{"level":"info","ts":"2024-11-13 15:35:46.4205","msg":"Client proxy incoming request"}
DTM server#
Уровни логирования ERROR, WARN, INFO, DEBUG, FATAL или PANIC. Уровень логирования задается при старте приложения в настройках «kind: ConfigMap». Уровень по умолчанию: INFO. Уровень логирования устанавливает администратор данного компонента.
Уровень логирования DEBUG не рекомендован для ПРОМ среды.
Наименование контейнера в рамках «kind: Pod» — sdtm
Логирование успешной передачи транзакции в KFGT
{"level":"info","ts":"2024-11-13T15:04:39.424Z","caller":"dtmutil/utils.go:118","msg":" 1ms 200 POST /api/dtmsvr/prepare {\"dtm_result\":\"SUCCESS\"}"}
{"level":"info","ts":"2024-11-13T15:04:39.428Z","caller":"dtmsvr/api.go:133","msg":"LockGlobalSaveBranches result: <nil>: gid: AL8EtqtZ3gvNdJbpmHVTgE old status: prepared branches: [{\"id\":0,\"create_time\":null,\"update_time\":null,\"gid\":\"AL8EtqtZ3gvNdJbpmHVTgE\",\"url\":\"HTTP://kafka-transactional-gateway-smvvpj:8081/server/xa\",\"branch_id\":\"01\",\"op\":\"rollback\",\"status\":\"prepared\"},{\"id\":0,\"create_time\":null,\"update_time\":null,\"gid\":\"AL8EtqtZ3gvNdJbpmHVTgE\",\"url\":\"HTTP://kafka-transactional-gateway-smvvpj:8081/server/xa\",\"branch_id\":\"01\",\"op\":\"commit\",\"status\":\"prepared\"}]"}
{"level":"info","ts":"2024-11-13T15:04:39.428Z","caller":"dtmutil/utils.go:118","msg":" 0ms 200 POST /api/dtmsvr/registerBranch {\"dtm_result\":\"SUCCESS\"}"}
{"level":"info","ts":"2024-11-13T15:04:39.428Z","caller":"dtmsvr/trans_process.go:98","msg":"MaySaveNewTrans result: storage: UniqueKeyConflict, global: {\"id\":0,\"create_time\":\"2024-11-13T15:04:39.428935293Z\",\"update_time\":\"2024-11-13T15:04:39.428935293Z\",\"gid\":\"AL8EtqtZ3gvNdJbpmHVTgE\",\"trans_type\":\"xa\",\"status\":\"submitted\",\"protocol\":\"http\",\"options\":\"{\\\"branch_headers\\\":{\\\"Accept\\\":\\\"*/*\\\",\\\"Content-Length\\\":\\\"5\\\",\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded\\\",\\\"User-Agent\\\":\\\"curl/7.61.1\\\"},\\\"concurrent\\\":false}\",\"next_cron_interval\":10,\"next_cron_time\":\"2024-11-13T15:04:49.428927066Z\",\"branch_headers\":{\"Accept\":\"*/*\",\"Content-Length\":\"5\",\"Content-Type\":\"application/x-www-form-urlencoded\",\"User-Agent\":\"curl/7.61.1\"},\"concurrent\":false} branches: []"}
{"level":"info","ts":"2024-11-13T15:04:39.429Z","caller":"dtmsvr/trans_status.go:85","msg":"ChangeGlobalStatus to submitted ok for {\"id\":0,\"create_time\":\"2024-11-13T15:04:39.423849439Z\",\"update_time\":\"2024-11-13T15:04:39.429005856Z\",\"gid\":\"AL8EtqtZ3gvNdJbpmHVTgE\",\"trans_type\":\"xa\",\"status\":\"submitted\",\"protocol\":\"http\",\"options\":\"{\\\"concurrent\\\":false}\",\"next_cron_interval\":10,\"next_cron_time\":\"2024-11-13T15:04:49.4238354Z\",\"concurrent\":false}"}
{"level":"info","ts":"2024-11-13T15:04:39.429Z","caller":"dtmutil/utils.go:118","msg":" 0ms 200 POST /api/dtmsvr/submit {\"dtm_result\":\"SUCCESS\"}"}
{"level":"info","ts":"2024-11-13T15:04:39.439Z","caller":"dtmsvr/trans_status.go:105","msg":"LockGlobalSaveBranches ok: gid: AL8EtqtZ3gvNdJbpmHVTgE old status: prepared branches: {\"id\":0,\"create_time\":null,\"update_time\":\"2024-11-13T15:04:39.438561504Z\",\"gid\":\"AL8EtqtZ3gvNdJbpmHVTgE\",\"url\":\"HTTP://kafka-transactional-gateway-smvvpj:8081/server/xa\",\"branch_id\":\"01\",\"op\":\"commit\",\"status\":\"succeed\",\"finish_time\":\"2024-11-13T15:04:39.438561504Z\"}"}
{"level":"info","ts":"2024-11-13T15:04:39.440Z","caller":"dtmsvr/trans_status.go:85","msg":"ChangeGlobalStatus to succeed ok for {\"id\":0,\"create_time\":\"2024-11-13T15:04:39.428935293Z\",\"update_time\":\"2024-11-13T15:04:39.439471256Z\",\"gid\":\"AL8EtqtZ3gvNdJbpmHVTgE\",\"trans_type\":\"xa\",\"status\":\"succeed\",\"protocol\":\"http\",\"finish_time\":\"2024-11-13T15:04:39.439471256Z\",\"options\":\"{\\\"branch_headers\\\":{\\\"Accept\\\":\\\"*/*\\\",\\\"Content-Length\\\":\\\"5\\\",\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded\\\",\\\"User-Agent\\\":\\\"curl/7.61.1\\\"},\\\"concurrent\\\":false}\",\"next_cron_interval\":10,\"next_cron_time\":\"2024-11-13T15:04:49.428927066Z\",\"branch_headers\":{\"Accept\":\"*/*\",\"Content-Length\":\"5\",\"Content-Type\":\"application/x-www-form-urlencoded\",\"User-Agent\":\"curl/7.61.1\"},\"concurrent\":false}"}
KFGT dtm-интерфейс#
Уровни логирования ERROR, WARN, INFO, DEBUG, FATAL или PANIC. Уровень логирования задается при старте приложения в настройках «kind: ConfigMap». Уровень по умолчанию: INFO. Уровень логирования устанавливает администратор данного компонента.
Уровень логирования DEBUG не рекомендован для ПРОМ среды.
Наименование контейнера в рамках «kind: Pod» — kfgt-dtm-interface
Логирование об успешной записи транзакции в DTM server
{"level":"info","ts":"2024-11-13 15:04:39.4270","msg":"Action","gid":"AL8EtqtZ3gvNdJbpmHVTgE"}
{"level":"info","ts":"2024-11-13 15:04:39.4309","msg":"Commit","gid":"AL8EtqtZ3gvNdJbpmHVTgE"}
Логирование о получении пустого запроса
{"level":"error","ts":"2024-11-14 08:11:51.2446","msg":"response status is not 200","status code":400,"gid":"vHjXhsASXX4n6rRMgiLfrU","stacktrace":"dtm-demo-server/internal/logger.Error\n\tdtm-demo-server/internal/logger/logger.go:50\ndtm-demo-server/internal/pkg/adapter/kfgt.(*HttpClient).Send\n\tdtm-demo-server/internal/pkg/adapter/kfgt/http.go:54\ndtm-demo-server/internal/pkg/adapter/kfgt.(*KfgtAdapter).Send\n\tdtm-demo-server/internal/pkg/adapter/kfgt/kfgt.go:36\ndtm-demo-server/internal/service.(*ServerProxy).ProxyXa\n\tdtm-demo-server/internal/service/server.go:62\ndtm-demo-server/internal/handler.(*ServerHandler).Proxy\n\tdtm-demo-server/internal/handler/server.go:37\nnet/http.HandlerFunc.ServeHTTP\n\tnet/http/server.go:2171\nnet/http.(*ServeMux).ServeHTTP\n\tnet/http/server.go:2688\ndtm-demo-server/internal/handler.(*ServerHandler).ServeHTTP\n\tdtm-demo-server/internal/handler/server.go:33\nnet/http.serverHandler.ServeHTTP\n\tnet/http/server.go:3142\nnet/http.(*conn).serve\n\tnet/http/server.go:2044"}
{"level":"error","ts":"2024-11-14 08:11:51.2446","msg":"Server proxy send failed","error":"got error from kfgt","stacktrace":"dtm-demo-server/internal/logger.Error\n\tdtm-demo-server/internal/logger/logger.go:50\ndtm-demo-server/internal/service.(*ServerProxy).ProxyXa\n\tdtm-demo-server/internal/service/server.go:64\ndtm-demo-server/internal/handler.(*ServerHandler).Proxy\n\tdtm-demo-server/internal/handler/server.go:37\nnet/http.HandlerFunc.ServeHTTP\n\tnet/http/server.go:2171\nnet/http.(*ServeMux).ServeHTTP\n\tnet/http/server.go:2688\ndtm-demo-server/internal/handler.(*ServerHandler).ServeHTTP\n\tdtm-demo-server/internal/handler/server.go:33\nnet/http.serverHandler.ServeHTTP\n\tnet/http/server.go:3142\nnet/http.(*conn).serve\n\tnet/http/server.go:2044"}
{"level":"error","ts":"2024-11-14 08:11:51.2447","msg":"Error proxying XA request","body":{},"error":"got error from kfgt","stacktrace":"dtm-demo-server/internal/logger.Error\n\tdtm-demo-server/internal/logger/logger.go:50\ndtm-demo-server/internal/handler.(*ServerHandler).Proxy\n\tdtm-demo-server/internal/handler/server.go:39\nnet/http.HandlerFunc.ServeHTTP\n\tnet/http/server.go:2171\nnet/http.(*ServeMux).ServeHTTP\n\tnet/http/server.go:2688\ndtm-demo-server/internal/handler.(*ServerHandler).ServeHTTP\n\tdtm-demo-server/internal/handler/server.go:33\nnet/http.serverHandler.ServeHTTP\n\tnet/http/server.go:3142\nnet/http.(*conn).serve\n\tnet/http/server.go:2044"}
KFGT#
Уровни логирования ERROR, WARN, INFO, DEBUG, FATAL или PANIC. Уровень логирования задается при старте приложения в настройках «kind: ConfigMap». Уровень по умолчанию: INFO. Уровень логирования устанавливает администратор данного компонента.
Уровень логирования DEBUG не рекомендован для ПРОМ среды.
Наименование контейнера в рамках «kind: Pod» — kfgt
Логирование об успешной отправке транзакции в Kafka
2024-11-13 15:04:39.433 [INFO ] [http-nio-8080-exec-35] [c.s.s.kafka.service.api.RestService] [T:] - Сообщение получено от сервиса: RqUID: AL8EtqtZ3gvNdJbpmHVTgE
2024-11-13 15:04:39.436 [INFO ] [http-nio-8080-exec-35] [c.s.s.kafka.service.KafkaService] [T:] - Сообщение отправлено в топик topic-test в кластер [vm-sy-sec-test-sy-kafka-111.vdc09.sy.dev.sbt:9092] RqUID: AL8EtqtZ3gvNdJbpmHVTgE
Логирование о недоступности сервиса
2024-11-14 07:53:57.480 [INFO ] [main] [c.s.s.c.s.util.GRpcServiceUtils] [T:] - Недоступен повтор запросов для канала 127.0.0.1:6565
Предупреждение о пустом запросе
2024-11-14 08:11:01.989 [WARN ] [http-nio-8080-exec-5] [o.s.w.s.m.s.DefaultHandlerExceptionResolver] [T:] - Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<java.lang.String> com.sbt.synapse.kafka.service.api.RestService.controller(java.lang.String,org.springframework.http.HttpHeaders)]
События мониторинга#
Программный компонент SDTM не интегрирован с компонентом «Объединенный мониторинг Unimon» продукта Platform V Monitor (MONA).
Для наблюдения за состоянием Pods используйте существующие средства мониторинга Платформы, описанные в документации на конкретную платформу.
Компонент не порождает метрики мониторинга.
Часто встречающиеся проблемы и пути их устранения#
Проблема |
Причина |
Решение |
|---|---|---|
Не стартует Pod приложения |
Недостаточно ресурсов |
Увеличить limits/requests для приложения |
Не стартует Pod приложения |
Нет доступной node для запуска |
Зарегистрировать обращение в поддержку инфраструктуры |
Не стартует Pod приложения |
Ошибка в конфигурации |
Выгрузить лог, провести анализ, скорректировать конфигурацию |
Частый перезапуск контейнера приложения |
Медленная загрузка приложения |
Увеличить задержку и/или интервал опроса Liveness пробы |
Частый перезапуск контейнера приложения |
Недостаточно ресурсов |
Увеличить limits/requests для приложения |
Ошибка при вызове |
Нет доступных Pods сервиса, которому направлен вызов |
Проверить состояние сервиса - получателя вызова |
Ошибка при вызове |
Ошибки в конфигурации сервисного прокси |
Выгрузить лог сервисного прокси, проанализировать, устранить ошибки (ознакомиться с указанными действиями можно в документации компонента SPVX «Руководство по системному администрированию», раздел «Сценарии администрирования»). |
Ошибка при вызове |
Ошибки в конфигурации kafka-шлюза (KFGT) |
Выгрузить лог kafka-шлюза, проанализировать, устранить ошибки (ознакомиться с указанными действиями можно в документации компонента KFGT «Руководство по системному администрированию», раздел «Сценарии администрирования»). |