如何将 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 ).这很容易:
设置名称为 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
将 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 实例。
- 现在,您可以访问 kibana 并查看日志。
您可以从 stack-driver
到 pub-sub
中的日志创建接收器,然后使用 logstash-input-google_pubsub
插件 - 将所有日志导出到弹性
使用 logstash-input-google_pubsub image,
见 source code
将日志导出到 pub-sub
在 pubsub 中创建主题和订阅
遵循说明 here
在日志查看器中 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
我 运行 我的系统在 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 ).这很容易:
设置名称为 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
将 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 实例。
- 现在,您可以访问 kibana 并查看日志。
您可以从 stack-driver
到 pub-sub
中的日志创建接收器,然后使用 logstash-input-google_pubsub
插件 - 将所有日志导出到弹性
使用 logstash-input-google_pubsub image,
见 source code
将日志导出到 pub-sub
在 pubsub 中创建主题和订阅 遵循说明 here
在日志查看器中 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