Как просматривать журналы контейнеров через stackdriver на GKE - PullRequest
1 голос
/ 25 мая 2020

Я читал, что по умолчанию кластеры на GKE записывают все журналы в stackdriver. В пользовательском интерфейсе GKE я могу видеть журналы контейнеров всех моих развертываний, но я хочу получить эти журналы из API программно.

Я пытался сделать что-то вроде gcloud logging read "resource.labels.pod_id="<pod-id>"", но ничего не возвращается.

Нужно ли мне делать что-то особенное, чтобы включить ведение журнала в кластере? А если нет, как мне получить доступ к журналам для определенного c развертывания / модуля / контейнера?

Кроме того, эти журналы постоянны? Например, когда развертывание завершается, могу ли я получить доступ к этим журналам?

1 Ответ

1 голос
/ 26 мая 2020

У вас есть несколько вариантов чтения логов модулей GKE из Stackdriver. Вот некоторые из них:

Чтение журналов

Чтобы читать записи журнала в журнале, вы можете выполнить любое из следующих действий:

  • Используйте средство просмотра журналов в Google Cloud Console.
  • Вызов API ведения журнала через клиентские библиотеки для вашего языка программирования.
  • Вызов конечных точек REST API ведения журнала напрямую. См. Справочную документацию по API ведения журналов.
  • Используйте Cloud SDK. Для получения дополнительной информации см. Интерфейс командной строки gcloud logging.

    Cloud.google.com: Logging: Setup

Что касается:

Нужно ли мне делать что-то особенное, чтобы включить ведение журнала в кластере? А если нет, как мне получить доступ к журналам для определенного c развертывания / модуля / контейнера?

См.: Cloud.google.com: Ведение журнала: Контроль доступа

Ответ ниже:

Кроме того, эти журналы постоянны? Например, когда развертывание завершается, могу ли я получить доступ к этим журналам?

Да, вы все равно можете получить доступ к этим журналам, даже если развертывание было удалено. Вы все равно можете получить доступ к журналам, даже если удалите свой кластер. Журналы, хранящиеся в Stackdriver, имеют политики хранения , которые будут хранить журналы в течение установленного периода времени. См .:


Пожалуйста, посмотрите на пример ниже, который показывает, как получить доступ к журналам с помощью команды gcloud:

Шаги:

  • Создайте Deployment, который будет отправлять журналы в Stackdriver
  • Проверьте, хранятся ли журналы в Stackdriver
  • Получите журналы из Stackdriver с помощью gcloud

Создать развертывание

Следуйте инструкциям по Google Cloud Platform, чтобы создать Deployment, который будет отправлять данные в Stackdriver:

Проверьте, находятся ли журналы в Stackdriver.

Журналы, экспортированные с помощью вышеуказанного развертывания, будут храниться в Stackdriver. Пример этого должен выглядеть так:

{
 insertId: "REDACTED"  
 labels: {
  k8s-pod/pod-template-hash: "545464fb5"   
  k8s-pod/run: "custom-metric-sd"   
 }
 logName: "projects/REDACTED/logs/stderr"  
 receiveTimestamp: "2020-05-26T10:17:16.161949129Z"  
 resource: {
  labels: {
   cluster_name: "gke-logs"    
   container_name: "sd-dummy-exporter"    
   location: "ZONE"    
   namespace_name: "default"    
   pod_name: "custom-metric-sd-545464fb5-2rdvx"    
   project_id: "REDACTED"    
  }
  type: "k8s_container"   
 }
 severity: "ERROR"  
 textPayload: "2020/05/26 10:17:10 Finished writing time series with value: 0xc420015290
"  
 timestamp: "2020-05-26T10:17:10.356684667Z"  
}

Вышеуказанная запись в журнале поможет создать команду gcloud для получения только указанных журналов из Stackdriver.

Получите журналы из Stackdriver с помощью gcloud

Как вы указали:

Я пытался сделать что-то вроде записи журнала gcloud, прочитав "resource.labels. pod_id = "" ", но ничего не возвращается.

Тот факт, что ничего не возвращается, скорее всего связан с тем, что запрошенный ресурс не был найден с помощью использованной вами команды.

Чтобы получить эти журналы из Stackdriver, вызовите команду ниже:

$ gcloud logging read "resource.type=k8s_container AND resource.labels.container_name=sd-dummy-exporter" 

Разделение вышеуказанной команды на более мелкие части:

  • resource.type=k8s_container - он получит журналы с типом k8s_container
  • resource.labels.container_name=XYZ - он получит журналы с указанным container_name.

Эти части напрямую связаны с примером единственной записи журнала, упомянутой ранее.

Подсказка:

resources.labels.container_name можно использовать для сбора журналов из нескольких модулей, поскольку на конкретный модуль c можно ссылаться с помощью pod_name.

...