Kubernetes 集群中的自定义 docker 容器,带有使用 Stackdriver 的日志
Custom docker container in Kubernetes cluster with log using Stackdriver
我想知道我必须遵循哪些步骤才能将在我的自定义 apache 容器(部署在带有 Kubernetes 的 pod 中)中创建的日志发送到 Stackdriver 收集器。
我注意到,如果我使用标准 apache(或 nginx)容器创建 pod,access.log 和 error.log 会自动发送到 Stackdriver。
事实上,我可以在 Kubernetes 仪表板和 Google Cloud 仪表板--->Logging--->Logs 上看到日志
相反,我没有看到任何与我的自定义 Apache 相关的内容...
有什么建议吗?
经过一些研究,我已经解决了自定义 apache 容器中的日志转发器问题。
我不知道为什么 "standard redirection"(使用 /dev/stdout 或 /proc/self/fd/1)无论如何都不起作用,我遵循的解决方案称为 "sidecar container with the logging agent"
1) 创建一个 configMag 文件,您将在其中设置 fluentd 配置:
apiVersion: v1
data:
fluentd.conf: |
<source>
type tail
format none
path /var/log/access.log
pos_file /var/log/access.log.pos
tag count.format1
</source>
<source>
type tail
format none
path /var/log/error.log
pos_file /var/log/error.log.pos
tag count.format2
</source>
<match **>
type google_cloud
</match>
kind: ConfigMap
metadata:
name: my-fluentd-config
2) 创建一个包含 2 个容器的 pod:自定义 apache + 日志代理。两个容器都会挂载一个日志文件夹。只有日志代理会挂载 fluentd 配置:
apiVersion: v1
kind: Pod
metadata:
name: my-sidecar
labels:
app: my-sidecar
spec:
volumes:
- name: varlog
emptyDir: {}
- name: config-volume
configMap:
name: my-fluentd-config
containers:
- name: my-apache
image: <your_custom_image_repository>
ports:
- containerPort: 80
name: http
protocol: TCP
volumeMounts:
- name: varlog
mountPath: /var/log
- name: log-agent
image: gcr.io/google_containers/fluentd-gcp:1.30
env:
- name: FLUENTD_ARGS
value: -c /etc/fluentd-config/fluentd.conf
volumeMounts:
- name: varlog
mountPath: /var/log
- name: config-volume
mountPath: /etc/fluentd-config
3) 在 my-apache 容器中输入:
kubectl exec -it my-sidecar --container my-apache -- /bin/bash
和 change/check httpd.conf 正在使用以下文件:
ErrorLog /var/log/error.log
CustomLog /var/log/access.log common
(如果你改变了什么记得重启apache..)
4) 现在,在 Google Cloud Console -> Logging 中,您将能够看到 Stackdriver 中的 apache access/error 日志,过滤器如下:
resource.type="container"
labels."compute.googleapis.com/resource_name"="my-sidecar"
我想知道我必须遵循哪些步骤才能将在我的自定义 apache 容器(部署在带有 Kubernetes 的 pod 中)中创建的日志发送到 Stackdriver 收集器。
我注意到,如果我使用标准 apache(或 nginx)容器创建 pod,access.log 和 error.log 会自动发送到 Stackdriver。
事实上,我可以在 Kubernetes 仪表板和 Google Cloud 仪表板--->Logging--->Logs 上看到日志 相反,我没有看到任何与我的自定义 Apache 相关的内容...
有什么建议吗?
经过一些研究,我已经解决了自定义 apache 容器中的日志转发器问题。
我不知道为什么 "standard redirection"(使用 /dev/stdout 或 /proc/self/fd/1)无论如何都不起作用,我遵循的解决方案称为 "sidecar container with the logging agent"
1) 创建一个 configMag 文件,您将在其中设置 fluentd 配置:
apiVersion: v1
data:
fluentd.conf: |
<source>
type tail
format none
path /var/log/access.log
pos_file /var/log/access.log.pos
tag count.format1
</source>
<source>
type tail
format none
path /var/log/error.log
pos_file /var/log/error.log.pos
tag count.format2
</source>
<match **>
type google_cloud
</match>
kind: ConfigMap
metadata:
name: my-fluentd-config
2) 创建一个包含 2 个容器的 pod:自定义 apache + 日志代理。两个容器都会挂载一个日志文件夹。只有日志代理会挂载 fluentd 配置:
apiVersion: v1
kind: Pod
metadata:
name: my-sidecar
labels:
app: my-sidecar
spec:
volumes:
- name: varlog
emptyDir: {}
- name: config-volume
configMap:
name: my-fluentd-config
containers:
- name: my-apache
image: <your_custom_image_repository>
ports:
- containerPort: 80
name: http
protocol: TCP
volumeMounts:
- name: varlog
mountPath: /var/log
- name: log-agent
image: gcr.io/google_containers/fluentd-gcp:1.30
env:
- name: FLUENTD_ARGS
value: -c /etc/fluentd-config/fluentd.conf
volumeMounts:
- name: varlog
mountPath: /var/log
- name: config-volume
mountPath: /etc/fluentd-config
3) 在 my-apache 容器中输入:
kubectl exec -it my-sidecar --container my-apache -- /bin/bash
和 change/check httpd.conf 正在使用以下文件:
ErrorLog /var/log/error.log
CustomLog /var/log/access.log common
(如果你改变了什么记得重启apache..)
4) 现在,在 Google Cloud Console -> Logging 中,您将能够看到 Stackdriver 中的 apache access/error 日志,过滤器如下:
resource.type="container"
labels."compute.googleapis.com/resource_name"="my-sidecar"