我已经将nifi.properties
写入了Kubernetes ConfigMap
。部署NiFi(作为StatefulSet
)时,我想让此nifi.properties
文件供刚部署的NiFi使用。为此,我为ConfigMap
添加了一个卷并将其安装在Container中。关联的statefulset.yaml
如下所示:
...
containers:
- name: 'myName'
image: 'apache/nifi:latest'
ports:
- name: http
containerPort: 8080
protocol: TCP
- name: http-2
containerPort: 1337
protocol: TCP
volumeMounts:
- name: 'nifi-config'
mountPath: /opt/nifi/nifi-1.6.0/conf/nifi.properties
volumes:
- name: 'nifi-config'
configMap:
name: 'nifi-config'
...
我认为这是行不通的,因为NiFi已在运行并且nifi.properties
文件已被服务锁定。无法创建广告连播,我收到错误消息:...Device or resource is busy
。我也使用bootstrap.conf
文件进行了尝试,该文件可以工作,但是我认为NiFi服务无法识别其中的更改,因为必须重新启动它。
我已经在纯Docker上部署NiFi时遇到了相同的问题,在该问题中,我通过停止容器,复制文件并启动容器来解决此问题;不是很漂亮,但是可以工作。
如here所述,使用环境变量来更改NiFi中的值也不是一种选择,因为在那里更改参数的可能性非常有限。
仅NiFi不会发生此问题。我认为在很多情况下,有人希望更改在Kubernetes
内运行的系统的配置,因此我希望有解决此问题的解决方案。
答案 0 :(得分:2)
上述设置存在两个问题:
要解决第二个问题,您可以简单地将configmap项挂载为单独的文件(nifi.properties.tmp),然后通过使用自定义命令包装容器入口点,将其复制到目标位置。
...
containers:
- name: 'myName'
image: 'apache/nifi:latest'
ports:
- name: http
containerPort: 8080
protocol: TCP
- name: http-2
containerPort: 1337
protocol: TCP
volumeMounts:
- name: 'nifi-config'
mountPath: /opt/nifi/nifi-1.6.0/conf/nifi.properties.tmp
subPath: nifi.properties
command:
- bash
- -c
- |
cat "${NIFI_HOME}/conf/nifi.properties.tmp" > "${NIFI_HOME}/conf/nifi.properties"
exec "${NIFI_BASE_DIR}/scripts/start.sh
# or you can do the property edits yourself and skip the helper script:
# exec bin/nifi.sh run
volumes:
- name: 'nifi-config'
configMap:
name: 'nifi-config'
...
答案 1 :(得分:0)
我在helm file的帮助下解决了这个问题,但是做了一点改动。实际上,它与pepov给出的答案几乎相同,但是正如我的评论中所述,我得到了CrashLoopBackOff
。这也与映像版本无关,因为我使用了自己的基于NiFi 1.6.0的映像,该映像还包含一些自定义处理器。
所以我的解决方案是使用Kubernetes的postStart
处理程序。问题是不能保证在ENTRYPOINT(see)之前调用此处理程序。但是在这种情况下,广告连播会崩溃并重新启动,最终使其正确运行。现在我还没有这个问题,所以现在看来很好。
我将configMap
的内容复制到一个专用文件夹中,并将它们复制到postStart
处理程序中的关联NiFi文件夹中。
这是statefulset.yaml
:
...
containers:
- name: 'myName'
image: 'apache/nifi:latest'
ports:
- name: http
containerPort: 8080
protocol: TCP
- name: http-2
containerPort: 1337
protocol: TCP
volumeMounts:
- name: 'nifi-config'
mountPath: /opt/nifi/nifi-1.6.0/kubeconfig
lifecycle:
postStart:
exec:
command:
- bash
- -c
- |
cp -a /opt/nifi/nifi-1.6.0/kubeconfig/. /opt/nifi/nifi-1.6.0/conf
volumes:
- name: 'nifi-config'
configMap:
name: 'nifi-config'
...