diff --git a/addons/rocketmq/.helmignore b/addons/rocketmq/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/addons/rocketmq/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/addons/rocketmq/Chart.yaml b/addons/rocketmq/Chart.yaml new file mode 100644 index 000000000..936f5893c --- /dev/null +++ b/addons/rocketmq/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: rocketmq +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "5.3.2" diff --git a/addons/rocketmq/scripts/rocketmq-start.sh b/addons/rocketmq/scripts/rocketmq-start.sh new file mode 100644 index 000000000..d7e4ad8f4 --- /dev/null +++ b/addons/rocketmq/scripts/rocketmq-start.sh @@ -0,0 +1,119 @@ +#!/bin/sh + +# shellcheck disable=SC2034 + +java -version +if [ $? -ne 0 ]; then + echo "[ERROR] Missing java runtime" + exit 50 +fi + +if [ -z "${ROCKETMQ_HOME}" ]; then + echo "[ERROR] Missing env ROCKETMQ_HOME" + exit 50 +fi +if [ -z "${ROCKETMQ_PROCESS_ROLE}" ]; then + echo "[ERROR] Missing env ROCKETMQ_PROCESS_ROLE" + exit 50 +fi + +export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) +export CLASSPATH=".:${ROCKETMQ_HOME}/conf:${ROCKETMQ_HOME}/lib/*:${CLASSPATH}" + +JAVA_OPT="${JAVA_OPT} -server" +if [ -n "$ROCKETMQ_JAVA_OPTIONS_OVERRIDE" ]; then + JAVA_OPT="${JAVA_OPT} ${ROCKETMQ_JAVA_OPTIONS_OVERRIDE}" +else + JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC" + JAVA_OPT="${JAVA_OPT} ${ROCKETMQ_JAVA_OPTIONS_EXT}" + JAVA_OPT="${JAVA_OPT} ${ROCKETMQ_JAVA_OPTIONS_HEAP}" +fi +JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}" + +export BROKER_CONF_FILE="$HOME/broker.conf" +export CONTROLLER_CONF_FILE="$HOME/controller.conf" + +update_broker_conf() { + local key=$1 + local value=$2 + sed -i "/^${key} *=/d" ${BROKER_CONF_FILE} + echo "${key} = ${value}" >> ${BROKER_CONF_FILE} +} + +init_broker_role() { + if [ "${ROCKETMQ_CONF_brokerRole}" = "SLAVE" ]; then + update_broker_conf "brokerRole" "SLAVE" + elif [ "${ROCKETMQ_CONF_brokerRole}" = "SYNC_MASTER" ]; then + update_broker_conf "brokerRole" "SYNC_MASTER" + else + update_broker_conf "brokerRole" "ASYNC_MASTER" + fi + if echo "${ROCKETMQ_CONF_brokerId}" | grep -E '^[0-9]+$'; then + update_broker_conf "brokerId" "${ROCKETMQ_CONF_brokerId}" + fi +} + +init_broker_conf() { + rm -f ${BROKER_CONF_FILE} + cp /etc/rocketmq/broker-base.conf ${BROKER_CONF_FILE} + echo "" >> ${BROKER_CONF_FILE} + echo "# generated config" >> ${BROKER_CONF_FILE} + broker_name_seq=${HOSTNAME##*-} + if [ -n "$POD_NAME" ]; then + broker_name_seq=${POD_NAME##*-} + fi + update_broker_conf "brokerName" "broker-g${broker_name_seq}" + if [ "$enableControllerMode" != "true" ]; then + init_broker_role + fi + echo "[exec] cat ${BROKER_CONF_FILE}" + cat ${BROKER_CONF_FILE} +} + +init_acl_conf() { + if [ -f /etc/rocketmq/acl/plain_acl.yml ]; then + rm -f "${ROCKETMQ_HOME}/conf/plain_acl.yml" + ln -sf "/etc/rocketmq/acl" "${ROCKETMQ_HOME}/conf/acl" + fi +} + +init_controller_conf() { + rm -f ${CONTROLLER_CONF_FILE} + cp /etc/rocketmq/base-cm/controller-base.conf ${CONTROLLER_CONF_FILE} + controllerDLegerSelfId="n${HOSTNAME##*-}" + if [ -n "$MY_POD_NAME" ]; then + controllerDLegerSelfId="n${MY_POD_NAME##*-}" + fi + sed -i "/^controllerDLegerSelfId *=/d" ${CONTROLLER_CONF_FILE} + echo "controllerDLegerSelfId = ${controllerDLegerSelfId}" >> ${CONTROLLER_CONF_FILE} + cat ${CONTROLLER_CONF_FILE} +} + +if [ "$ROCKETMQ_PROCESS_ROLE" = "broker" ]; then + init_broker_conf + init_acl_conf + set -x + java ${JAVA_OPT} org.apache.rocketmq.broker.BrokerStartup -c ${BROKER_CONF_FILE} +elif [ "$ROCKETMQ_PROCESS_ROLE" = "controller" ]; then + init_controller_conf + set -x + java ${JAVA_OPT} org.apache.rocketmq.controller.ControllerStartup -c ${CONTROLLER_CONF_FILE} +elif [ "$ROCKETMQ_PROCESS_ROLE" = "nameserver" ] || [ "$ROCKETMQ_PROCESS_ROLE" = "mqnamesrv" ]; then + set -x + if [ "$enableControllerInNamesrv" = "true" ]; then + init_controller_conf + java ${JAVA_OPT} org.apache.rocketmq.namesrv.NamesrvStartup -c ${CONTROLLER_CONF_FILE} + else + java ${JAVA_OPT} org.apache.rocketmq.namesrv.NamesrvStartup + fi +elif [ "$ROCKETMQ_PROCESS_ROLE" = "proxy" ]; then + set -x + if [ -f $RMQ_PROXY_CONFIG_PATH ]; then + java ${JAVA_OPT} org.apache.rocketmq.proxy.ProxyStartup -pc $RMQ_PROXY_CONFIG_PATH + else + java ${JAVA_OPT} org.apache.rocketmq.proxy.ProxyStartup + fi +else + echo "[ERROR] Missing env ROCKETMQ_PROCESS_ROLE" + exit 50 +fi \ No newline at end of file diff --git a/addons/rocketmq/templates/NOTES.txt b/addons/rocketmq/templates/NOTES.txt new file mode 100644 index 000000000..e69de29bb diff --git a/addons/rocketmq/templates/_helpers.tpl b/addons/rocketmq/templates/_helpers.tpl new file mode 100644 index 000000000..0f24ebf6c --- /dev/null +++ b/addons/rocketmq/templates/_helpers.tpl @@ -0,0 +1,127 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "rocketmq.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "rocketmq.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "rocketmq.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "rocketmq.labels" -}} +helm.sh/chart: {{ include "rocketmq.chart" . }} +{{ include "rocketmq.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "rocketmq.selectorLabels" -}} +app.kubernetes.io/name: {{ include "rocketmq.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "rocketmq.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "rocketmq.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Common annotations +*/}} +{{- define "rocketmq.annotations" -}} +{{ include "rocketmq.apiVersion" . }} +{{- end }} + +{{/* +API version annotation +*/}} +{{- define "rocketmq.apiVersion" -}} +kubeblocks.io/crd-api-version: apps.kubeblocks.io/v1 +{{- end }} + + +{{/* +controller +*/}} +{{- define "rocketmq.controller.fullname" -}} +{{ include "rocketmq.fullname" . }}-controller +{{- end -}} + +{{/* +controller +*/}} +{{- define "rocketmq.enableControllerInNamesrv" -}} +{{- if and .Values.controllerModeEnabled (not .Values.controller.enabled) -}} +{{- print "true" -}} +{{- else -}} +{{- print "false" -}} +{{- end -}} +{{- end -}} + +{{/* +rocketmq.controller.dlegerPeers +*/}} +{{- define "rocketmq.controller.dlegerPeers" -}} +{{- $address := list -}} + {{- $fullName := include "rocketmq.controller.fullname" . -}} + {{- $headlessDomain := printf "%s.%s.svc" $fullName .Release.Namespace -}} + {{- $replicaCount := int .Values.controller.replicaCount -}} +{{- if eq (include "rocketmq.enableControllerInNamesrv" .) "true" -}} + {{- $fullName = include "rocketmq.nameserver.fullname" . -}} + {{- $headlessDomain = printf "%s-headless.%s.svc" $fullName .Release.Namespace -}} + {{- $replicaCount = int .Values.nameserver.replicaCount -}} +{{- end -}} + {{- range $i := until $replicaCount -}} + {{- $address = printf "n%d-%s-%d.%s:9878" $i $fullName $i $headlessDomain | append $address -}} + {{- end -}} +{{- join ";" $address -}} +{{- end -}} + +{{/* +env NAMESRV_ADDR +*/}} +{{- define "rocketmq.nameserver.addr" -}} +{{- $headlessDomain := printf "svc-headless.%s.svc" .Release.Namespace -}} +{{- $address := list -}} +{{- $replicaCount := int .Values.nameserver.replicaCount -}} + {{- range $i := until $replicaCount -}} + {{- $address = printf "svc-%d.%s:9876" $i $headlessDomain | append $address -}} + {{- end -}} +{{- join ";" $address -}} +{{- end -}} diff --git a/addons/rocketmq/templates/_names.tpl b/addons/rocketmq/templates/_names.tpl new file mode 100644 index 000000000..c9cbc9a83 --- /dev/null +++ b/addons/rocketmq/templates/_names.tpl @@ -0,0 +1,65 @@ +{{/* +Define cluster definition name, if resourceNamePrefix is specified, use it as clusterDefName +*/}} +{{- define "rocketmq.clusterDefName" -}} +{{- if eq (len .Values.resourceNamePrefix) 0 -}} +rocketmq +{{- else -}} +{{- .Values.resourceNamePrefix -}} +{{- end -}} +{{- end -}} + +{{/* +Define rocketmq component definition name prefix +*/}} +{{- define "rocketmq.cmpdNamePrefix" -}} +{{- default "rocketmq" .Values.resourceNamePrefix -}}- +{{- end -}} + +{{/* +Define rocketmq component definition name +*/}} +{{- define "rocketmq.cmpdName" -}} +{{ include "rocketmq.cmpdNamePrefix" . }}{{ .Chart.Version }} +{{- end -}} + +{{/* +Define rocketmq pcr definition name +*/}} +{{- define "rocketmq.pcrName" -}} +{{ include "rocketmq.cmpdNamePrefix" . }}pcr +{{- end -}} + +{{/* +Define rocketmq pcr definition name +*/}} +{{- define "rocketmq.paramsDefName" -}} +{{ include "rocketmq.cmpdNamePrefix" . }}pd +{{- end -}} + +{{/* +Define config constriant name +*/}} +{{- define "rocketmq.configConstraintName" -}} +{{- if eq (len .Values.resourceNamePrefix) 0 -}} +rocketmq-config-constraints +{{- else -}} +{{- .Values.resourceNamePrefix -}}-config-constraints +{{- end -}} +{{- end -}} + +{{- define "rocketmq.configTplName" -}} +{{- if eq (len .Values.resourceNamePrefix) 0 -}} +rocketmq-config-template +{{- else -}} +{{- .Values.resourceNamePrefix -}}-config-template +{{- end -}} +{{- end -}} + +{{- define "rocketmq.cmScriptsName" }} +{{- if eq (len .Values.resourceNamePrefix) 0 -}} +rocketmq-scripts +{{- else -}} +{{- .Values.resourceNamePrefix -}}-scripts +{{- end -}} +{{- end -}} diff --git a/addons/rocketmq/templates/clusterdefinition.yaml b/addons/rocketmq/templates/clusterdefinition.yaml new file mode 100644 index 000000000..10a859a66 --- /dev/null +++ b/addons/rocketmq/templates/clusterdefinition.yaml @@ -0,0 +1,15 @@ +apiVersion: apps.kubeblocks.io/v1 +kind: ClusterDefinition +metadata: + name: rocketmq + labels: + {{- include "rocketmq.labels" . | nindent 4 }} + annotations: + {{- include "rocketmq.apiVersion" . | nindent 4 }} +spec: + topologies: + - name: clustermode + components: + - name: rocketmq + compDef: {{ include "rocketmq.cmpdNamePrefix" . }} + default: true \ No newline at end of file diff --git a/addons/rocketmq/templates/cmpd-broker.yaml b/addons/rocketmq/templates/cmpd-broker.yaml new file mode 100644 index 000000000..f6b83173b --- /dev/null +++ b/addons/rocketmq/templates/cmpd-broker.yaml @@ -0,0 +1,180 @@ +{{- $cmpdName := include "rocketmq.cmpdName" . -}} +{{- $labels := include "rocketmq.labels" . -}} +{{- $annotations := include "rocketmq.annotations" . -}} +{{- $configTplName := include "rocketmq.configTplName" . -}} +{{- $fullName := include "rocketmq.fullname" . -}} +{{- $masterSize := int .Values.broker.size.master -}} +{{- $replicaCount := int (add1 .Values.broker.size.replica) -}} +{{- $image := printf "%s:%s" .Values.rocketmq.repository .Values.rocketmq.tag -}} +{{- range $brokerId := until $replicaCount -}} + {{- $brokerFullName := printf "%s-broker-master" $fullName -}} + {{- $brokerRole := $.Values.broker.master.brokerRole -}} + {{- $brokerConfigKey := "broker-master.conf" -}} + {{- if gt $brokerId 0 }} + {{- $brokerFullName = printf "%s-broker-replica-id%d" $fullName $brokerId -}} + {{- $brokerRole = "SLAVE" -}} + {{- $brokerConfigKey = "broker-slave.conf" -}} + {{- end }} +--- +apiVersion: apps.kubeblocks.io/v1 +kind: ComponentDefinition +metadata: + name: {{ $cmpdName | quote }} + labels: + {{ $labels | nindent 4 }} + annotations: + {{ $annotations | nindent 4 }} +spec: + provider: kubeblocks.io + description: RocketMQ Broker is a reliable and mature messaging and streaming broker. + serviceKind: broker + serviceVersion: {{ $.Values.componentServiceVersion.controller }} + services: + - name: vip + spec: + ports: + - name: vip + port: 10909 + targetPort: vip + - name: main + spec: + ports: + - name: main + port: 10911 + targetPort: main + - name: ha + spec: + ports: + - name: ha + port: 10912 + targetPort: ha + configs: + - name: config + template: {{ $configTplName | quote }} + volumeName: rocketmq-config + namespace: {{ $.Release.Namespace }} + defaultMode: 0644 + restartOnFileChange: false + systemAccounts: + - name: root + initAccount: true + passwordGenerationPolicy: + length: 16 + numDigits: 8 + numSymbols: 0 + letterCase: MixedCases + policyRules: + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + - apiGroups: + - "" + resources: + - events + verbs: + - create + runtime: + automountServiceAccountToken: true + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: broker + topologyKey: kubernetes.io/hostname + {{- if $.Values.broker.hostNetwork }} + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + {{- else }} + dnsPolicy: {{ $.Values.broker.dnsPolicy | default "ClusterFirst" }} + {{- end }} + terminationGracePeriodSeconds: {{ $.Values.broker.terminationGracePeriodSeconds | default 30 }} + containers: + - name: broker + command: + - sh + - -c + - /rocketmq-start.sh + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: ROCKETMQ_PROCESS_ROLE + value: broker + - name: NAMESRV_ADDR + value: {{ include "rocketmq.nameserver.addr" $ }} + - name: ROCKETMQ_CONF_brokerId + value: {{ $brokerId | quote }} + - name: ROCKETMQ_CONF_brokerRole + value: {{ $brokerRole | quote }} + {{- if and $.Values.controllerModeEnabled }} + - name: enableControllerMode + value: "true" + {{- end }} + {{- with $.Values.broker.commonEnvs }} + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with $.Values.broker.extraEnvs }} + {{- toYaml . | nindent 10 }} + {{- end }} + image: {{ $.Values.rocketmq.registry | default "docker.io" }}/{{ $.Values.rocketmq.repository }}:{{ $.Values.rocketmq.tag }} + imagePullPolicy: {{ default "IfNotPresent" $.Values.rocketmq.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - sh + - -c + - sleep 5; ./mqshutdown broker + ports: + - containerPort: 10911 + name: main + protocol: TCP + - containerPort: 10912 + name: ha + protocol: TCP + - containerPort: 10909 + name: vip + protocol: TCP + volumeMounts: + - mountPath: {{ $.Values.dataMountPath }} + name: data + - mountPath: /etc/rocketmq/acl + name: rocketmq-config + - mountPath: /rocketmq-start.sh + name: rocketmq-config + subPath: rocketmq-start.sh + - mountPath: /etc/rocketmq/{{ $brokerConfigKey | quote }} + name: rocketmq-config + subPath: broker-base.conf + - mountPath: {{ $.Values.dataMountPath }}/store + name: data + subPath: store + - mountPath: {{ $.Values.dataMountPath }}/logs + name: data + subPath: logs + vars: + - name: CLUSTER_NAME + valueFrom: + clusterVarRef: + clusterName: Required + - name: CLUSTER_NAMESPACE + valueFrom: + clusterVarRef: + namespace: Required + - name: CLUSTER_COMPONENT_NAME + valueFrom: + componentVarRef: + optional: false + componentName: Required +{{- end }} \ No newline at end of file diff --git a/addons/rocketmq/templates/cmpd-controller.yaml b/addons/rocketmq/templates/cmpd-controller.yaml new file mode 100644 index 000000000..1035dd638 --- /dev/null +++ b/addons/rocketmq/templates/cmpd-controller.yaml @@ -0,0 +1,122 @@ +apiVersion: apps.kubeblocks.io/v1 +kind: ComponentDefinition +metadata: + name: {{ include "rocketmq.cmpdName" . }} + labels: + {{- include "rocketmq.labels" . | nindent 4 }} + annotations: + {{- include "rocketmq.annotations" . | nindent 4 }} +spec: + provider: kubeblocks.io + description: RocketMQ Controller is a reliable and mature messaging and streaming broker. + serviceKind: controller + serviceVersion: {{ .Values.componentServiceVersion.controller }} + services: + - name: controller + spec: + ## headless service + clusterIP: None + publishNotReadyAddresses: true + ports: + - name: main + port: 9878 + targetPort: main + configs: + - name: config + template: {{ include "rocketmq.configTplName" . }} + volumeName: rocketmq-config + namespace: {{ .Release.Namespace }} + defaultMode: 0644 + restartOnFileChange: true + systemAccounts: + - name: root + initAccount: true + passwordGenerationPolicy: + length: 16 + numDigits: 8 + numSymbols: 0 + letterCase: MixedCases + policyRules: + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + - apiGroups: + - "" + resources: + - events + verbs: + - create + runtime: + automountServiceAccountToken: true + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: controller + topologyKey: kubernetes.io/hostname + containers: + - name: controller + command: + - sh + - -c + - /rocketmq-start.sh + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: ROCKETMQ_PROCESS_ROLE + value: controller + - name: CONTROLLER_CONF_FILE + value: /etc/rocketmq/controller.conf + image: {{ .Values.rocketmq.registry | default "docker.io" }}/{{ .Values.rocketmq.repository }}:{{ .Values.rocketmq.tag }} + imagePullPolicy: {{ default "IfNotPresent" .Values.rocketmq.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - sh + - -c + - sleep 5; ./mqshutdown controller + ports: + - containerPort: 9878 + name: main + protocol: TCP + volumeMounts: + - mountPath: {{ .Values.dataMountPath }} + name: data + - mountPath: /etc/rocketmq/base-cm + name: rocketmq-config + - mountPath: /rocketmq-start.sh + name: rocketmq-config + subPath: rocketmq-start.sh + - mountPath: {{ .Values.dataMountPath }}/controller-data + name: data + subPath: controller-data + - mountPath: {{ .Values.dataMountPath }}/logs + name: data + subPath: logs + vars: + - name: CLUSTER_NAME + valueFrom: + clusterVarRef: + clusterName: Required + - name: CLUSTER_NAMESPACE + valueFrom: + clusterVarRef: + namespace: Required + - name: CLUSTER_COMPONENT_NAME + valueFrom: + componentVarRef: + optional: false + componentName: Required diff --git a/addons/rocketmq/templates/cmpd-nameserver.yaml b/addons/rocketmq/templates/cmpd-nameserver.yaml new file mode 100644 index 000000000..c4b2b3861 --- /dev/null +++ b/addons/rocketmq/templates/cmpd-nameserver.yaml @@ -0,0 +1,130 @@ +apiVersion: apps.kubeblocks.io/v1 +kind: ComponentDefinition +metadata: + name: {{ include "rocketmq.cmpdName" . }} + labels: + {{- include "rocketmq.labels" . | nindent 4 }} + annotations: + {{- include "rocketmq.annotations" . | nindent 4 }} +spec: + provider: kubeblocks.io + description: RocketMQ Nameserver is a reliable and mature messaging and streaming broker. + serviceKind: nameserver + serviceVersion: {{ .Values.componentServiceVersion.nameserver }} + services: + - name: svc-headless + spec: + ## headless service + clusterIP: None + publishNotReadyAddresses: true + ports: + - name: main + port: 9876 + targetPort: main + - name: svr + spec: + ports: + - name: main + port: 9876 + targetPort: main + configs: + - name: config + template: {{ include "rocketmq.configTplName" . }} + volumeName: rocketmq-config + namespace: {{ .Release.Namespace }} + defaultMode: 0644 + restartOnFileChange: true + systemAccounts: + - name: root + initAccount: true + passwordGenerationPolicy: + length: 16 + numDigits: 8 + numSymbols: 0 + letterCase: MixedCases + policyRules: + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + - apiGroups: + - "" + resources: + - events + verbs: + - create + runtime: + automountServiceAccountToken: true + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: nameserver + topologyKey: kubernetes.io/hostname + containers: + - name: nameserver + command: + - /bin/sh + - -c + - /rocketmq-start.sh + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: ROCKETMQ_PROCESS_ROLE + value: nameserver + {{- if eq (include "rocketmq.enableControllerInNamesrv" $) "true" }} + - name: enableControllerInNamesrv + value: "true" + {{- end }} + image: {{ .Values.rocketmq.registry | default "docker.io" }}/{{ .Values.rocketmq.repository }}:{{ .Values.rocketmq.tag }} + imagePullPolicy: {{ default "IfNotPresent" .Values.rocketmq.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - sh + - -c + - sleep 5; ./mqshutdown namesrv + ports: + - containerPort: 9876 + name: main + protocol: TCP + volumeMounts: + - mountPath: {{ .Values.dataMountPath }} + name: data + - mountPath: /etc/rocketmq/base-cm + name: rocketmq-config + - mountPath: /rocketmq-start.sh + name: rocketmq-config + subPath: rocketmq-start.sh + - mountPath: {{ .Values.dataMountPath }}/controller-data + name: data + subPath: controller-data + - mountPath: {{ .Values.dataMountPath }}/logs + name: data + subPath: logs + vars: + - name: CLUSTER_NAME + valueFrom: + clusterVarRef: + clusterName: Required + - name: CLUSTER_NAMESPACE + valueFrom: + clusterVarRef: + namespace: Required + - name: CLUSTER_COMPONENT_NAME + valueFrom: + componentVarRef: + optional: false + componentName: Required diff --git a/addons/rocketmq/templates/cmpd-proxy.yaml b/addons/rocketmq/templates/cmpd-proxy.yaml new file mode 100644 index 000000000..fe04ff50b --- /dev/null +++ b/addons/rocketmq/templates/cmpd-proxy.yaml @@ -0,0 +1,113 @@ +apiVersion: apps.kubeblocks.io/v1 +kind: ComponentDefinition +metadata: + name: {{ include "rocketmq.cmpdName" . }} + labels: + {{- include "rocketmq.labels" . | nindent 4 }} + annotations: + {{- include "rocketmq.annotations" . | nindent 4 }} +spec: + provider: kubeblocks.io + description: RocketMQ Proxy is a reliable and mature messaging and streaming broker. + serviceKind: proxy + serviceVersion: {{ .Values.componentServiceVersion.nameserver }} + services: + - name: svr + spec: + ports: + - name: main + port: 8080 + targetPort: main + - name: grpc + port: 8080 + targetPort: grpc + configs: + - name: config + template: {{ include "rocketmq.configTplName" . }} + volumeName: rocketmq-config + namespace: {{ .Release.Namespace }} + defaultMode: 0644 + restartOnFileChange: true + policyRules: + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + - apiGroups: + - "" + resources: + - events + verbs: + - create + runtime: + automountServiceAccountToken: true + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: proxy + topologyKey: kubernetes.io/hostname + containers: + - name: proxy + command: + - /bin/sh + - -c + - /rocketmq-start.sh + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: NAMESRV_ADDR + value: {{ include "rocketmq.nameserver.addr" $ }} + - name: ROCKETMQ_PROCESS_ROLE + value: proxy + - name: RMQ_PROXY_CONFIG_PATH + value: /etc/rocketmq/base-cm/proxy.json + image: {{ .Values.rocketmq.registry | default "docker.io" }}/{{ .Values.rocketmq.repository }}:{{ .Values.rocketmq.tag }} + imagePullPolicy: {{ default "IfNotPresent" .Values.rocketmq.pullPolicy }} + lifecycle: + preStop: + exec: + command: + - sh + - -c + - sleep 5; ./mqshutdown proxy + ports: + - containerPort: 8080 + name: main + protocol: TCP + - containerPort: 8081 + name: grpc + protocol: TCP + volumeMounts: + - mountPath: {{ .Values.dataMountPath }} + name: data + - mountPath: /etc/rocketmq/base-cm + name: rocketmq-config + - mountPath: /rocketmq-start.sh + name: rocketmq-config + subPath: rocketmq-start.sh + vars: + - name: CLUSTER_NAME + valueFrom: + clusterVarRef: + clusterName: Required + - name: CLUSTER_NAMESPACE + valueFrom: + clusterVarRef: + namespace: Required + - name: CLUSTER_COMPONENT_NAME + valueFrom: + componentVarRef: + optional: false + componentName: Required diff --git a/addons/rocketmq/templates/cmpv.yaml b/addons/rocketmq/templates/cmpv.yaml new file mode 100644 index 000000000..2ed15df2f --- /dev/null +++ b/addons/rocketmq/templates/cmpv.yaml @@ -0,0 +1,21 @@ +apiVersion: apps.kubeblocks.io/v1 +kind: ComponentVersion +metadata: + name: rocketmq + labels: + {{- include "rocketmq.labels" . | nindent 4 }} + annotations: + {{- include "rocketmq.apiVersion" . | nindent 4 }} +spec: + compatibilityRules: + - compDefs: + - {{ include "rocketmq.cmpdNamePrefix" . }} + releases: + - 5.3.2 + releases: + - name: 5.3.2 + changes: + serviceVersion: 5.3.2 + images: + rocketmq: {{ .Values.rocketmq.registry | default "docker.io" }}/{{ .Values.rocketmq.repository }}:5.3.2 + dashboard: {{ .Values.dashboard.registry | default "docker.io" }}/{{ .Values.dashboard.repository }}:1.0.0 diff --git a/addons/rocketmq/templates/config-template.yaml b/addons/rocketmq/templates/config-template.yaml new file mode 100644 index 000000000..9ac51c4ac --- /dev/null +++ b/addons/rocketmq/templates/config-template.yaml @@ -0,0 +1,49 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "rocketmq.name" . }}-config-template + labels: + {{- include "rocketmq.labels" . | nindent 4 }} +data: + rocketmq-start.sh: |- + {{- .Files.Get "scripts/rocketmq-start.sh" | nindent 4 }} + broker-base.conf: | +{{- if and .Values.controllerModeEnabled }} + enableControllerMode = true + controllerAddr = {{ include "rocketmq.broker.controllerAddr" . }} +{{- end }} + brokerClusterName = {{ .Values.clusterName }} + controller-base.conf: | +{{- if eq (include "rocketmq.enableControllerInNamesrv" $) "true" }} + enableControllerInNamesrv = true +{{- end }} + controllerDLegerPeers = {{ include "rocketmq.controller.dlegerPeers" $ }} + controllerStorePath = {{ .Values.dataMountPath }}/controller-data + proxy.json: | + { + "rocketMQClusterName": "{{ .Values.clusterName }}" + } + plain_acl.yml: | + globalWhiteRemoteAddresses: + - '*' + - 10.*.*.* + - 192.*.*.* + - 172.*.*.* + accounts: + - accessKey: rocketmq-admin + secretKey: 83b97695ae26e650fda34914554bfa09 + whiteRemoteAddress: 192.*.*.* + # if it is admin, it could access all resources + admin: true + +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "rocketmq.name" . }}-env-tpl + labels: + {{- include "rocketmq.labels" . | nindent 4 }} +data: + env: |- + {{- .Files.Get "config/rocketmq-env.tpl" | nindent 4 }} diff --git a/addons/rocketmq/values.yaml b/addons/rocketmq/values.yaml new file mode 100644 index 000000000..768f32759 --- /dev/null +++ b/addons/rocketmq/values.yaml @@ -0,0 +1,76 @@ +# Default values for rocketmq. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +rocketmq: + enableControllerInNamesrv: true + registry: docker.io + repository: apache/rocketmq + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: 5.3.2 + +dashboard: + registry: docker.io + repository: apacherocketmq/rocketmq-dashboard + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: 1.0.0 + +componentServiceVersion: + controller: 5.3.2 + broker: 5.3.2 + nameserver: 5.3.2 + dashboard: 5.3.2 + +nameOverride: "" + +fullnameOverride: "" + +## Authentication parameters +## +auth: + ## @param auth.password Password for the "rocketmq" admin user, leave empty + ## for random generated password. + ## + password: + ## @param auth.database Name for a custom database to create + ## + database: "admin" + +logConfigs: + running: /data/rocketmq/logs/rocketmq.log* + +logCollector: + enabled: false + +dataMountPath: /var/lib/rocketmq + + +## @param enabledClusterVersions specifies the enabled cluster versions, if not set, all cluster versions are enabled +## and will be rendered, installed. Otherwise, only the specified cluster versions will be rendered and installed. +## Example: +## --set "enabledClusterVersions={rabbitmq}" +## --set enabledClusterVersions='' # this will enable all cluster versions +## --set enabledClusterVersions={} # this will disable all cluster versions, the enabledClusterVersions has an empty +## # value and the length is 1 +enabledClusterVersions: [ ] + +## @param resourceNamePrefix Prefix for all resources name created by this chart, that can avoid name conflict +## if you install multiple releases of this chart. +## If specified, the cluster definition will use it as name. +resourceNamePrefix: "rocketmq" + +controller: + replicaCount: 3 + +nameserver: + replicaCount: 2 + +broker: + size: + master: 1 + replica: 0 + + master: + brokerRole: ASYNC_MASTER \ No newline at end of file