Как настроить отчеты об ошибках в Stackdriver из бобов kubernetes?

Я немного озадачен тем, как настроить отчеты об ошибках в kubernetes, поэтому ошибки видны в Консоли Google / Stackdriver "Отчеты об ошибках"?

Согласно документации https://cloud.google.com/error-reporting/docs/setting-up-on-compute-engine нам нужно включить fluentd "плагин прямого ввода", а затем отправлять данные исключений из наших приложений. Я думаю, что этот подход сработал бы, если бы у нас была свободная настройка, но он уже предустановлен на каждом узле в модуле, который просто запускает образ докера gcr.io/google_containers/fluentd-gcp.

Как включить прямой ввод на этих модулях и обеспечить доступность порта http для каждого модуля на узлах? Мы также должны убедиться, что эта конфигурация используется по умолчанию, когда мы добавляем больше узлов в наш кластер.

Любая помощь будет оценена, может быть, я смотрю на все это с неправильной точки зрения?

3 ответа

Решение

Основная идея состоит в том, чтобы запустить отдельный модуль, который получает структурированные журналы по TCP и перенаправляет их в Cloud Logging, подобно локальному агенту fluentd. Ниже приведены шаги, которые я использовал.

(К сожалению, поддержка ведения журнала, встроенная в Docker и Kubernetes, не может быть использована - она ​​просто перенаправляет отдельные строки текста из stdout/stderr в виде отдельных записей журнала, что не позволяет отчетам об ошибках видеть полные трассировки стека.)

Создайте образ докера для сервера пересылки, используя Dockerfile следующее:

FROM gcr.io/google_containers/fluentd-gcp:1.18

COPY fluentd-forwarder.conf /etc/google-fluentd/google-fluentd.conf

куда fluentd-forwarder.conf содержит следующее:

<source>
  type forward
  port 24224
</source>

<match **>
  type google_cloud
  buffer_chunk_limit 2M
  buffer_queue_limit 24
  flush_interval 5s
  max_retry_wait 30
  disable_retry_limit
</match>

Затем создайте и нажмите изображение:

$ docker build -t gcr.io/###your project id###/fluentd-forwarder:v1 .
$ gcloud docker push gcr.io/###your project id###/fluentd-forwarder:v1

Вам нужен контроллер репликации (fluentd-forwarder-controller.yaml):

apiVersion: v1
kind: ReplicationController
metadata:
  name: fluentd-forwarder
spec:
  replicas: 1
  template:
    metadata:
      name: fluentd-forwarder
      labels:
        app: fluentd-forwarder
    spec:
      containers:
      - name: fluentd-forwarder
        image: gcr.io/###your project id###/fluentd-forwarder:v1
        env:
        - name: FLUENTD_ARGS
          value: -qq
        ports:
        - containerPort: 24224

Вам также нужен сервис (fluentd-forwarder-service.yaml):

apiVersion: v1
kind: Service
metadata:
  name: fluentd-forwarder
spec:
  selector:
    app: fluentd-forwarder
  ports:
  - protocol: TCP
    port: 24224

Затем создайте контроллер репликации и службу:

$ kubectl create -f fluentd-forwarder-controller.yaml
$ kubectl create -f fluentd-forwarder-service.yaml

И наконец, в вашем приложении вместо использования localhost и 24224 для подключения к агенту fluentd, как описано на https://cloud.google.com/error-reporting/docs/setting-up-on-compute-engine, используйте значения переменных среды FLUENTD_FORWARDER_SERVICE_HOST а также FLUENTD_FORWARDER_SERVICE_PORT,

Чтобы добавить к ответу Бориса: пока ошибки регистрируются в правильном формате (см. https://cloud.google.com/error-reporting/docs/troubleshooting устранение неисправностей) и включена регистрация в облаке (вы можете увидеть ошибки в https://console.cloud.google.com/logs/viewer), после чего ошибки попадут в Отчеты об ошибках без дальнейшей настройки.

Ответ Бориса был великолепен, но был намного сложнее, чем нужно (не нужно создавать образ докера). Если у вас настроен kubectl в вашем локальном ящике (или вы можете использовать Google Cloud Shell), скопируйте и вставьте следующее, и он установит сервер пересылки в вашем кластере (я обновил версию fluent-gcp из приведенного выше ответа). Мое решение использует ConfigMap для хранения файла, чтобы его можно было легко изменить, не перестраивая.

cat << EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-forwarder
data:
  google-fluentd.conf: |+
    <source>
      type forward
      port 24224
    </source>

    <match **>
      type google_cloud
      buffer_chunk_limit 2M
      buffer_queue_limit 24
      flush_interval 5s
      max_retry_wait 30
      disable_retry_limit
    </match>

---
apiVersion: v1
kind: ReplicationController
metadata:
  name: fluentd-forwarder
spec:
  replicas: 1
  template:
    metadata:
      name: fluentd-forwarder
      labels:
        app: fluentd-forwarder
    spec:
      containers:
      - name: fluentd-forwarder
        image: gcr.io/google_containers/fluentd-gcp:2.0.18
        env:
        - name: FLUENTD_ARGS
          value: -qq
        ports:
        - containerPort: 24224
        volumeMounts:
        - name: config-vol
          mountPath: /etc/google-fluentd
      volumes:
        - name: config-vol
          configMap:
            name: fluentd-forwarder
---
apiVersion: v1
kind: Service
metadata:
  name: fluentd-forwarder
spec:
  selector:
    app: fluentd-forwarder
  ports:
  - protocol: TCP
    port: 24224
EOF
Другие вопросы по тегам