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) 如何实现您希望通过 Deployment
和 ConfigMap
。不幸的是,我不相信有 "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 cp
和 kubectl 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 更改使得容器无法写入 secret
、configMap
、downwardAPI
和预计卷,因为运行时现在 将它们挂载为只读。
此更改是从 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://splunk.github.io/splunk-ansible/ADVANCED.html#inventory-script
在 K8s 部署中对我有用的一个解决方案是:
修改下面的镜像Dockerfile
#RUN chmod -R 755 /opt/ansible
#RUN echo " ignore_errors: yes" >> /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml
然后使用带有 belo env 变量的私有存储库在您的部署中使用相同的图像:
#has to 运行 as root 否则不会让你写入 $SPLUNK_HOME/S
环境:
- 姓名:SPLUNK_START_ARGS
值:--accept-license --answer-yes --no-prompt
- 姓名:SPLUNK_USER
值:根
我在 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) 如何实现您希望通过 Deployment
和 ConfigMap
。不幸的是,我不相信有 "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 cp
和 kubectl 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 更改使得容器无法写入 secret
、configMap
、downwardAPI
和预计卷,因为运行时现在 将它们挂载为只读。
此更改是从 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://splunk.github.io/splunk-ansible/ADVANCED.html#inventory-script
在 K8s 部署中对我有用的一个解决方案是:
修改下面的镜像Dockerfile
#RUN chmod -R 755 /opt/ansible #RUN echo " ignore_errors: yes" >> /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml
然后使用带有 belo env 变量的私有存储库在您的部署中使用相同的图像: #has to 运行 as root 否则不会让你写入 $SPLUNK_HOME/S
环境: - 姓名:SPLUNK_START_ARGS 值:--accept-license --answer-yes --no-prompt - 姓名:SPLUNK_USER 值:根