【问题标题】:Failed to mount Splunk config On Kubernetes - ERROR: Couldn't read "/opt/splunk/etc/splunk-launch.conf无法在 Kubernetes 上挂载 Splunk 配置 - 错误:无法读取“/opt/splunk/etc/splunk-launch.conf
【发布时间】:2023-09-09 21:50:01
【问题描述】:

我在 Kubernetes 上使用this Splunk 映像(使用 minikube 在本地测试)。

应用下面的代码后,我遇到了以下错误:

错误:无法读取“/opt/splunk/etc/splunk-launch.conf”——也许 $SPLUNK_HOME 或 $SPLUNK_ETC 设置错误?

我的 Splunk 部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: splunk
  labels:
    app: splunk-app
    tier: splunk
spec:
  selector:
    matchLabels:
      app: splunk-app
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: splunk-app
        tier: splunk
        track: stable
    spec:
      volumes:
      - name: configmap-inputs
        configMap:
           name: splunk-config
      containers:
      - name: splunk-client
        image: splunk/splunk:latest
        imagePullPolicy: Always
        env:
        - name: SPLUNK_START_ARGS
          value: --accept-license --answer-yes
        - name: SPLUNK_USER
          value: root
        - name: SPLUNK_PASSWORD
          value: changeme
        - name: SPLUNK_FORWARD_SERVER
          value: splunk-receiver:9997
        ports:
        - name: incoming-logs
          containerPort: 514
        volumeMounts:
          - name: configmap-inputs
            mountPath: /opt/splunk/etc/system/local/inputs.conf
            subPath: "inputs.conf"
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: splunk-config
data:
  inputs.conf: |
    [monitor:///opt/splunk/var/log/syslog-logs]
    disabled = 0
    index=my-index

我也尝试添加这个环境变量 - 没有成功:

    - name: SPLUNK_HOME
      value: /opt/splunk
    - name: SPLUNK_ETC
      value: /opt/splunk/etc

我已经使用以下 docker 配置测试了映像 - 它运行成功

version: '3.2'
services:
    splunk-forwarder:
      hostname: splunk-client
      image: splunk/splunk:latest
      environment:
        SPLUNK_START_ARGS: --accept-license --answer-yes
        SPLUNK_USER: root
        SPLUNK_PASSWORD: changeme
      ports:
      - "8089:8089"
      - "9997:9997"

在 Splunk 论坛上看到 this,但答案对我没有帮助。

有什么想法吗?


编辑#1:

Minikube 版本:从v0.33.1 升级到v1.2.0

完整的错误日志:

$kubectl logs -l tier=splunk

splunk_common : Set first run fact -------------------------------------- 0.04s
splunk_common : Set privilege escalation user --------------------------- 0.04s
splunk_common : Set current version fact -------------------------------- 0.04s
splunk_common : Set splunk install fact --------------------------------- 0.04s
splunk_common : Set docker fact ----------------------------------------- 0.04s
Execute pre-setup playbooks --------------------------------------------- 0.04s
splunk_common : Setting upgrade fact ------------------------------------ 0.04s
splunk_common : Set target version fact --------------------------------- 0.04s
Determine captaincy ----------------------------------------------------- 0.04s
ERROR: Couldn't read "/opt/splunk/etc/splunk-launch.conf" -- maybe $SPLUNK_HOME or $SPLUNK_ETC is set wrong?

编辑#2:将配置映射添加到代码中(为简洁起见,已从原始问题中删除)。 这是失败的原因

【问题讨论】:

  • 你能添加一个错误吗,因为我运行了这个部署并且它有效?
  • 我在minikube version: v1.2.0 上尝试了您提供的部署 YAML,它运行良好。我没有设置那些环境变量,但我可以执行到容器中,看到$SPLUNK_HOME env var 设置为/opt/splunk$SPLUNK_ETC env var 没有设置,我可以成功地找出/opt/splunk/etc/splunk-launch.conf .错误消息并不意味着这些环境变量设置错误,它们似乎暗示如果您未设置,默认情况下将在/opt/splunk/etc/splunk-launch.conf 中查找 conf 文件,并且由于某种原因它无法读取,. ..
  • ... 并且猜测您可能将 conf 文件放在其他地方而忘记设置 $SPLUNK_XXX 环境变量以告诉 splunk 到其他地方查看。但是我假设您只想使用默认值,而不是更改任何内容,这是我尝试过的,并且有效。你在跑什么minikube version
  • @Rotemya,它不是 minikube 版本。它是 kubectl 版本。 minikube version 命令的结果呢?我还在 minikube v1.2.0 上对其进行了测试,并且效果很好。您能否在此处发布运行设置 Splunk 的 ansible playbook 后显示的摘要?有没有错误?
  • 你可以通过运行kubectl logs <pod_name>来检查它。

标签: docker kubernetes splunk


【解决方案1】:

根据@Amit-Kumar-Gupta 指出的方向,我也会尝试给出一个完整的解决方案。

所以this PR 的更改使得容器无法写入secretconfigMapdownwardAPI 和预计的卷,因为运行时现在将它们挂载为只读
此更改自 v1.9.4 开始,可能会导致各种应用程序出现问题,这些应用程序会更改或以其他方式操纵其配置。

当 Splunk 启动时,它会将所有配置文件注册到文件系统上 ${SPLUNK_HOME} 下的各个位置,在我们的例子中是 /opt/splunk
我的问题中指定的错误反映了splunk由于挂载机制的变化,未能操作/opt/splunk/etc目录下的所有相关文件。


现在解决问题。

我们将使用以下设置,而不是将配置文件直接安装在/opt/splunk/etc 目录中:

我们将使用 default.yml 文件启动 docker 容器,该文件将安装在 /tmp/defaults/default.yml 中。

为此,我们将创建 default.yml 文件:
docker run splunk/splunk:latest create-defaults > ./default.yml

然后,我们将转到splunk: 块并在其下添加一个config: 子块:

splunk:
  conf:
    inputs:
      directory: /opt/splunk/etc/system/local
      content:
          monitor:///opt/splunk/var/log/syslog-logs:
            disabled : 0
            index : syslog-index
    outputs:
      directory: /opt/splunk/etc/system/local
      content:
          tcpout:splunk-indexer:
            server: splunk-indexer:9997

此设置将生成两个后缀为 .conf 的文件(请记住,子块以 conf: 开头)由正确的 Splunk 用户和组拥有。

inputs: 部分将生成具有以下内容的inputs.conf

[monitor:///opt/splunk/var/log/syslog-logs]
disabled = 0
index=syslog-index

以类似的方式,outputs: 块将类似于以下内容:

[tcpout:splunk-receiver]
server=splunk-receiver:9997

这不是像我在原始代码中那样直接传递环境变量:

SPLUNK_FORWARD_SERVER: splunk-receiver:9997

现在一切都已启动并运行(:


forwarder.yaml 的完整设置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: splunk-forwarder
  labels:
    app: splunk-forwarder-app
    tier: splunk
spec:
  selector:
    matchLabels:
      app: splunk-forwarder-app
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: splunk-forwarder-app
        tier: splunk
        track: stable
    spec:
      volumes:
      - name: configmap-forwarder
        configMap:
          name: splunk-forwarder-config

      containers:
      - name: splunk-forwarder
        image: splunk/splunk:latest
        imagePullPolicy : Always
        env:
        - name: SPLUNK_START_ARGS
          value: --accept-license --answer-yes

        - name: SPLUNK_PASSWORD
          valueFrom:
            secretKeyRef:
              name: splunk-secret
              key: password

        volumeMounts:
        - name: configmap-forwarder
          mountPath: /tmp/defaults/default.yml
          subPath: "default.yml"

进一步阅读:

https://splunk.github.io/docker-splunk/ADVANCED.html

https://github.com/splunk/docker-splunk/blob/develop/docs/ADVANCED.md

https://www.splunk.com/blog/2018/12/17/deploy-splunk-enterprise-on-kubernetes-splunk-connect-for-kubernetes-and-splunk-insights-for-containers-beta-part-1.html

https://splunk.github.io/splunk-ansible/ADVANCED.html#inventory-script

https://static.rainfocus.com/splunk/splunkconf18/sess/1521146368312001VwQc/finalPDF/FN1089_DockerizingSplunkatScale_Final_1538666172485001Loc0.pdf

【讨论】:

    【解决方案2】:

    这里有两个问题:(1) 为什么会看到该错误消息,以及 (2) 如何实现您希望通过 Deployment 和 @ 表达的期望行为987654323@。不幸的是,我不相信有一种“云原生”的方式来实现你想要的,但我可以解释(1),为什么很难做到(2),并指出一些可能会给你一个解决方法的东西。

    错误信息:

    错误:无法读取“/opt/splunk/etc/splunk-launch.conf”——可能 $SPLUNK_HOME 或 $SPLUNK_ETC 设置错误?

    并不意味着您(必然)错误地设置了这些环境变量,这意味着 Splunk 正在该位置查找文件并且无法读取那里的文件,并且它提供了一个提示,您可能已经将文件放在另一个位置,但忘记给 Splunk 提示(通过$SPLUNK_HOME$SPLUNK_ETC 环境变量)以查看其他位置。

    它无法读取 /opt/splunk/etc/splunk-launch.conf 的原因是,默认情况下,/opt/splunk 目录将填充大量具有各种配置的子目录和文件,但因为您在 /opt/splunk/etc/system/local/inputs.conf 安装卷, 什么都不能写到/opt/splunk

    如果您只是不挂载该卷,或者将其挂载到其他位置(例如/foo/inputs.conf),则部署将正常启动。当然问题是它不会知道你的inputs.conf,它会使用它写在那里的默认/opt/splunk/etc/system/local/inputs.conf

    我假设您想要做的是允许 Splunk 生成它喜欢的所有目录和文件,您想要设置该文件的内容。虽然 Kubernetes 如何处理卷挂载有很多细微差别,尤其是来自 ConfigMaps 的那些,特别是在使用 subPath 时,但归根结底,我认为没有一种干净的方式来做你想做的事想要。

    我在 Internet 上搜索了“splunk kubernetes inputs.conf”,这是我的第一个结果:https://www.splunk.com/blog/2019/02/11/deploy-splunk-enterprise-on-kubernetes-splunk-connect-for-kubernetes-and-splunk-insights-for-containers-beta-part-2.html。这来自官方 splunk.com,它建议将 kubectl cpkubectl exec 之类的东西运行到:

    “执行”到主 pod,并运行...命令,将(配置)复制到(目标)目录并 chown 到 splunk 用户。

    ??‍♂️

    【讨论】:

      【解决方案3】:

      在 K8s 部署中对我有用的一个解决方案是:

      1. 修改下面的镜像 Dockerfile

          #RUN chmod -R 755 /opt/ansible
          #RUN echo "  ignore_errors: yes" >> /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml
        
      2. 然后在您的部署中使用来自您的私有 repo 的相同图像和 belo env 变量: #必须以 root 身份运行,否则不会让您写入 $SPLUNK_HOME/S

        环境: - 名称:SPLUNK_START_ARGS 值:--accept-license --answer-yes --no-prompt - 名称:SPLUNK_USER 值:根

      【讨论】: