Failed to mount Splunk config On Kubernetes - ERROR: Couldn't read "/opt/splunk/etc/splunk-launch.conf

Failed to mount Splunk config On Kubernetes - ERROR: Couldn't read "/opt/splunk/etc/splunk-launch.conf

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

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

ERROR: Couldn't read "/opt/splunk/etc/splunk-launch.conf" -- maybe $SPLUNK_HOME or $SPLUNK_ETC is set wrong?

我的 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:将配置映射添加到代码中(为简洁起见,已从原始问题中删除)。 这是失败的原因

这里有两个问题:(1) 为什么会看到该错误消息,以及 (2) 如何实现您希望通过 DeploymentConfigMap。不幸的是,我不相信有 "cloud-native" 方法可以实现您想要的,但我可以解释 (1),为什么很难做到 (2),并指出可能会为您提供解决方法的方法。

错误信息:

ERROR: Couldn't read "/opt/splunk/etc/splunk-launch.conf" -- maybe $SPLUNK_HOME or $SPLUNK_ETC is set wrong?

并不意味着您错误地(必然)设置了这些环境变量,它意味着 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 之类的事情:

"Exec" into the master pod, and run ... commands, to copy (configuration) into the (target) directory and chown to splunk user.

‍♂️

根据@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

在 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. 然后使用带有 belo env 变量的私有存储库在您的部署中使用相同的图像: #has to 运行 as root 否则不会让你写入 $SPLUNK_HOME/S

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