此解决方案演示如何在 Azure Kubernetes 服务 (AKS) 上的 NiFi 部署过程中使用 Helm 图表。 Helm 简化了安装和管理 Kubernetes 应用程序的过程。
Apache®、Apache NiFi® 和 NiFi® 是 Apache Software Foundation 在美国和/或其他国家/地区的商标或注册商标。 使用这些标记并不暗示获得 Apache Software Foundation 的认可。
体系结构
下载此体系结构的 Visio 文件。
工作流
Helm chart 包含一个
values.yaml
文件。 该文件列出了用户可以编辑的输入值。用户调整 chart 中的设置,包括以下各项的值:
- 卷大小。
- Pod 数量。
- 用户身份验证和授权机制。
用户运行 Helm
install
命令来部署 chart。Helm 检查用户输入是否包含所有必需变量的值。
Helm 创建一个清单,用于描述要在 Kubernetes 上部署的对象。
Helm 会将清单发送到 Kubernetes 群集。 Apache ZooKeeper 提供群集协调功能。
Kubernetes 创建指定的对象。 NiFi 部署需要以下对象:
- 配置对象。
- 数据卷。 Pod 存储是临时的。
- 日志卷。
- 使用映像在容器中运行 NiFi 的 Pod。 Kubernetes 使用 StatefulSet 工作负载资源来管理 Pod。
- 使 NiFi UI 可供用户使用的 Kubernetes 服务。
- 如果群集使用入口使 UI 在外部可用,则入口路由。
组件
Helm chart 是文件夹中文件的集合,采用树形结构。 这些文件描述 Kubernetes 资源。 可以在 Helm chart 中配置以下组件:
ZooKeeper
ZooKeeper 使用一个单独的 chart。 可以使用 Kubernetes 在其孵化器 chart 存储库中提供的标准 ZooKeeper chart。 但是,如果你的依赖项包含公共注册表内容时,则会在映像开发和部署工作流中引入风险。 为缓解这种风险,请尽可能保留公共内容的本地副本。 有关详细信息,请参阅使用 Azure 容器注册表管理公共内容。
也可以自行部署 ZooKeeper。 如果选择此选项,请提供 ZooKeeper 服务器和端口号,以便运行 NiFi 的 Pod 可以访问 ZooKeeper 服务。
Kubernetes statefulset
要在 Kubernetes 中运行应用程序,可运行 Pod。 此基本单元运行不同的容器,这些容器实现应用程序的不同活动。
Kubernetes 提供两种用于管理运行应用程序(如 NiFi)的 Pod 的解决方案:
- 一个是 ReplicaSet,它维护着一组在任何给定时间运行的稳定的副本 Pod。 通常使用 ReplicaSet 来保证指定数量的相同 Pod 的可用性。
- 一个是 StatefulSet,这是用于管理有状态应用程序的工作负载 API 对象。 StatefulSet 管理基于相同容器规范的 Pod。 Kubernetes 根据相同的规范创建这些 Pod。 但这些 Pod 不可互换。 每个 Pod 都有一个持久标识符,这个持久标识符在不同的重新计划中保持不变。
由于你使用 NiFi 来管理数据,因此 StatefulSet 为 NiFi 部署提供了最佳解决方案。
ConfigMaps
Kubernetes 提供 ConfigMaps 用于存储非机密数据。 Kubernetes 使用这些对象来管理各种配置文件,例如 nifi.properties
。 运行应用程序的容器通过装入的卷和文件访问配置信息。 使用 ConfigMap 可以轻松管理部署后配置更改。
ServiceAccount
在安全实例中,NiFi 使用身份验证和授权。 NiFi 在文件系统文件中管理此信息。 具体来说,每个群集节点都需要维护一个 authorizations.xml
文件和一个 users.xml
文件。 所有成员都需要能够写入这两个文件。 群集中的每个节点都需要具有此信息的相同副本。 否则,群集将不同步并崩溃。
要满足这些条件,可以将这些文件从群集的第一个成员复制到存在的每个成员。 然后,每个新成员维护自己的副本。 Pod 通常无权从另一个 Pod 复制内容。 但 Kubernetes ServiceAccount 提供了一种获取授权的方法。
服务
Kubernetes 服务使 Kubernetes 的用户可以使用应用程序服务群集。 服务对象还使 NiFi 集群的成员节点能够相互通信。 对于 Helm chart 部署,请使用两种服务类型:无头服务和基于 IP 的服务。
流入量
入口负责管理外部对群集服务的访问。 具体而言,预配置的入口控制器将 HTTP 和 HTTPS 路由从群集外部公开到群集中的服务。 可以定义入口规则,这些规则确定控制器如何路由流量。 Helm chart 包括配置中的入口路由。
机密
要配置安全的 NiFi 群集,需要存储凭据。 Kubernetes 机密提供了一种安全的方式来存储和检索这些凭据。
方案详细信息
Apache NiFi 用户经常需要在 Kubernetes 上部署 NiFi。 Kubernetes 部署涉及许多对象,例如 pod、卷和服务。 在对象数量如此众多的情况下,很难管理 Kubernetes 使用的清单(也就是规范文件)。 部署多个使用不同配置的 NiFi 集群时,会更加困难。
Helm chart 提供了一种用于管理清单的解决方案。 Helm 是 Kubernetes 的包管理器。 使用 Helm 工具,可以简化安装和管理 Kubernetes 应用程序的过程。
chart 是 Helm 使用的打包格式。 你将在 chart 文件中输入配置要求。 Helm 会跟踪每个 chart 的历史记录和版本。 然后,Helm 使用 chart 来生成 Kubernetes 清单文件。
从单个 chart 中,你可以部署使用不同配置的应用程序。 运行 NiFi on Azure 时,可以使用 Helm chart 在 Kubernetes 上部署不同的 NiFi 配置。
Apache®、Apache NiFi® 和 NiFi® 是 Apache Software Foundation 在美国和/或其他国家/地区的商标或注册商标。 使用这些标记并不暗示获得 Apache Software Foundation 的认可。
注意事项
这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负荷质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架。
数据磁盘数
对于磁盘使用情况,请考虑对存储库使用一组条带磁盘。 在使用虚拟机规模集的测试部署中,此方法效果最佳。 nifi.properties
中的以下片段显示了一个磁盘使用情况配置:
nifi.flowfile.repository.directory=/data/partition1/flowfiles
nifi.provenance.repository.directory.stripe1=/data/partition1/provenancenifi.provenance.repository.directory.stripe2=/data/partition2/provenancenifi.provenance.repository.directory.stripe3=/data/partition3/provenancenifi.content.repository.directory.stripe2=/data/partition2/content
nifi.content.repository.directory.stripe3=/data/partition3/content
此配置使用大小相等的三个卷。 可以调整值和条带化以满足系统要求。
部署方案
可以使用公共或专用负载均衡器或入口控制器来公开 NiFi 群集。 使用 Helm chart 来实现这种方式时,有两种配置可用:
- 不安全的 NiFi群集,可通过 HTTP URL 访问,无需用户身份验证或授权。
- 安全的 NiFi 群集,可通过 HTTPS URL 访问。 此类群集通过 TLS 进行保护。 配置安全群集时,可以提供自己的证书。 或者,chart 也可以生成证书。 要为让 chart 生成证书,chart 使用了一个提供自签名证书颁发机构 (CA) 的 NiFi 工具包。
如果将 NiFi群集配置为作为具有 TLS 通信的安全群集运行,则需要打开用户身份验证。 使用以下受支持的用户身份验证方法之一:
- 基于证书的用户身份验证。 用户通过自己提供给 NiFi UI 的证书进行身份验证。 要使用这种用户身份验证系统,请将 CA 的公共证书添加到 NiFi 部署中。
- 基于 LDAP 的用户身份验证。 LDAP 服务器对用户凭据进行身份验证。 部署 chart 时,请提供有关 LDAP 服务器和信息树的信息。
- 基于 OpenID 的用户身份验证。 用户向 OpenID 服务器提供信息以配置部署。
资源配置和使用情况
若要优化资源使用率,请使用以下 Helm 选项配置 CPU 和内存值:
request
选项,指定容器请求的资源的初始量limit
选项,指定容器可以使用的最大资源量
配置 NiFi 时,请考虑系统的内存配置。 由于 NiFi 是一个 Java 应用程序,因此应调整某些设置,如最小和最大 Java 虚拟机 (JVM) 内存值。 使用以下设置:
jvmMinMemory
jvmMaxMemory
g1ReservePercent
conGcThreads
parallelGcThreads
initiatingHeapOccupancyPercent
安全性
安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述。
使用 Kubernetes 安全上下文来提高运行 NiFi 二进制文件的基础容器的安全性。 安全上下文管理对这些容器及其 Pod 的访问。 通过安全上下文,你可以授予非根用户运行容器的权限。
安全上下文的其他用法包括:
- 限制基于操作系统的用户(这些用户运行容器)的访问权限。
- 指定哪些组可以访问容器。
- 限制对文件系统的访问。
容器映像
Kubernetes 容器是运行 NiFi 二进制文件的基本单元。 要配置 NiFi群集,请重点关注用于运行这些容器的映像。 对于此映像,你有两种选择:
- 使用标准 NiFi 映像运行 NiFi chart。 Apache NiFi 社区提供该映像。 但需要将一个
kubectl
二进制文件添加到容器以配置安全群集。 - 使用自定义映像。 如果采用这种方法,请考虑文件系统要求。 确保 NiFi 二进制文件的位置正确。 有关配置的文件系统的详细信息,请参阅 Apache NiFi 源代码中的 Dockerfile。
作者
本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。
首席作者:
- Muazma Zahid | 首席项目经理
要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。
后续步骤
- Helm
- Helm chart
- Kubernetes
- Kubernetes StatefulSets
- Kubernetes Volumes
- Kubernetes ConfigMaps
- Kubernetes 机密
- Kubernetes 服务
- Kubernetes 入口
- Azure Kubernetes 服务
- Apache NiFi Docker 映像