Docker 未能在Kubernetes上装载Splunk配置-错误:Cand';“我不读”/opt/splunk/etc/splunk-launch.conf

Docker 未能在Kubernetes上装载Splunk配置-错误:Cand';“我不读”/opt/splunk/etc/splunk-launch.conf,docker,kubernetes,splunk,Docker,Kubernetes,Splunk,我正在Kubernetes上使用Splunk图像(使用minikube进行本地测试) 应用下面的代码后,我面临以下错误: 错误:无法读取“/opt/splunk/etc/splunk launch.conf”--可能 $SPLUNK\u HOME或$SPLUNK\u ETC设置错误 我的Splunk部署: apiVersion: apps/v1 kind: Deployment metadata: name: splunk labels: app: splunk-app

我正在Kubernetes上使用Splunk图像(使用minikube进行本地测试)

应用下面的代码后,我面临以下错误:

错误:无法读取“/opt/splunk/etc/splunk launch.conf”--可能 $SPLUNK\u HOME或$SPLUNK\u 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论坛上看到,但答案对我的情况没有帮助

有什么想法吗


编辑#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)如何实现您希望通过部署和配置映射实现的预期行为。不幸的是,我不相信有一种“云本地”的方式来实现您想要的,但我可以解释(1),为什么很难做到(2),并指出一些可能给您解决方法的东西

错误消息:

错误:无法读取“/opt/splunk/etc/splunk launch.conf”--可能$splunk\u HOME或$splunk\u 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的卷装载,尤其是在使用
子路径时,在一天结束时,我不要认为有一个干净的方法来做你想做的事

我在互联网上搜索了“splunk kubernetes inputs.conf”,这是我的第一个结果:。这是来自官方splunk.com,它建议运行
kubectl cp
kubectl exec
这样的程序:

“Exec”进入主pod,并运行…命令,将(配置)复制到(目标)目录中,并将其发送给splunk用户


根据@Amit Kumar Gupta指出的方向,我将尝试给出完整的解决方案

因此,更改使容器无法写入
secret
configMap
downwardAPI
和投影卷,因为运行时现在将以只读方式装载它们。
此更改是由于
v1.9.4
而引起的,并且可能会导致各种应用程序出现问题,这些应用程序会更改或以其他方式操纵其配置

当Splunk启动时,它在文件系统的不同位置注册所有配置文件,位于
${Splunk\u 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:
部分将生成包含以下内容的a
inputs.conf

[monitor:///opt/splunk/var/log/syslog-logs]
disabled = 0
index=syslog-index
以类似的方式,
输出:
块将类似于以下内容:

[tcpout:splunk-receiver]
server=splunk-receiver:9997
这与我在源代码中直接传递环境变量不同:

SPLUNK_FORWARD_SERVER: splunk-receiver:9997
现在一切都正常运行(:


完整设置
转发器.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"

进一步阅读:


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

  • 将下面的内容添加到图像Dockerfile

      #RUN chmod -R 755 /opt/ansible
      #RUN echo "  ignore_errors: yes" >> /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml
    
  • 然后在您的私有repo部署中使用相同的映像,并使用以下env变量: #必须以root身份运行,否则将不允许您写入$SPLUNK\u HOME/S

    环境: -名称:SPLUNK\u START\u ARGS 值:--接受许可证--回答是--否提示 -名称:SPLUNK_用户 值:根


  • 你能添加一个错误吗,因为我运行这个depl