# A headless service to create DNS records. apiVersion: v1 kind: Service metadata: name: {{ template "hdfs-k8s.journalnode.fullname" . }} labels: app: {{ template "hdfs-k8s.journalnode.name" . }} chart: {{ template "hdfs-k8s.subchart" . }} release: {{ .Release.Name }} annotations: # TODO: Deprecated. Replace tolerate-unready-endpoints with # v1.Service.PublishNotReadyAddresses. service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" spec: ports: - port: 8485 name: jn - port: 8480 name: http clusterIP: None selector: app: {{ template "hdfs-k8s.journalnode.name" . }} release: {{ .Release.Name }} --- apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: name: {{ template "hdfs-k8s.journalnode.fullname" . }} labels: app: {{ template "hdfs-k8s.journalnode.name" . }} chart: {{ template "hdfs-k8s.subchart" . }} release: {{ .Release.Name }} spec: selector: matchLabels: app: {{ template "hdfs-k8s.journalnode.name" . }} release: {{ .Release.Name }} minAvailable: {{ div .Values.global.journalnodeQuorumSize 2 | add1 }} --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: {{ template "hdfs-k8s.journalnode.fullname" . }} labels: app: {{ template "hdfs-k8s.journalnode.name" . }} chart: {{ template "hdfs-k8s.subchart" . }} release: {{ .Release.Name }} spec: serviceName: {{ template "hdfs-k8s.journalnode.fullname" . }} replicas: {{ .Values.global.journalnodeQuorumSize }} template: metadata: labels: app: {{ template "hdfs-k8s.journalnode.name" . }} release: {{ .Release.Name }} {{- if .Values.podAnnotations }} annotations: {{ toYaml .Values.podAnnotations | indent 8 }} {{- end }} spec: {{- if .Values.affinity }} affinity: {{ toYaml .Values.affinity | indent 8 }} {{- else if .Values.global.defaultAffinityEnabled }} affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: "app" operator: In values: - {{ template "hdfs-k8s.journalnode.name" . }} - key: "release" operator: In values: - {{ .Release.Name }} topologyKey: "kubernetes.io/hostname" {{- end }} {{- if .Values.nodeSelector }} nodeSelector: {{ toYaml .Values.nodeSelector | indent 8 }} {{- end }} {{- if .Values.tolerations }} tolerations: {{ toYaml .Values.tolerations | indent 8 }} {{- end }} containers: - name: hdfs-journalnode image: uhopper/hadoop-namenode:2.7.2 env: - name: HADOOP_CUSTOM_CONF_DIR value: /etc/hadoop-custom-conf command: ["/entrypoint.sh"] args: ["/opt/hadoop-2.7.2/bin/hdfs", "--config", "/etc/hadoop", "journalnode"] ports: - containerPort: 8485 name: jn - containerPort: 8480 name: http volumeMounts: # Mount a subpath of the volume so that the journal subdir would be # a brand new empty dir. This way, we won't get affected by # existing files in the volume top dir. - name: editdir mountPath: /hadoop/dfs/journal subPath: journal - name: editdir mountPath: /hadoop/dfs/name subPath: name - name: hdfs-config mountPath: /etc/hadoop-custom-conf readOnly: true {{- if .Values.global.kerberosEnabled }} - name: kerberos-config mountPath: /etc/krb5.conf subPath: {{ .Values.global.kerberosConfigFileName }} readOnly: true - name: kerberos-keytab-copy mountPath: /etc/security/ readOnly: true {{- end }} {{- if .Values.global.kerberosEnabled }} initContainers: - name: copy-kerberos-keytab image: busybox:1.27.1 command: ['sh', '-c'] args: - cp /kerberos-keytabs/${MY_KERBEROS_NAME}*.keytab /kerberos-keytab-copy/hdfs.keytab env: - name: MY_KERBEROS_NAME valueFrom: fieldRef: fieldPath: metadata.name volumeMounts: - name: kerberos-keytabs mountPath: /kerberos-keytabs - name: kerberos-keytab-copy mountPath: /kerberos-keytab-copy {{- end }} restartPolicy: Always volumes: - name: hdfs-config configMap: name: {{ template "hdfs-k8s.config.fullname" . }} {{- if .Values.global.kerberosEnabled }} - name: kerberos-config configMap: name: {{ template "krb5-configmap" . }} - name: kerberos-keytabs secret: secretName: {{ template "krb5-keytabs-secret" . }} - name: kerberos-keytab-copy emptyDir: {} {{- end }} {{- if .Values.global.podSecurityContext.enabled }} securityContext: runAsUser: {{ .Values.global.podSecurityContext.runAsUser }} fsGroup: {{ .Values.global.podSecurityContext.fsGroup }} {{- end }} volumeClaimTemplates: - metadata: name: editdir spec: accessModes: - {{ .Values.persistence.accessMode | quote }} resources: requests: storage: {{ .Values.persistence.size | quote }} {{- if .Values.persistence.storageClass }} {{- if (eq "-" .Values.persistence.storageClass) }} storageClassName: "" {{- else }} storageClassName: "{{ .Values.persistence.storageClass }}" {{- end }} {{- end }} {{- if .Values.persistence.selector }} selector: {{ toYaml .Values.persistence.selector | indent 10 }} {{- end }}