kubernetes - 替换 kubernetes 容器中的属性文件
问题描述
在 Azure Kubernetes 服务上旋转 Nifi 集群时,我nifi.properties
在使用configMap
. 使用以下配置挂载文件时,出现以下错误。
sed: can't move '/opt/nifi/conf/nifi.propertiesnCjDfm' to '/opt/nifi/conf/nifi.properties': Resource busy
由于 nifi 实例在 kubernetes 有机会替换它之前已经在使用该文件,因此似乎正在发生此错误。
我正在寻找一种替代方法或更好的方法来配置 nifi 集群并管理其配置。目前我正在尝试使用 ConfigMap 来存储 nifi.properties 或任何其他必要的文件。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nifi
namespace: nifi-ns
...
spec:
template:
spec:
containers:
- name: nifi
image: xemuliam/nifi:1.9.1
...
volumeMounts:
...
- mountPath: /opt/nifi/conf/nifi.properties
subPath: nifi.properties
name: file
volumes:
- name: file
configMap:
name: nifi-properties-cm
items:
- key: nifi.properties
path: nifi.properties
以下是我的配置图:
apiVersion: v1
kind: ConfigMap
metadata:
name: nifi-properties-cm
namespace: nifi-ns
data:
nifi.properties: |
# Core Properties #
nifi.flow.configuration.file=./conf/flow.xml.gz
...
我已经尝试像上面那样安装文件也尝试安装整个 conf 文件夹(我不喜欢这种方式,因为我真正想要更改的唯一配置是 nifi.properties)
我知道我总是可以自定义图像并提供自定义入口点以达到相同的效果,但我想尝试单独使用 kubernetes 解决问题。有没有其他方法可以解决这个问题?是否有任何建议的最佳实践或解决此问题的最佳方法?
更新:
根据下面提供的评论,我尝试创建一个 init 容器并将文件复制到共享卷,但这无济于事,因为它会覆盖容器内的文件夹并使 pod 失败。
这是使用的配置:
apiVersion: v1
kind: Pod
metadata:
name: test
labels:
name: test
spec:
initContainers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "cp /usr/nifi.properties /opt/nifi/conf/nifi.properties"]
volumeMounts:
- mountPath: /usr/nifi.properties
name: file
subPath: nifi.properties
- mountPath: /opt/nifi/conf
name: config
containers:
- name: test
image: xemuliam/nifi:1.9.1
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
volumeMounts:
- mountPath: /opt/nifi/conf
name: config
volumes:
- name: file
configMap:
name: nifi-properties-cm
- name: config
emptyDir: {}
这是我收到的应用程序日志:
Exception in thread "main" java.io.FileNotFoundException: /opt/nifi/conf/bootstrap.conf (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at org.apache.nifi.bootstrap.RunNiFi.loadServices(RunNiFi.java:267)
at org.apache.nifi.bootstrap.RunNiFi.<init>(RunNiFi.java:152)
at org.apache.nifi.bootstrap.RunNiFi.main(RunNiFi.java:212)
解决方案
您可以使用带有 nifi.properties 的 configmap 作为初始值,并将此文件复制到您的文件系统中。在您的 pod 中使用一个 init 容器,您可以复制它,如下例所示
initContainers:
- name: copy
image: busybox:1.28
command: ["/bin/sh", "-c", "cp /config/configmap/nifi.properties /config/local/"]
volumeMounts:
- name: configmap
mountPath: /config/configmap/
- name: local
mountPath: /config/local/
然后你的 nifi pod 可以使用复制的文件
推荐阅读
- python - 使用 FORMDATA 的 scrapy 问题使用凭据抓取网站
- angular - 如何在单元测试中将事件对象传递给 triggerEventHandler?
- python - 如何使用 python 从目录中检测和分离损坏/不可读的 PDF 和受密码保护的 PDF?
- node.js - 配置 SharePoint 框架
- rust - 如何在 Rust 中使用 From trait 实现双向转换?
- c - 编译器在手动分配地址时优化指向函数的指针
- git - 软复位后推到原点被拒绝
- python - 来自私人仓库的 pip 安装,但来自 PyPi 的要求
- excel - 将以下代码从 x 循环到 y 以 1 的整数步进
- ansible - 在 Ansible 中抑制处理程序