如何将 GCP 之上 Kubernetes 运行 上的 pods 的日志传送到 elasticsearch/logstash?

How to ship logs from pods on Kubernetes running on top of GCP to elasticsearch/logstash?

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

您可以尝试安装以下 kubernetes 插件:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch

我自己还没有尝试过,但我也在寻找合适的日志记录。 GCE 日志记录在某种程度上仅限于我的意见。

我决定直接登录 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 部署为 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-... 检查您是否能够连接到 elasticsearch 实例。

  1. 现在,您可以访问 kibana 并查看日志。

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

将日志导出到 pub-sub

  1. 在 pubsub 中创建主题和订阅 遵循说明 here

  2. 在日志查看器中 page 点击 create export,确保您被过滤到应用程序的日志(GKE 容器 -> 集群名称,应用程序名称), 输入接收器名称,选择 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

完成!!

从 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