# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # apiVersion: apps/v1 kind: StatefulSet metadata: name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}" namespace: {{ .Values.namespace }} labels: app: {{ template "pulsar.name" . }} chart: {{ template "pulsar.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} component: {{ .Values.bookkeeper.component }} cluster: {{ template "pulsar.fullname" . }} spec: serviceName: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}" replicas: {{ .Values.bookkeeper.replicaCount }} selector: matchLabels: app: {{ template "pulsar.name" . }} release: {{ .Release.Name }} component: {{ .Values.bookkeeper.component }} updateStrategy: {{ toYaml .Values.bookkeeper.updateStrategy | indent 4 }} podManagementPolicy: {{ .Values.bookkeeper.podManagementPolicy }} template: metadata: labels: app: {{ template "pulsar.name" . }} release: {{ .Release.Name }} component: {{ .Values.bookkeeper.component }} cluster: {{ template "pulsar.fullname" . }} annotations: {{ toYaml .Values.bookkeeper.annotations | indent 8 }} spec: {{- if .Values.bookkeeper.nodeSelector }} nodeSelector: {{ toYaml .Values.bookkeeper.nodeSelector | indent 8 }} {{- end }} {{- if .Values.bookkeeper.tolerations }} tolerations: {{ toYaml .Values.bookkeeper.tolerations | indent 8 }} {{- end }} affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: "app" operator: In values: - "{{ template "pulsar.name" . }}" - key: "release" operator: In values: - {{ .Release.Name }} - key: "component" operator: In values: - {{ .Values.bookkeeper.component }} topologyKey: "kubernetes.io/hostname" terminationGracePeriodSeconds: {{ .Values.bookkeeper.gracePeriod }} initContainers: # This init container will wait for zookeeper to be ready before # deploying the bookies - name: wait-zookeeper-ready image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} command: ["sh", "-c"] args: - >- until bin/pulsar zookeeper-shell -server {{ template "pulsar.fullname" . }}-{{ .Values.zookeeper.component }} ls /admin/clusters/{{ template "pulsar.fullname" . }}; do sleep 3; done; # This initContainer will make sure that the bookeeper # metadata is in zookeeper - name: pulsar-bookkeeper-metaformat image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} command: ["sh", "-c"] args: - > bin/apply-config-from-env.py conf/bookkeeper.conf && bin/bookkeeper shell metaformat --nonInteractive || true; envFrom: - configMapRef: name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}" containers: - name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}" image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} {{- if .Values.bookkeeper.resources }} resources: {{ toYaml .Values.bookkeeper.resources | indent 10 }} {{- end }} command: ["sh", "-c"] args: - > bin/apply-config-from-env.py conf/bookkeeper.conf && bin/apply-config-from-env.py conf/pulsar_env.sh && bin/pulsar bookie ports: - name: client containerPort: 3181 envFrom: - configMapRef: name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}" volumeMounts: - name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.journal.name }}" mountPath: /pulsar/data/bookkeeper/journal - name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.ledgers.name }}" mountPath: /pulsar/data/bookkeeper/ledgers {{- if not .Values.persistence }} volumes: - name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.journal.name }}" emptyDir: {} - name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.ledgers.name }}" emptyDir: {} {{- end }} {{- if .Values.persistence }} volumeClaimTemplates: - metadata: name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.journal.name }}" spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: {{ .Values.bookkeeper.volumes.journal.size }} {{- if .Values.bookkeeper.volumes.journal.storageClassName }} storageClassName: "{{ .Values.bookkeeper.volumes.journal.storageClassName }}" {{- else if .Values.bookkeeper.volumes.journal.storageClass }} storageClassName: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.journal.name }}" {{- end }} - metadata: name: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.ledgers.name }}" spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: {{ .Values.bookkeeper.volumes.ledgers.size }} {{- if .Values.bookkeeper.volumes.ledgers.storageClassName }} storageClassName: "{{ .Values.bookkeeper.volumes.ledgers.storageClassName }}" {{- else if .Values.bookkeeper.volumes.ledgers.storageClass }} storageClassName: "{{ template "pulsar.fullname" . }}-{{ .Values.bookkeeper.component }}-{{ .Values.bookkeeper.volumes.ledgers.name }}" {{- end }} {{- end }}