【问题标题】:How to ship logs from pods on Kubernetes running on top of GCP to elasticsearch/logstash?如何将日志从运行在 GCP 之上的 Kubernetes 上的 pod 发送到 elasticsearch/logstash?
【发布时间】:2017-02-19 18:38:23
【问题描述】:

我在 Google-Container-Engine 中运行我系统的新模块。我想将 stdout 和 stderr 从它们(在 pod 中运行)带到我的集中式 logstash。有没有一种简单的方法可以将日志从 pod 转发到外部日志服务,例如 logstash 或 elasticsearch?

【问题讨论】:

    标签: kubernetes google-cloud-platform fluent google-kubernetes-engine


    【解决方案1】:

    我决定直接登录到 elasticsearch,这是一个可以通过 elasticsearch.c.my-project.internal 访问的外部虚拟机(我在 Google-Cloud-Platform 上)。这很容易:

    1. 设置一个名为:elasticsearch 的 ExternalService,它指向 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 部署为 DeamonSet。 fluentd-elasticsearch 将自动连接到名称为 elasticsearch-logging 的服务(基于 fluentd-elasticsearch deployment defintion

      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 并查看日志。

    【讨论】:

    【解决方案2】:

    您可以从stack-driverpub-sub 中的日志创建一个接收器,然后使用logstash-input-google_pubsub 插件 - 它将所有日志导出到弹性 使用logstash-input-google_pubsub image, 见source code

    将日志导出到 pub-sub

    1. 在 pubsub 中创建主题和订阅 按照指示here

    2. 在日志查看器page 中单击create export,确保您已过滤到应用程序的日志(GKE Con​​tainer -> 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

      blog

      下载 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 日志记录在某种程度上仅限于我的意见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-14
          • 1970-01-01
          • 1970-01-01
          • 2020-01-18
          • 1970-01-01
          • 2021-03-18
          相关资源
          最近更新 更多