前面我们使用Helm在Kubernetes中部署了生产可用的Pulsar集群,并将集群接入到Prometheus监控系统。 作为Pulsar集群的管理员,将这套生产可用的Pulsar集群交付给开发使用时,还需要做好租户和命名空间划分和创建,用户角色和权限配置。本节将根据实践介绍一下Pulsar集群管理员如何做这些工作的。 我们部署Pulsar集群时开启了基于非对称秘钥(asymmetric)的JWT认证,需要使用私钥为客户端应用的普通用户创建Token,将Token分发给客户端应用。Pulsar的权限统一在命名空间级别进行管理,在为普通用户创建好Token后,需要在命名空间的级别上对用户角色进行授权。JWTToken管理 pulsarmanager中提供了一个token管理的页面,但是Pulsar官方的HelmChart部署的pulsarmanager,目前还不支持开启了非对称秘钥(asymmetric)的JWT认证的pulsar集群。如果尝试在这个页面创建token的话,会报错。这是因为需要在pulsarmanager的配置application。properties中设置:jwt。broker。token。modePRIVATEjwt。broker。public。keyfile:pathbrokerpublic。keyjwt。broker。private。keyfile:pathbrokerprivate。key 而当前2。7。13版本的pulsarhelmchart还不支持对这个配置文件进行定制,同时也不支持以PRIVATEKEY环境变量的形式进行配置。 在部署pulsar时,用于创建和验证token的非对称密钥对,以名称为pulsartokenasymmetrickeySecret被创建到了K8S中。因此,可以放弃使用pulsarmanager来管理token,改使用pulsar命令行工具的形式。使用pulsarhelmchart部署pulsar时,为我们在k8s集群中部署了SatefulSetpulsartoolset的Pod,这个里面提供了用于管理pulsar的命令行空间pulsar和pulsaradmin等,但遗憾的是并没有将Secretpulsartokenasymmetrickey中的PRIVATE私钥以文件的形式挂载到Pod中,同时pulsarhelmchart当前也不支持这块的定制配置。 只好再手动部署一个pulsaradmintoolset,通过手动编写一个k8sdeployment的manifest文件来部署pulsaradmintoolset,并将pulsartokenasymmetrickey私钥挂载到Pod中。kind:DeploymentapiVersion:appsv1metadata:name:pulsaradmintoolsetnamespace:pulsarspec:replicas:1selector:matchLabels:app:pulsarcomponent:admintoolsetrelease:pulsartemplate:metadata:labels:app:pulsarcluster:pulsarcomponent:admintoolsetrelease:pulsarspec:volumes:name:tokenprivatekeysecret:secretName:pulsartokenasymmetrickeyitems:key:PRIVATEKEYpath:private。keydefaultMode:420name:clienttokensecret:secretName:pulsartokenadminitems:key:TOKENpath:clienttokendefaultMode:420containers:name:pulsartoolsetimage:harbor。example。comlibraryapachepulsarpulsarall:2。7。4command:shcargs:binapplyconfigfromenv。pyconfclient。binapplyconfigfromenv。pyconfbookkeeper。sleep10000000000envFrom:configMapRef:name:pulsartoolsetresources:limits:cpu:2memory:1Girequests:cpu:100mmemory:256MivolumeMounts:name:tokenprivatekeyreadOnly:truemountPath:pulsartokenprivatekeyname:clienttokenreadOnly:truemountPath:pulsartokensimagePullPolicy:IfNotPresentnodeSelector:noderole。kubernetes。iopulsar:pulsarsecurityContext:{}imagePullSecrets:name:regsecrettolerations:key:dedicatedoperator:Equalvalue:pulsareffect:NoSchedule 私钥被以文件pulsartokenprivatekeyprivate。key的形式挂载到了POD的容器中,这样集群管理员就可以进入到容器中执行下面的命令创建Token:binpulsartokenscreateprivatekeyfile:pulsartokenprivatekeyprivate。keysubjectuserrolename binpulsrtokenscreate命令的具体参数如下:createCreateanewtokenUsage:create〔options〕Options:e,expirytimeRelativeexpirytimeforthetoken(eg:1h,3d,10y)。(mminutes)Default:noexpirationpk,privatekeyPasstheprivatekeyforsigningthetoken。Thiscaneitherbe:data:,file:,etc。。sk,secretkeyPassthesecretkeyforsigningthetoken。Thiscaneitherbe:data:,file:,etc。。a,signaturealgorithmThesignaturealgorithmforthenewkeypair。Default:RS256PossibleValues:〔NONE,HS256,HS384,HS512,RS256,RS384,RS512,ES256,ES384,ES512,PS256,PS384,PS512〕s,subjectSpecifythesubjectorprincipalassociatewiththistoken 注意,可以使用e指定token失效时间,但一般为应用创建的token会设置为永久有效,但如果设置了永久有效,则分发出去的某个用户角色(subject)的token是无法撤回的。如果确实需要撤回,则只能将这个用户角色(subject)在pulsar相关租户和命名空间中的权限删除,这样这个token虽然还是可以通过认证,但是却无权进行相关操作了。授权管理 解决了Token创建的问题,来看一下授权管理,Pulsar的权限统一在命名空间级别进行管理,在为普通用户创建好Token后,需要在命名空间的级别上对用户角色进行授权。 例如,我们使用下面的命令为用户角色foo创建了token。binpulsartokenscreateprivatekeyfile:pulsartokenprivatekeyprivate。keysubject 可以使用下面的命令为用户角色foo进行授权:binpulsaradminnamespacesgrantpermissiontenant1namespace1actionsproduce,consumerolefoo 这样用户角色foo就在tenant1namespace1这个命名空间下具有produce和consume的权限了,客户端应用程序可以使用foo的token访问这个命名空间下的topic。 可以使用下面的命令查看命名空间下的所有授权:binpulsaradminnamespacespermissionstenant1namespace1 可以使用下面的命令收回某个用户角色在某个命名空间下的授权:binpulsaradminnamespacesrevokepermissiontenant1namespace1rolefoo 除了使用pulsaradmin外,还可以在pulsarmanager中的namespace管理页面中的POLICES中配置授权。参考https:pulsar。apache。orgdocsenadministrationpulsarmanager