#作者:Unstopabler
文章目录
简介
Apache Pulsar 是一个分布式、多租户、高性能的消息中间件系统,广泛应用于云原生架构中。它以其灵活的架构设计和强大的功能(如消息持久化、负载均衡、水平扩展等)脱颖而出,成为 Kafka 的强有力替代方案之一。
在 Kubernetes(简称 K8s)环境中部署 Apache Pulsar 集群,可以充分发挥其高可用性和弹性伸缩的优势。然而,由于 Pulsar 本身由多个组件构成(如 BookKeeper、ZooKeeper 和 Broker),并且需要依赖外部服务协调与存储,因此在 Kubernetes 上进行完整部署是一项复杂任务。
本文将详细介绍如何在 Kubernetes 环境中一步步搭建一个生产级别的 Pulsar 集群。从前期准备、基础组件安装,到 Helm Chart 使用、,再到最终的验证测试,我们将手把手带你完成整个部署流程。无论你是刚接触 Pulsar 的新手,还是有一定 Kubernetes 经验的开发者,都能从中获得实用的知识和经验。
开始这段深入浅出的 Pulsar 部署
一:环境准备
在部署 Apache Pulsar 集群之前,我们需要准备好相关的软硬件环境和依赖组件。以下是我们本次部署所使用的环境及软件版本:
说明:
使用 Pulsar Helm Chart 3.3.0 可以大大简化部署流程。它集成了完整的 Pulsar 架构组件,包括:
ZooKeeper:用于元数据管理和协调;
BookKeeper:用于消息持久化存储;
Broker:负责接收、转发和处理消息;
Functions / Dashboard / Toolset:可选模块,用于扩展功能与监控。
pulsar-all 镜像包
我们同时下载了 Apache Pulsar 3.0.2 的完整镜像包,用于后续的功能验证、命令行操作和调试。例如,我们可以使用 pulsar-admin 工具来管理租户、命名空间、主题等资源。
在正式部署前,请确保以下准备工作已完成:
所有节点操作系统已安装并配置完毕
Kubernetes 集群已搭建完成,并能正常运行 Pod
NFS 存储服务已配置好,并可在各节点挂载访问
Helm 已安装并配置好仓库
Pulsar Helm Chart 已下载或添加至本地仓库
网络策略与防火墙规则已放行所需端口
二:确认pulsar安装版本
在正式开始部署之前,我们需要确认当前可用的 Pulsar Helm Chart 版本,并确保所使用的版本与我们的目标一致(如 3.3.0)helm repo add apache https://pulsar.apache.org/charts
对应版本
root@k8s-master1:[/root]helm search repo pulsar -l
NAME CHART VERSION APP VERSION DESCRIPTION
apache/pulsar 3.6.0 3.0.7 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.5.0 3.0.6 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.4.1 3.0.5 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.4.0 3.0.4 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.3.1 3.0.3 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.3.0 3.0.2 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.2.0 3.0.2 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.1.0 3.0.2 Apache Pulsar Helm chart for Kubernetes
apache/pulsar 3.0.0 2.10.2 Apache Pulsar Helm chart for Kubernetes
三:下载pulsar
添加 Pulsar Helm 仓库
首先,我们需要将 Apache Pulsar 的官方 Helm 仓库添加到本地环境中:
helm repo add apache https://pulsar.apache.org/charts
再将pulsar git到本地:
git clone -b pulsar-3.3.0 https://github.com/apache/pulsar-helm-chart.git
registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all:3.0.2
四:pulsar的安装部署
1. 创建JWT认证所需的secret
为了增强 Pulsar 集群的安全性,在生产环境中建议启用身份认证机制。Apache Pulsar 支持多种认证方式,其中 JWT(JSON Web Token)是一种轻量级且广泛使用的认证方案。
在 Kubernetes 环境下部署 Pulsar 时,我们可以通过 Helm Chart 自动或手动创建用于 JWT 认证的密钥对(即私钥与公钥),并将其打包为 Kubernetes Secret,供集群中的各个组件使用。
部署的 Pulsar 集群需要在安全上开通 JWT 认证。非生产环境也可以不开通,以下的1111.yaml为生产生成的JWT的认证内容。
[root@k8s-master pulsar-helm-chart]# cat 1111.yaml
#generate the token keys for the pulsar cluster
---
#The private key and public key are generated to /tmp/tmp.sarUlYjZcW and /tmp/tmp.agPBgiWsPP successfully.
apiVersion: v1
data:
PRIVATEKEY: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDWkfyw5b/IO7+5mz6gs6jypBe0nf2JfLElHYGtNxutjEFqKQBCYQht90ES6mj6Ap6M6eTCbfy7kDW0cBKjfAx6HATtJa4FPy0Y7V/vO9dipTnTWLyGUHoMRmyjLugPjLcOlHADzIOwu7sXtEVtKWjhNNbtm3vui6mk0ieKQO+23S36fJEKNvBfuW9yjobnnHUBvu/Rb+GGtP0JolH1OZALZkGamf6lMaS06O1MCzs0K1Xqr4JpDZ2qjonEPfrJUqnjad4LWNsdtzzE+NU6+dTq2NP6e99vQuFoozmqfQvsLaRX1w/F9mUfVoBDOjjP23zUbAk9zbbdOfqTZNR0xVP/AgMBAAECggEABBld3nNFKqoZi44vsBo+jAQef9DU2x+Kss7Rf2GiIbqgNUr7OkloQ9GJaLcZsk0CgmalfCFlxp+Gpx/M+1qPUnXekjk6DdebIPLH9mYKQ1QsuqDjWR2Id1uRD70BqepiROEJEsmBaorrlBRZjzBPVJ4RzRA/WdtJLmDlaHq9GZ0vHT8HcU++Z0cgZmdUVc2Sc86zrMmEPtOsaPJPIRIQlrMi5i2/q/z717vvvMIDqY8lh7kaxCo1X0poWjzcBq/ZF8F1x0rCLrYMVe5R5750cdS4bxpKMxrASX81+wbZFxLMbz6lkmTWsJb5cwgXIy2+tXjF8NRrGeYRKcgWGwMVoQKBgQDaCKLawZidx0vIeUh50mgjsL5vWNcQCjXmomD/HHRzZ/9DXMUOEUwIgYd84cT6zx42s7ZlCRKU+qKZYDmp2y5Ty2SZQ9D2RtVPCtIPjynLjy24veaqNU6fjxIlan6NgcapU3kUTHaNnt9yEYtnQodvjWaSeUGtnHTQ6S2LACOiVQKBgQD77vVhJ0BSy6SETzUiHc+qLzt+8JVV6hxHWZzpdzJeuy1p7y6HiE/4ecOxtFgow1ownx/dUeCMD6jx5P7yJcjHCzrvkJ9PrsI5y5og2lvbf2rZBguJLyCMOi44mPmQBDBITIeHHwnYBxOsdG9lvWdLmOqX+TpC2Xobyq0WHN+5AwKBgQC2yRKuTirB6zhvIq5N4sUHVr7v3gy+F7FEXtDuTk6aCY+IS5evyXRylRSe7y8SDN0JgvPgFBEN8GisKG1vJp7aBOObUa03Kf7duvaLsLubObdc72cXPoVhYrIVyAe8XhXMEnypNckVxSESIf86XB3quSJKnXkgMNAF69YQd9dn2QKBgAGFtB3eKtlVOa1C/UMzgum4V1exBHX8cCdON1CB0+AWqXOWamWPQUxzD+em+1FjvMvGal7f+8dc4Nx1UcUMzWXGf5iq+wt0NuA6hrfkGeH9pxugmbk+e6fdQiI9amSgYdpN/BOo8FpJ0KieG3414sXmKqS4cM2umrpIQzt6+S8ZAoGAEU65PN7mr8/mWL/ZbROnB2U2Sr5vb4CsvGTL0Xxqi46UZms43OIR5fjq1vz/3F3Qva0r2jkbdeb4t8UK7VfgZAH4mr1lNxPruk7s7pyN7kQnyFxHJtmqEZnttGt2cQvkK/CEzmNqxY5PWY9pqotrZqQHcQIHvn59mK92imJYGjQ=
PUBLICKEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1pH8sOW/yDu/uZs+oLOo8qQXtJ39iXyxJR2BrTcbrYxBaikAQmEIbfdBEupo+gKejOnkwm38u5A1tHASo3wMehwE7SWuBT8tGO1f7zvXYqU501i8hlB6DEZsoy7oD4y3DpRwA8yDsLu7F7RFbSlo4TTW7Zt77ouppNInikDvtt0t+nyRCjbwX7lvco6G55x1Ab7v0W/hhrT9CaJR9TmQC2ZBmpn+pTGktOjtTAs7NCtV6q+CaQ2dqo6JxD36yVKp42neC1jbHbc8xPjVOvnU6tjT+nvfb0LhaKM5qn0L7C2kV9cPxfZlH1aAQzo4z9t81GwJPc223Tn6k2TUdMVT/wIDAQAB
kind: Secret
metadata:
creationTimestamp: null
name: pulsar-token-asymmetric-key
namespace: pulsar
#generate the tokens for the super-users: proxy-admin,broker-admin,admin
#generate the token for proxy-admin
---
#pulsar-token-asymmetric-key
apiVersion: v1
data:
TOKEN: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnpkV0lpT2lKd2NtOTRlUzFoWkcxcGJpSjkuRVBVNk85a29mcUZOWEpZLVltUnpvNndQZUFhbVNVeF9NMmJKWE53MmxjcG0wdzFGV3NSZ0JnallqVmxaU190WEdwbXJiZk9BVVVWejUtYWZUVmVHblhCbGc4QUZuNWVCVXEzbzN0QVZwZ3A3VmQtU3N6Z2tEZUZOTVN3cFUxeVZveGVkUTlqdll1QU1QZmZGcDU4Uk5CLUl6dXdOUDhmTkJfcS1MelphdVZEUzh1NkdyaXg5R0pkamF6eUxYOFNDWnozeThRYk5ZLXJiQXE1QlhiWlFHck1ZX3pLMy1CSlBXZm43MzNnWVE2ZTRiYjVXdzNVRkx0bnZ1enFCbHJNa3Z2MVFla2h6T1JiSUlMMUpjRUwtekhYckExN2NIQ0NtQmpXSy05MEhvMmVIUTZIdjZoVmtzc2dZS1VTQkR5QldjQTY4SnpsMnRRME9pRTI0djNQdENn
TYPE: YXN5bW1ldHJpYw==
kind: Secret
metadata:
creationTimestamp: null
name: pulsar-token-proxy-admin
namespace: pulsar
#generate the token for broker-admin
---
#pulsar-token-asymmetric-key
apiVersion: v1
data:
TOKEN: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnpkV0lpT2lKaWNtOXJaWEl0WVdSdGFXNGlmUS5WamJUSVkzam9RZmt2WHJKNDVmaXE1R2dtb2QtdVpGaFVCNFlTVTkydlRHVUozYUhZUFJVa0xISFhlYklCNTkyV0NhdUVhQ3FfOE5kTDFnU3NtRTI3NXhWZ010SVRYNUg0dUZiWkpxcllBV2pfTHVPM3BseWlvXzhUUktJQUJkZUx0RFlkdzduSE10c21LRjdkOUVUWDdMU2VwdUc0cWlLdDI2UHdlOFJWTUx2UkpzeUVOMU9GWkVPT19BZmUyMnlmeDFRR3d0eGVPM21LOXZFOTRtR3hybEoxWEVhaWxvdlJQbGJiOUQ2eUNqMFFsWWFBcG5oc3ctRzFhaTZVcmtYY2VSaVRLZG9jSElZRGNMc0tqMGFRUExPNW5uMEtTOGUxelNzeG5fYWFXQk1BazRSYWdzS0MwOEc0THZ5UGpJYnktOHRaQ0kyODhyQk5xUkxDN1dGV3c=
TYPE: YXN5bW1ldHJpYw==
kind: Secret
metadata:
creationTimestamp: null
name: pulsar-token-broker-admin
namespace: pulsar
#generate the token for admin
---
#pulsar-token-asymmetric-key
apiVersion: v1
data:
TOKEN: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnpkV0lpT2lKaFpHMXBiaUo5LnJ2NF93Q3BacVRUS05tdFpGUnVkWjVBQjhjZkxxU2NhMEtLSW91djdDdVJEOWVDdkhaaS1yM3oxSjc0VG1UV0RvSzQxaUdSOFlHR2JnMVZSaDRnclFxZThxSFFUZTZ4RDJqVnJRTy12SkVvd3RCWnNHemtsSHJ3a1BPd2FTN2toTzVaT0Y2LUpNbDgxNDYycmtnTExiZEg4Y0UxQTFqWEVUTFpwNTZYQ0kycGdsSjFWLXV2TFVZZmstcXNTTWFISDdHRFdMX3FmRFJ5MEIxRkNpYlY3Vk91dnhYTXUxTE9iVkN5eWVHWGxsc3dETFUwVmxpWDZXSF9sNnFYREZzZ2YwSndkNl9FSmU1c20tWkNzU2N3RVVRdWFkVl85WVcycXYyMktBRm9fV3VsdUNUN3lHQS1LMTl4WGZlNWpTSXVraUF0amVTMWZkeDlFTWFCNklWWE1vdw==
TYPE: YXN5bW1ldHJpYw==
kind: Secret
metadata:
creationTimestamp: null
name: pulsar-token-admin
namespace: pulsar
#-------------------------------------
#The jwt token secret keys are generated under:
# - 'pulsar-token-asymmetric-key'
#The jwt tokens for superusers are generated and stored as below:
# - 'proxy-admin':secret('pulsar-token-proxy-admin')
# - 'broker-admin':secret('pulsar-token-broker-admin')
# - 'admin':secret('pulsar-token-admin')
2. 修改pulsar下的values.yaml
在使用 Helm 安装 Apache Pulsar 前,我们需要对官方提供的 values.yaml 文件进行适当修改,以适配我们的 Kubernetes 环境和业务需求。以下是多个关键配置项的说明与建议设置,修改较多。安装部署相比其他组件,复杂的多。
# 修改1
namespace: "pulsar" #最好要创建pulsar,因为下面是false
# 如果已有这个命名空间则false 无的话改为true
namespaceCreate: false
# 修改2 使用持久化存储 开启存储,我的是storageClass,前提已经部署好了。
persistence: true
## Volume settings
volumes:
persistence: true
# configure the components to use local persistent volume
# the local provisioner should be installed prior to enable local persistent volume
local_storage: false
# 修改3 修改你要部署哪些组件。
components:
# zookeeper
zookeeper: true
# bookkeeper
bookkeeper: true
# bookkeeper - autorecovery
autorecovery: true
# broker
broker: true
# functions
functions: true
# proxy
proxy: true
# toolset
toolset: true
# pulsar manager 因为这里使用自己的postgres所以pulsar-manager单独部署
pulsar_manager: false
# 修改4 监控可以关闭。
monitoring:
# monitoring - prometheus
prometheus: false
# monitoring - grafana
grafana: false
# monitoring - node_exporter
node_exporter: false
# alerting - alert-manager
alert_manager: false
# 修改5
images:
zookeeper:
repository: registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all
tag: 3.0.2
pullPolicy: IfNotPresent
bookie:
repository: registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all
tag: 3.0.2
pullPolicy: IfNotPresent
autorecovery:
repository: registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all
tag: 3.0.2
pullPolicy: IfNotPresent
broker:
repository: registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all
tag: 3.0.2
pullPolicy: IfNotPresent
proxy:
repository: registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all
tag: 3.0.2
pullPolicy: IfNotPresent
functions:
repository: registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all
tag: 3.0.2
# 修改6
# Enable or disable broker authentication and authorization.
auth:
authentication:
# 改为true
enabled: true
provider: "jwt"
jwt:
# Enable JWT authentication
# If the token is generated by a secret key, set the usingSecretKey as true.
# If the token is generated by a private key, set the usingSecretKey as false.
usingSecretKey: false
authorization:
# 改为true
enabled: true
zookeeper:
...
volumes:
# use a persistent volume or emptyDir
# 使用持久化存储
persistence: true
data:
name: data
size: 20Gi
local_storage: true
# 修改成k8s中使用的sc(sc已经建好了的)
storageClassName: "nfs-client"
bookkeeper:
...
volumes:
# use a persistent volume or emptyDir
persistence: true
journal:
name: journal
size: 10Gi
local_storage: true
storageClassName: nfs-client
useMultiVolumes: false
multiVolumes:
- name: journal0
size: 10Gi
storageClassName: nfs-client
mountPath: /pulsar/data/bookkeeper/journal0
- name: journal1
size: 10Gi
storageClassName: nfs-client
mountPath: /pulsar/data/bookkeeper/journal1
ledgers:
name: ledgers
size: 50Gi
storageClassName: nfs-client
useMultiVolumes: false
multiVolumes:
- name: ledgers0
size: 10Gi
storageClassName: nfs-client
mountPath: /pulsar/data/bookkeeper/ledgers0
- name: ledgers1
size: 10Gi
storageClassName: nfs-client
mountPath: /pulsar/data/bookkeeper/ledgers1
## use a single common volume for both journal and ledgers
useSingleCommonVolume: false
common:
name: common
size: 60Gi
local_storage: true
storageClassName: "nfs-client"
# 修改7
pulsar_metadata:
component: pulsar-init
image:
# the image used for running `pulsar-cluster-initialize` job
repository: registry.cn-hangzhou.aliyuncs.com/xxx/pulsar-all
tag: 3.0.2
pullPolicy: IfNotPresent
# 修改8
## Proxy service
## templates/proxy-service.yaml
##
ports:
http: 80
https: 443
pulsar: 6650
pulsarssl: 6651
service:
annotations: {}
# 原来是LoadBalancer改为NodePort
type: NodePort
3.执行安装pulsar
在完成前期准备和配置文件修改后,我们现在正式使用 Helm 来部署 Apache Pulsar 集群。
执行
helm install
–values ./pulsar/values.yaml
–set initialize=true
–namespace pulsar
pulsar pulsar-3.3.0.tgz
安装流程说明:
Helm 会解析 pulsar-3.3.0.tgz 中的 Chart 结构;
根据 values.yaml 和 --set 参数生成最终的部署配置;
在 Kubernetes 中依次创建以下资源:
Namespace(如果未禁用自动创建)
ConfigMap、Secret(如 JWT 密钥)
ServiceAccount、Role、RoleBinding(权限控制)
StatefulSet / Deployment(ZooKeeper、BookKeeper、Broker 等核心组件)
Service(提供访问入口)
如果启用了 initialize=true,还会运行初始化 Job 来准备存储环境。
看到 Bookie、Broker、Proxy的SVC、STS、JOB、POD的信息。
[root@k8s-master pulsar]# kubectl get all -n pulsar
NAME READY STATUS RESTARTS AGE
pod/pulsar-bookie-0 1/1 Running 0 82m
pod/pulsar-bookie-1 1/1 Running 0 81m
pod/pulsar-bookie-2 1/1 Running 0 81m
pod/pulsar-bookie-init-fxg8q 0/1 Completed 0 82m
pod/pulsar-broker-0 1/1 Running 2 (72m ago) 82m
pod/pulsar-broker-1 1/1 Running 1 (73m ago) 82m
pod/pulsar-broker-2 1/1 Running 2 (72m ago) 82m
pod/pulsar-proxy-0 1/1 Running 0 82m
pod/pulsar-proxy-1 1/1 Running 0 82m
pod/pulsar-proxy-2 1/1 Running 0 82m
pod/pulsar-pulsar-init-b2xlw 0/1 Completed 0 82m
pod/pulsar-recovery-0 1/1 Running 0 82m
pod/pulsar-toolset-0 1/1 Running 0 82m
pod/pulsar-zookeeper-0 1/1 Running 0 82m
pod/pulsar-zookeeper-1 1/1 Running 0 82m
pod/pulsar-zookeeper-2 1/1 Running 0 82m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/pulsar-bookie ClusterIP None <none> 3181/TCP,8000/TCP 82m
service/pulsar-broker ClusterIP None <none> 8080/TCP,6650/TCP 82m
service/pulsar-proxy NodePort 10.102.63.112 <none> 80:31146/TCP,6650:30163/TCP 82m
service/pulsar-recovery ClusterIP None <none> 8000/TCP 82m
service/pulsar-toolset ClusterIP None <none> <none> 82m
service/pulsar-zookeeper ClusterIP None <none> 8000/TCP,2888/TCP,3888/TCP,2181/TCP 82m
NAME READY AGE
statefulset.apps/pulsar-bookie 3/3 82m
statefulset.apps/pulsar-broker 3/3 82m
statefulset.apps/pulsar-proxy 3/3 82m
statefulset.apps/pulsar-recovery 1/1 82m
statefulset.apps/pulsar-toolset 1/1 82m
statefulset.apps/pulsar-zookeeper 3/3 82m
NAME COMPLETIONS DURATION AGE
job.batch/pulsar-bookie-init 1/1 8m17s 82m
job.batch/pulsar-pulsar-init 1/1 8m37s 82m
## 4. 验证部署后是否成功
在完成 Helm 安装后,我们需要对 Pulsar 集群的基本功能进行验证,确保各个组件运行正常,且能够执行消息的发布与消费操作。以下步骤将指导你如何验证集群状态,并创建一些基础资源用于后续升级或测试。
1、使用 pulsar-admin 工具验证租户管理功能
Pulsar 提供了一个命令行工具 pulsar-admin,可用于管理租户(Tenant)、命名空间(Namespace)、主题(Topic)等资源。
如果是第一次部署,输出应为一个空列表或默认租户(如 public)。
2、创建测试租户(为后续升级和多租户测试做准备)
我们创建两个新租户 tenant1 和 tenant2,用于后续的功能测试或版本升级验证。
kubectl -n pulsar exec -it pulsar-toolset-0 -- bin/pulsar-admin tenants create tenant1
kubectl -n pulsar exec -it pulsar-toolset-0 -- bin/pulsar-admin tenants create tenant2
3、验证租户是否创建成功:
kubectl -n pulsar exec -it pulsar-toolset-0 -- bin/pulsar-admin tenants list
"public"
"tenant1"
"tenant2"
4. 创建命名空间并验证
接下来我们可以为其中一个租户创建命名空间(Namespace),这是组织Topic的逻辑单元。
# 为 tenant1 创建命名空间 namespace-a
kubectl -n pulsar exec -it pulsar-toolset-0 -- bin/pulsar-admin namespaces create tenant1/namespace-a
# 列出 tenant1 下的所有命名空间
kubectl -n pulsar exec -it pulsar-toolset-0 -- bin/pulsar-admin namespaces list tenant1
5. 创建 Topic 并发送/消费消息
如果想进一步验证 Pulsar 的基本消息功能,尝试创建一个Topic并测试消息收发。
kubectl -n pulsar exec -it pulsar-toolset-0 – bin/pulsar-admin topics create persistent://tenant1/namespace-a/test-topic
启动消费者监听 Topic:
kubectl -n pulsar exec -it pulsar-toolset-0 – bin/pulsar-client consume persistent://tenant1/namespace-a/test-topic -s “my-subscription” -n 100
在另一个终端启动生产者发送消息:
kubectl -n pulsar exec -it pulsar-toolset-0 – bin/pulsar-client produce persistent://tenant1/namespace-a/test-topic -m “Hello supinfo!” -n 1
如果消费者能成功接收到消息,则说明Pulsar集群部署成功且功能可用。