Как отправлять журналы из модулей Kubernetes, работающих поверх GCP, в elasticsearch / logstash?

#kubernetes #google-cloud-platform #fluent #google-kubernetes-engine

#kubernetes #google-облачная платформа #свободно #google-kubernetes-engine

Вопрос:

Я запускаю новые модули своей системы в Google-Container-Engine. Я хотел бы перенести stdout и stderr из них (работающих в модулях) в мой централизованный logstash. Есть ли простой способ пересылать журналы из модулей во внешнюю службу ведения журнала, например, logstash или elasticsearch?

Ответ №1:

Я решил войти непосредственно в elasticsearch, внешнюю виртуальную машину, к которой можно получить доступ elasticsearch.c.my-project.internal (я на Google-Cloud-Platform). Это довольно просто:

  1. Настройте внешний сервис с именем: elasticsearch, который указывает на экземпляр elasticsearch:

     apiVersion: v1
    kind: Service
    metadata:
      name: elasticsearch-logging
      namespace: kube-system
      labels:
        k8s-app: elasticsearch
        kubernetes.io/name: "elasticsearch"
    spec:
      type: ExternalName
      externalName: elasticsearch.c.my-project.internal
      ports:
        - port: 9200
          targetPort: 9200
      
  2. Разверните fluentd-elasticsearch как набор деамонов. fluentd-elasticsearch автоматически подключится к службе с именем elasticsearch-logging (на основе определения развертывания fluentd-elasticsearch :

     apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: fluentd-elasticsearch
      namespace: kube-system
      labels:
        tier: monitoring
        app: fluentd-logging
        k8s-app: fluentd-logging
    spec:
      template:
        metadata:
          labels:
            name: fluentd-elasticsearch
        spec:
          containers:
            - name: fluentd-elasticsearch
              image: gcr.io/google_containers/fluentd-elasticsearch:1.19
              volumeMounts:
              - name: varlog
                mountPath: /var/log
              - name: varlibdockercontainers
                mountPath: /var/lib/docker/containers
                readOnly: true
          terminationGracePeriodSeconds: 30
          volumes:
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
      

Используется kubectl logs fluentd-elasticsearch-... для проверки, удалось ли вам подключиться к экземпляру elasticsearach.

  1. Теперь вы можете получить доступ к kibana и просмотреть журналы.

Комментарии:

1. У меня есть внешний экземпляр elsatic, с которым можно связаться по адресу: xxxxxxxxxx.us-central1.gcp.cloud.es.io:9243 пароль: ггггггг есть ли способ настроить службу для входа в указанный выше экземпляр с паролем?

Ответ №2:

вы можете создать приемник для входа в stack-driver pub-sub журналы, а затем использовать logstash-input-google_pubsub плагин, который экспортирует все журналы в elastic, используя logstash-input-Изображение google_pubsub, см. Исходный код

экспорт журналов в pub-sub

  1. создайте тему и подписку в pubsub следуйте инструкциям здесь

  2. на странице просмотра журналов нажмите create export , убедитесь, что вы отфильтрованы по журналам вашего приложения (GKE Container -> cluster-name, app-name), введите имя приемника, выберите Cloud Pubsub в качестве службы приемника, теперь выберите свою тему в пункте назначения приемника.

журналы с этого момента и далее экспортируются в pub-sub

настройка конвейера logstash

вот pubsub-elastic.conf файл:

 input {
    google_pubsub {
        project_id => "my-gcloud-project-id"
        topic => "elastic-pubsub-test"
        subscription => "elastic-pubsub-test"
        json_key_file => "/etc/logstash/gcloud-service-account-key.json"
    }
}


output {
    elasticsearch {
        hosts => "https://example.us-east-1.aws.found.io:9243"
        user => "elastic"
        password => "mypassword"
    }
}
  

вот мой файл Docker:

 FROM sphereio/logstash-input-google_pubsub


# Logstash config
COPY gcloud-service-account-key.json /etc/logstash/gcloud-service-account-key.json
COPY config /etc/logstash/conf.d
COPY logstash.yml /etc/logstash/logstash.yml
  

теперь вы должны создать образ и запустить

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

вот deployment.yaml

 apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: logstash-input-google-pubsub
spec:
  replicas: 1
  strategy:
      type: RollingUpdate
  template:
    metadata:
      labels:
        app: logstash-input-google-pubsub
    spec:
      containers:
      - name: logstash-input-google-pubsub
        image: us.gcr.io/my-gcloud-project-id/logstash-input-google_pubsub:1.0.0
  

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

 docker build --rm -t us.gcr.io/my-gcloud-project-id/logstash-input-google_pubsub:1.0.0 . 
gcloud docker -- push us.gcr.io/my-gcloud-project-id/logstash-input-google_pubsub:1.0.0
  

теперь создайте экземпляр kubectl create -f deployment.yaml

готово!!

Ответ №3:

начиная с elasticsearch 6.00, вы можете использовать filebeats

см. Блог

Загрузите манифест Filebeat DaemonSet

 curl -L -O https://raw.githubusercontent.com/elastic/beats/6.0/deploy/kubernetes/filebeat-kubernetes.yaml
  

Обновите сведения о подключении к Elasticsearch

 - name: ELASTICSEARCH_HOST
 value: elasticsearch
- name: ELASTICSEARCH_PORT
 value: "9200"
- name: ELASTICSEARCH_USERNAME
 value: elastic
- name: ELASTICSEARCH_PASSWORD
 value: changeme
  

Разверните его в Kubernetes

 kubectl create -f filebeat-kubernetes.yaml
  

Ответ №4:

Вы можете попробовать установить следующее дополнение kubernetes: https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch

Сам не пробовал, но я также ищу правильное ведение журнала. Ведение журнала GCE каким-то образом ограничено, на мой взгляд.