【问题标题】:Copying a Fluentd-config file to a kubernetes pod将 Fluentd-config 文件复制到 kubernetes pod
【发布时间】:2021-09-27 17:24:38
【问题描述】:

我有一个 fluentd.conf 文件,我正在尝试在我的 minikube 集群中使用(复制)它(在 docker 容器中工作正常)。 步骤如下:

  1. 我将使用以下命令构建(在我的 minikube docker-env 中)docker 映像 Dockerfile:
FROM fluent/fluentd:v1.11-1

# Use root account to use apk
USER root

# below RUN includes plugin as examples elasticsearch is not required
# you may customize including plugins as you wish
RUN apk add --no-cache --update --virtual .build-deps \
    sudo build-base ruby-dev \
    && sudo gem install fluent-plugin-elasticsearch \
    && sudo gem sources --clear-all \
    && apk del .build-deps \
    && rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

COPY conf/fluent.conf /fluentd/etc/
USER fluent

  1. 这会成功执行(因此复制工作)并生成可运行的映像,接下来的步骤是启动 pod。 部分部署文件
      spec:
        containers:
        - image: fluentd
          imagePullPolicy: ""
          name: fluentd
          ports:
          - containerPort: 24224
          - containerPort: 24224
            protocol: UDP
          resources: {}
          volumeMounts:
          - mountPath: /fluentd/etc
            name: fluentd-claim0
        restartPolicy: Always
        serviceAccountName: ""
        volumes:
        - name: fluentd-claim0
          persistentVolumeClaim:
            claimName: fluentd-claim0

一切正常,但 fluentd-pod 返回以下错误: No such file or directory @ rb_sysopen - /fluentd/etc/fluent.conf

有人知道我错过了什么或我做错了什么吗?

提前致谢,

【问题讨论】:

    标签: docker kubernetes minikube fluentd


    【解决方案1】:

    发生这种情况是因为您在同一文件夹中安装了一个卷。

    在你的镜像中,配置文件放在/fluentd/etc/fluent.conf

    在您的 pod 中,将 fluentd-claim0 卷挂载到 /fluentd/etc/

    volumeMounts:
    - mountPath: /fluentd/etc
      name: fluentd-claim0
    

    就像在 linux 中将卷挂载到非空目录中一样,挂载点目录中存在的所有文件都将被挂载本身隐藏。

    为了“修复”这个问题,您可以使用volumeMounts 条目的subPath 选项,如the documentation 中所述。例如:

    volumeMounts:
    - mountPath: /fluentd/etc/myfileordirectory
      name: fluentd-claim0
      subPath: myfileordirectory
    

    这样,只有myfileordirectory 将被挂载到/fluentd/etc/,其余文件仍然可见。

    这种方法的局限性在于您需要提前知道卷中的文件列表。如果这不可能,唯一的选择是为您的配置文件或 mountPath 使用不同的目录。

    【讨论】:

      【解决方案2】:

      我发现此设置中有两个问题。

      首先,您的image: fluentd 运行的是Docker Hub fluentd image,而不是您的自定义映像。您需要提供一个名称,包括注册表地址或您的 Docker Hub 用户名才能使用其他名称。 (您说您正在使用 minikube,因此您可以在 minikube 上下文中使用 docker build -t fluentd 来获取此映像;尽量避免使用可能与 Docker Hub 映像名称冲突的名称,即使对于本地构建也是如此。)

      其次,您的卷设置正在创建一个新的空持久卷,然后用该卷覆盖映像中的配置文件。没有任何东西将任何内容复制到持久卷中,因此您在容器内获得了一个空目录。 (这与 Docker 命名卷不同;即使在普通 Docker 中,我也不建议依赖首次使用时复制的卷行为。)您可以删除所有提及卷的内容。

      这为您提供了一个更简单的 pod 规范,特别是如果您还删除了保留为默认值的字段:

      spec:
        containers:
          - image: my/fluentd # not plain "fluentd"
            name: fluentd
            ports:
            - containerPort: 24224
            - containerPort: 24224
              protocol: UDP
          restartPolicy: Always
      

      另一种选择是在ConfigMap 中提供配置文件。在这种情况下,它不一定在您的映像中,如果您使用像 Helm 这样的工具进行部署,则有机会在部署时设置配置。在这里,您将拥有大部分卷机器,但 volumes: 块将引用 configMap: 而不是 PVC。

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 2019-09-17
        • 2021-06-26
        • 2019-02-23
        • 1970-01-01
        • 2020-04-29
        • 2019-10-22
        • 1970-01-01
        相关资源
        最近更新 更多