2

我已经nifi.propertiesKubernetes ConfigMap. 当我部署 NiFi(作为StatefulSet)时,我希望这个nifi.properties文件供我刚刚部署的 NiFi 使用。为此,我为 Container 添加了一个卷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文件被服务锁定。无法创建 pod,出现错误:...Device or resource is busy. 我也尝试了该bootstrap.conf文件,该文件有效,但我认为 NiFi 服务无法识别其中的更改,因为它必须重新启动。

我已经在纯 Docker 上部署 NiFi 时遇到了同样的问题,我通过停止容器、复制文件和启动容器来解决问题;不是很漂亮,但工作。

使用环境变量来改变 NiFi 中的值也不是一种选择,因为在那里改变参数的可能性非常有限。

仅 NiFi 不会出现此问题。我认为在很多情况下,有人想要更改在其中运行的系统的配置Kubernetes,所以我希望有任何解决方案来处理这个问题。

4

2 回答 2

4

上述设置有两个问题:

要解决第二个问题,您可以简单地将 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'
...
于 2018-08-11T19:56:43.593 回答
1

我在这个helm file的帮助下解决了这个问题,但做了一些改动。实际上它与 pepov 给出的答案几乎相同,但正如我在评论中所说,我得到了一个CrashLoopBackOff. 这也与镜像版本无关,因为我使用了我自己的基于 NiFi 1.6.0 的镜像,还包含一些自定义处理器。

所以我的解决方案是使用postStartKubernetes的handler。问题是不能保证在 ENTRYPOINT 之前调用此处理程序(请参阅参考资料)。但在这种情况下,Pod 会崩溃并重新启动,最终会恢复正常;现在我还没有遇到这个问题,所以现在看来​​还不错。
我将内容复制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'
...
于 2018-08-14T11:43:06.550 回答