{"id":39428885,"url":"https://github.com/kafkaesque-io/pulsar-helm-chart","last_synced_at":"2026-01-18T04:01:38.121Z","repository":{"id":36981094,"uuid":"226422923","full_name":"kafkaesque-io/pulsar-helm-chart","owner":"kafkaesque-io","description":"Helm Chart for an Apache Pulsar Cluster","archived":false,"fork":false,"pushed_at":"2024-04-19T20:19:46.000Z","size":2274,"stargazers_count":31,"open_issues_count":9,"forks_count":23,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-04-19T21:33:08.528Z","etag":null,"topics":["apache-pulsar","helm-chart","kubernetes"],"latest_commit_sha":null,"homepage":"https://helm.kafkaesque.io","language":"Mustache","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kafkaesque-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-12-06T22:40:51.000Z","updated_at":"2023-11-07T12:53:08.000Z","dependencies_parsed_at":"2023-10-04T04:34:58.821Z","dependency_job_id":null,"html_url":"https://github.com/kafkaesque-io/pulsar-helm-chart","commit_stats":null,"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/kafkaesque-io/pulsar-helm-chart","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kafkaesque-io%2Fpulsar-helm-chart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kafkaesque-io%2Fpulsar-helm-chart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kafkaesque-io%2Fpulsar-helm-chart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kafkaesque-io%2Fpulsar-helm-chart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kafkaesque-io","download_url":"https://codeload.github.com/kafkaesque-io/pulsar-helm-chart/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kafkaesque-io%2Fpulsar-helm-chart/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28529455,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache-pulsar","helm-chart","kubernetes"],"created_at":"2026-01-18T04:01:37.833Z","updated_at":"2026-01-18T04:01:38.109Z","avatar_url":"https://github.com/kafkaesque-io.png","language":"Mustache","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GitHub](https://avatars1.githubusercontent.com/u/9919?s=30\u0026v=4)](https://github.com/kafkaesque-io/pulsar-helm-chart) \n[![CircleCI](https://circleci.com/gh/kafkaesque-io/pulsar-helm-chart/tree/master.svg?style=svg)](https://circleci.com/gh/kafkaesque-io/pulsar-helm-chart/tree/master)\n[![LICENSE](https://img.shields.io/hexpm/l/pulsar.svg)](https://github.com/kafkaesque-io/pulsar-helm-chart/blob/master/LICENSE)\n\nThis chart has been deprecated and is no longer actively developed. It has been replaced by https://github.com/datastax/pulsar-helm-chart\n\n# Helm Chart for an Apache Pulsar Cluster\n\nThis Helm chart configures an Apache Pulsar cluster. It is designed for production use, but can also be used in local development environments with the proper settings.\n\nIt includes support for:\n* [TLS](#tls)\n* [Authentication](#authentication)\n* WebSocket Proxy\n* Standalone Functions Workers\n* Pulsar IO Connectors\n* [Tiered Storage](#tiered-storage)\n* [Pulsar SQL Workers](#pulsar-sql)\n* Independent Image Versions for Components (Zookeeper, Bookkeeper, etc), enabling controlled upgrades\n* [Pulsar Express Web UI](#managing-pulsar-using-pulsar-express) for managing the cluster\n\n[Helm](https://helm.sh) must be installed and initialized to use the chart. Both Helm 2 and Helm 3 are supported.\nPlease refer to Helm's [documentation](https://helm.sh/docs/) to get started.\n\n_Don't want to run it yourself? Go to [Kesque](https://kesque.com) for fully managed Pulsar services._\n\n## Add to local Helm repository \nTo add this chart to your local Helm repository (Helm 3):\n\n```helm repo add kafkaesque https://helm.kafkaesque.io```\n\nTo update to the latest chart:\n\n```helm repo update```\n\nNote: This command updates all your Helm charts.\n\nTo list the version of the chart in the local Helm repository:\n\n```helm search repo kafkaesque/pulsar```\n\n\n## Installing Pulsar in a Cloud Provider\n\nBefore you can install the chart, you need to configure the storage class settings for your cloud provider. The handling of storage varies from cloud provider to cloud provider.\n\nCreate a new file called ```storage_values.yaml``` for the storage class settings. To use an existing storage class (including the default one) set this value:\n\n```\ndefault_storage:\n  existingStorageClassName: default or \u003cname of storage class\u003e\n```\nFor each volume of each component (Zookeeper, Bookkeeper), you can override the `default_storage` setting by specifying a different `existingStorageClassName`. This allows you to match the optimum storage type to the volume. \n\nIf you have specific storage class requirement, for example fixed IOPS disks in AWS, you can have the chart configure the storage classes for you. Here are examples from the cloud providers:\n\n```\n# For AWS\n# default_storage:\n#  provisioner: kubernetes.io/aws-ebs\n#  type: gp2\n#  fsType: ext4\n#  extraParams:\n#     iopsPerGB: \"10\"\n\n\n# For GCP\n# default_storage:\n#   provisioner: kubernetes.io/gce-pd\n#   type: pd-ssd\n#   fsType: ext4\n#   extraParams:\n#      replication-type: none\n\n# For Azure\n# default_storage:\n#   provisioner: kubernetes.io/azure-disk\n#   fsType: ext4\n#   type: managed-premium\n#   extraParams:\n#     storageaccounttype: Premium_LRS\n#     kind: Managed\n#     cachingmode: ReadOnly\n```\nSee the [values file](https://github.com/kafkaesque-io/pulsar-helm-chart/blob/master/helm-chart-sources/pulsar/values.yaml) for more details on these settings.\n\nOnce you have your storage settings in the values file, install the chart like this :\n\n\n```helm install pulsar kafkaesque/pulsar --namespace pulsar --create-namespace --values storage_values.yaml```\n\n## Installing Pulsar for development\n\nThis chart is designed for production use, but it can be used in development enviroments. To use this chart in a development environment (ex minikube), you need to:\n\n* Disable anti-affinity rules that ensure components run on different nodes\n* Reduce resource requirements\n* Disable persistence (configuration and messages are not stored so are lost on restart). If you want persistence, you will have to configure storage settings that are compatible with your development enviroment as described above.\n\nFor an example set of values, download this [values file](https://github.com/kafkaesque-io/pulsar-helm-chart/blob/master/examples/dev-values.yaml). Use that values file or one like it to start the cluster:\n\n\n```helm install pulsar kafkaesque/pulsar --namespace pulsar --create-namespace --values dev-values.yaml```\n\n\n## Accessing the Pulsar cluster in cloud\n\nThe default values will create a ClusterIP for all components. ClusterIPs are only accessible within the Kubernetes cluster. The easiest way to work with Pulsar is to log into the bastion host (assuming it is in the pulsar namespace):\n\n```\nkubectl exec $(kubectl get pods -l component=bastion -o jsonpath=\"{.items[*].metadata.name}\" -n pulsar) -it -n pulsar -- /bin/bash\n```\nOnce you are logged into the bastion, you can run Pulsar admin commands:\n\n```\nbin/pulsar-admin tenants list\n```\nFor external access, you can use a load balancer. Here is an example set of values to use for load balancer on the proxy:\n\n```\nproxy:\n service:\n    type: LoadBalancer\n    ports:\n    - name: http\n      port: 8080\n      protocol: TCP\n    - name: pulsar\n      port: 6650\n      protocol: TCP\n```\n\nIf you are using a load balancer on the proxy, you can find the IP address using:\n\n```kubectl get service -n pulsar```\n\n## Accessing the Pulsar cluster on localhost\n\nTo port forward the proxy admin and Pulsar ports to your local machine:\n\n```kubectl port-forward -n pulsar $(kubectl get pods -n pulsar -l component=proxy -o jsonpath='{.items[0].metadata.name}') 8080:8080```\n\n```kubectl port-forward -n pulsar $(kubectl get pods -n pulsar -l component=proxy -o jsonpath='{.items[0].metadata.name}') 6650:6650```\n\nOr if you would rather go directly to the broker:\n\n```kubectl port-forward -n pulsar $(kubectl get pods -n pulsar -l component=broker -o jsonpath='{.items[0].metadata.name}') 8080:8080```\n\n```kubectl port-forward -n pulsar $(kubectl get pods -n pulsar -l component=broker -o jsonpath='{.items[0].metadata.name}') 6650:6650```\n\n## Managing Pulsar using Pulsar Express\n\n[Pulsar Express](https://github.com/bbonnin/pulsar-express) is an open-source Web UI for managing Pulsar clusters. Thanks to (Bruno Bonnin)[https://twitter.com/_bruno_b_] for creating this handy tool.\n\nYou can install Pulsar Express in your cluster by enabling with this values setting:\n\n```\nextra:\n  pulsarexpress: yes\n```\n\nIt will be automatically configured to connect to the Pulsar cluster.\n\n### Accessing Pulsar Express on your local machine\n\nTo access the Pulsar Express UI on your local machine, forward port 3000:\n\n```\nkubectl port-forward -n pulsar $(kubectl get pods -n pulsar -l component=pulsarexpress -o jsonpath='{.items[0].metadata.name}') 3000:3000\n```\n\n### Accessing Pulsar Express from cloud provider\n\nTo access Pulsar Express from a cloud provider, the chart supports [Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/). Your Kubernetes cluster must have a running Ingress controller (ex Nginx, Traefik, etc).\n\nSet these values to configure the Ingress for Pulsar Express:\n\n```\npulsarexpress:\n  ingress:\n    enabled: yes\n    host: pulsar-ui.example.com\n    annotations:\n      ingress.kubernetes.io/auth-secret: ui-creds\n      ingress.kubernetes.io/auth-type: basic\n```\nPulsar Express does not have any built-in authentication capabilities. You should use authentication features of your Ingress to limit access. The example above (which has been tested with [Traefik](https://docs.traefik.io/)) uses annotations to enable basic authentication with the password stored in secret.\n\n## Tiered Storage\n\nTiered storage (offload to blob storage) can be configured in the `storageOffload` section of the `values.yaml` file. Instructions for AWS S3 and Google Cloud Storage are provided in the file.\n\nIn addition you can configure any S3 compatible storage. There is explicit support for [Tardigrade](https://tardigrade.io), which is a provider of secure, decentralized storage. You can enable the Tardigarde S3 gateway in the `extras` configuration. The instructions for configuring the gateway are provided in the `tardigrade` section of the `values.yaml` file.\n\n## Pulsar SQL\nIf you enable Pulsar SQL, the cluster provides [Presto](https://prestodb.io/) access to the data stored in BookKeeper (and tiered storage, if enabled). Presto is exposed on the service named `\u003crelease\u003e-sql-svc`.\n\nThe easiest way to access the Presto command line is to log into the bastion host and then connect to the Presto service port, like this:\n\n```\nbin/pulsar sql --server pulsar-sql-svc:8080\n```\nWhere the value for the `server` option should be the service name plus port. Once you are connected, you can enter Presto commands:\n\n```\npresto\u003e SELECT * FROM system.runtime.nodes;\n               node_id                |         http_uri         | node_version | coordinator | state  \n--------------------------------------+--------------------------+--------------+-------------+--------\n 64b7c5a1-9a72-4598-b494-b140169abc55 | http://10.244.5.164:8080 | 0.206        | true        | active \n 0a92962e-8b44-4bd2-8988-81cbde6bab5b | http://10.244.5.196:8080 | 0.206        | false       | active \n(2 rows)\n\nQuery 20200608_155725_00000_gpdae, FINISHED, 2 nodes\nSplits: 17 total, 17 done (100.00%)\n0:04 [2 rows, 144B] [0 rows/s, 37B/s]\n```\nTo access Pulsar SQL from outside the cluster, you can enable the `ingress` option which will expose the Presto port on hostname. We have tested with the Traefik ingress, but any Kubernetes ingress should work. You can then run SQL queries using the Presto CLI and monitoring Presto using the built-in UI (point browser to the ingress hostname). It is recommended that you match the Presto CLI version to the version running as part of Pulsar SQL (currently 0.206).\n\nThe Presto CLI supports basic authentication, so if you enabled that on the ingress (using annotations), you can have secure Presto access.\n\n```\npresto --server https://presto.example.com --user admin --password\nPassword: \npresto\u003e show catalogs;\n Catalog \n---------\n pulsar  \n system  \n(2 rows)\n\nQuery 20200610_131641_00027_tzc7t, FINISHED, 1 node\nSplits: 19 total, 19 done (100.00%)\n0:01 [0 rows, 0B] [0 rows/s, 0B/s]\n```\n\n## Dependencies\n\n### Authentication\nThe chart can enable token-based authentication for your Pulsar cluster. For information on token-based\nauthentication in Pulsar, go [here](https://pulsar.apache.org/docs/en/security-token-admin/).\n\nFor this to work, a number of values need to be stored in secrets prior to enabling token-based authentication. First, you need to generate a key-pair for signing the tokens using the Pulsar tokens command:\n\n```bin/pulsar tokens create-key-pair --output-private-key my-private.key --output-public-key my-public.key```\n\n**Note:** The names of the files used in this section match the default values in the chart. If you used different names, then you will have to update the corresponding values.\n\nThen you need to store those keys as secrets.\n\n```\nkubectl create secret generic token-private-key \\\n --from-file=my-private.key \\\n --namespace pulsar\n ```\n\n\n```\nkubectl create secret generic token-public-key \\\n --from-file=my-public.key \\\n --namespace pulsar\n ```\n\n\nUsing those keys, generate tokens with subjects(roles): \n\n```bin/pulsar tokens create --private-key file:///pulsar/token-private-key/my-private.key --subject \u003csubject\u003e```\n\nYou need to generate tokens with the following subjects:\n\n- admin\n- superuser\n- proxy\n- websocket (only required if using the standalone WebSocket proxy)\n\nOnce you have created those tokens, add each as a secret:\n\n```\nkubectl create secret generic token-\u003csubject\u003e \\\n --from-file=\u003csubject\u003e.jwt \\\n --namespace pulsar\n ```\n\nOnce you have created the required secrets, you can enable token-based authentication with this setting in the values:\n\n```\nenableTokenAuth: yes\n```\n\n### TLS\n\nTo use TLS, you must first create a certificate and store it in the secret defined by ```tlsSecretName```.\nYou can create the certificate like this:\n\n```kubectl create secret tls \u003ctlsSecretName\u003e --key \u003ckeyFile\u003e --cert \u003ccertFile\u003e```\n\nThe resulting secret will be of type kubernetes.io/tls. The key should not be in PKCS 8 format even though that is the format used by Pulsar.  The format will be converted by chart to PKCS 8. \n\nYou can also specify the certificate information directly in the values:\n\n```\n# secrets:\n  # key: |\n  # certificate: |\n  # caCertificate: |\n```\n\nThis is useful if you are using a self-signed certificate.\n\nFor automated handling of publicly signed certificates, you can use a tool\nsuch as [cert-manager](https://cert-mananager). The following [page](https://github.com/kafkaesque-io/pulsar-helm-chart/blob/master/aws-customer-docs.md) describes how to set up cert-manager in AWS.\n\nOnce you have created the secrets that store the cerficate info (or specified it in the values), you can enable TLS in the values:\n\n```\nenableTls: yes\n```\n\n### Chart dependency\n\nTo avoid unnecessary and frequent Prometheus chart upgrades, please pull the same chart version so that kube-prometheus-stack won't be upgraded unnecessarily.\n```\nhelm pull prometheus-community/kube-prometheus-stack --version 12.12.2\nhelm dependency update\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkafkaesque-io%2Fpulsar-helm-chart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkafkaesque-io%2Fpulsar-helm-chart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkafkaesque-io%2Fpulsar-helm-chart/lists"}