在我公司,kubernetes 集群由一个团队管理,我们必须提供一个命名空间,然后创建我们的资源。我们无法使用 hostPath
卷等功能,也无法创建新角色或命名空间等。
因此,将 fluentd-elasticsearch
容器的示例实现视为 DaemonSet
,它们似乎都在使用 hostPath 卷安装,但我不确定为什么。
例如,我经历了这个: https://www.howtoforge.com/create-a-daemonset-in-kubernetes/
并创建了这个:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-fluentd-elasticsearch-daemonset
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
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
但是得到这个错误:
Error creating: pods "fluentd-elasticsearch-" is forbidden: unable to validate against any pod
security policy: [spec.volumes[0]: Invalid value: "hostPath": hostPath volumes are not allowed
to be used spec.volumes[1]: Invalid value: "hostPath": hostPath volumes are not allowed to be
used]
所以我有几个问题:
答案 0 :(得分:2)
是否 fluentd 挂载卷然后读取那些被推送到 elasticsearch 的卷中的文件?
Docker 将日志存储在节点的磁盘上。 Fluentd 需要以某种方式访问此日志文件;这就是为什么它作为 daemonset 运行的原因,您需要它在具有主机路径的每个节点上运行以访问日志文件。
<块引用>我可以直接删除卷安装还是它的功能必不可少?
不,您不能“仅仅删除”卷挂载(主机路径),因为 fluentd 将无法访问 docker 保留在节点上的日志文件。
<块引用>是否流畅使用 kubernetes API?
这个问题没有直接的答案。我发现有些插件可以使用 k8s api 访问 k8s 元数据,但我还没有找到任何可以使用 k8s api 拉日志的插件。
<块引用>是否有任何非 daemonset 容器只使用 kubernetes API 来获取 pod,然后使用日志 API 转发到日志数据库?
在 k8s 文档中描述了一些与此类似的内容:sidecar container with a logging agent
所以是的,您可以将 fluentd 部署为 sidecar 来收集日志并将其转发到数据库。查看文档了解更多详情。