首页 > 解决方案 > 替换 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)

标签: kubernetesapache-nifiazure-aks

解决方案


您可以使用带有 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 可以使用复制的文件


推荐阅读