如何从 kubernetes pod 在 Stackdriver 中设置错误报告?
Posted
技术标签:
【中文标题】如何从 kubernetes pod 在 Stackdriver 中设置错误报告?【英文标题】:How to setup error reporting in Stackdriver from kubernetes pods? 【发布时间】:2016-07-22 15:10:25 【问题描述】:我对如何在 kubernetes 中设置错误报告感到有些困惑,因此错误在 Google Cloud Console/Stackdriver“错误报告”中可见?
根据文档 https://cloud.google.com/error-reporting/docs/setting-up-on-compute-engine 我们需要启用 fluentd 的“转发输入插件”,然后从我们的应用程序发送异常数据。我认为如果我们自己设置了 fluentd,这种方法会奏效,但它已经预先安装在仅运行 gcr.io/google_containers/fluentd-gcp docker 映像的 pod 中的每个节点上。
我们如何在这些 pod 上启用转发输入并确保节点上的每个 pod 都可以使用 http 端口?当我们向集群添加更多节点时,我们还需要确保默认使用此配置。
任何帮助将不胜感激,我可能是从错误的角度看待这一切?
【问题讨论】:
你使用 GKE 还是 GCE? 我是 Stackdriver Error Reporting 的产品经理。目前,该功能处于测试阶段,我们尚未正式支持 Kubernetes。一旦我们有解决方案可以分享,我们将尝试在此处提供最佳答案。 感谢您的回复。我们使用 GKE - 我们希望将错误报告从我们的 java pod 发送到 Stackdriver 错误报告。 @Steren,谢谢,期待。 我能够让它按如下方式工作: 1. 创建一个以 fluentd-gcp-image/Dockerfile 为模型的 docker 映像,将 google-fluentd.conf 内容替换为仅用于前向输入插件。 2. 为这个专用的 fluentd 转发器创建一个复制控制器和服务,以便您的应用程序可以通过 TCP 访问它。 3. 按照我们文档中的示例,将 localhost 和 24224 替换为 2 中创建的服务中的环境变量值。对不起,太简洁了!我需要清理我的示例并发布它,希望我上面的大纲已经对你有用。 【参考方案1】:基本思想是启动一个单独的 pod,它通过 TCP 接收结构化日志并将其转发到 Cloud Logging,类似于本地运行的 fluentd 代理。我使用的步骤见下文。
(遗憾的是,无法使用 Docker 和 Kubernetes 中内置的日志记录支持 - 它只是将来自 stdout/stderr 的单个文本行作为单独的日志条目转发,这会阻止错误报告看到完整的堆栈跟踪。)
使用Dockerfile
为流利的转发器创建一个 docker 映像,如下所示:
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 来连接到 https://cloud.google.com/error-reporting/docs/setting-up-on-compute-engine 中描述的 fluentd 代理,而是使用环境变量 FLUENTD_FORWARDER_SERVICE_HOST
和 FLUENTD_FORWARDER_SERVICE_PORT
的值。
【讨论】:
感谢您输入鲍里斯!这几乎就是我们最终的结果:) 不客气。您的错误是否按预期显示?如果您有任何反馈,请提交反馈 - 使用“!”查看错误报告页面时控制台右上角的图标,团队将直接收到该图标。谢谢! 在应用程序中设置fluentd客户端可以仿照此:cloud.google.com/error-reporting/docs/setup/ec2【参考方案2】:补充 Boris 的答案:只要以正确的格式记录错误(请参阅 https://cloud.google.com/error-reporting/docs/troubleshooting)并启用 Cloud Logging(您可以在 https://console.cloud.google.com/logs/viewer 中看到错误),那么错误就会出现在错误报告中无需任何进一步的设置。
【讨论】:
【参考方案3】:Boris 的回答很棒,但比它真正需要的要复杂得多(无需构建 docker 映像)。如果您在本地机器上配置了 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
【讨论】:
以上是关于如何从 kubernetes pod 在 Stackdriver 中设置错误报告?的主要内容,如果未能解决你的问题,请参考以下文章
谷歌发布订阅。从 AppEngine 到 Kubernetes pod 以及从一个 Kubernetes pod 到另一个 Kubernetes pod 的通信