Kubernetes中Quartz配置文件无法读取环境变量问题
Kubernetes中Quartz配置文件无法读取环境变量的问题
我有一个部署在Kubernetes中的Spring Boot应用,集成了Quartz调度组件。为满足多环境部署需求,已将quartz.properties存入ConfigMap实现环境隔离。
目前计划将所有密码存储到环境变量中,这种方式在Spring的application.properties中可以正常生效,但在quartz.properties里无法实现变量替换。
我参考方案使用以下格式:
org.quartz.dataSource.quartzDS.user=$@MY_ENV_VARIABLE org.quartz.dataSource.quartzDS.password=$@MY_OTHER_ENV_VARIABLE
该配置在本地Windows环境正常工作,但部署到Kubernetes(基于Ubuntu镜像)后,变量被当作字面量$@MY_ENV_VARIABLE处理。目前仅能考虑在部署流水线中通过文本替换注入明文密码,但希望实现与本地一致的效果。
补充说明:已尝试以下格式,服务器端均无效:
${MY_ENV_VARIABLE} $@MY_ENV_VARIABLE (本地PC有效) $\@MY_ENV_VARIABLE "$@MY_ENV_VARIABLE"
补充配置:
configmap.yml:
kind: ConfigMap apiVersion: v1 metadata: name: my-configmap data: application.properties: |- {{- .Files.Get "config-maps/application.properties" | nindent 8 }} myapp.properties: |- {{- .Files.Get "config-maps/myapp.properties" | nindent 8 }} logback-spring.xml: |- {{- .Files.Get "config-maps/logback-spring.xml" | nindent 8 }} quartz.properties: |- {{- .Files.Get "config-maps/quartz.properties" | nindent 8 -}}
deployment.yml:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Values.ANS_msname }} namespace: {{ .Values.ANS_NAMESPACE }} labels: app: {{ .Chart.Name }} version: {{ .Chart.Version }} spec: replicas: {{ .Values.my_ms_replicas }} strategy: type: {{ .Values.k8s_deployment_strategy }} rollingUpdate: maxUnavailable: {{ .Values.pod_maxUnavailable }} maxSurge: {{ .Values.pod_maxSurge }} minReadySeconds: {{ .Values.pod_minReadySeconds }} revisionHistoryLimit: {{ .Values.pod_revisionHistoryLimit }} selector: matchLabels: app: {{ .Chart.Name }} template: metadata: name: pod-env-var labels: app: {{ .Chart.Name }} version: {{ .Chart.Version }} spec: containers: - name: {{ .Values.ANS_msname }} image: {{ .Values.ANS_imagename }} volumeMounts: - mountPath: "/home/my/configmap/" readOnly: true name: my-conf - mountPath: "/home/my/fileshare" name: aksfs - mountPath: "/tmp" name: temp-volume imagePullPolicy: {{ .Values.k8s_imagepullpolicy }} securityContext: readOnlyRootFilesystem: true envFrom: - configMapRef: name: my-configmap resources: requests: memory: {{ .Values.my_ms_reources_requests_memory }} cpu: {{ .Values.my_ms_reources_requests_cpu }} limits: memory: {{ .Values.my_ms_reources_limits_memory }} cpu: {{ .Values.my_ms_reources_limits_cpu }} ports: - name: https containerPort: {{ .Values.SERVER_PORT }} protocol: TCP env: - name: JAVA_OPTS value: "{{ .Values.JVM_ARGS }}" - name: NAMESPACE value: "{{ .Values.ANS_NAMESPACE }}" - name: APP_NAME value: "{{ .Values.ANS_msname }}" - name: APP_VERSION value: "{{ .Chart.Version }}" - name: APP_ENV value: "{{ .Values.TARGET_ENV }}" - name: k8sClusterUrl value: "{{ .Values.k8server }}" - name: IMAGE_NAME value: "{{ .Values.ANS_imagename }}" - name: NON_HTTPPROXY_HOSTS value: "{{ .Values.NON_HTTPPROXY_HOSTS }}" - name: NON_HTTPSPROXY_HOSTS value: "{{ .Values.NON_HTTPSPROXY_HOSTS }}" - name: HTTP_PROXY_HOST value: "{{ .Values.HTTP_PROXY_HOST }}" - name: HTTPS_PROXY_HOST value: "{{ .Values.HTTPS_PROXY_HOST }}" - name: HTTPS_PROXY_PORT value: "{{ .Values.HTTPS_PROXY_PORT }}" - name: HTTP_PROXY_PORT value: "{{ .Values.HTTP_PROXY_PORT }}" - name: HTTP_PROXY_FLAG value: "{{ .Values.HTTP_PROXY_FLAG }}" - name: spring.profile value: "dev" - name: SERVICE_PROPERTIES_LOCATION value: "{{ .Values.SERVICE_PROPERTIES_LOCATION }}" - name: myapp_PROPERTIES_LOCATION value: "{{ .Values.myapp_PROPERTIES_LOCATION }}" - name: SECURITY_FILTER_YAML_LOCATION value: "{{ .Values.SECURITY_FILTER_YAML_LOCATION }}" livenessProbe: httpGet: path: /actuator/health port: {{ .Values.server_health_port }} scheme: HTTPS httpHeaders: - name: X-Custom-Header value: Alive initialDelaySeconds: {{ .Values.k8s_liveness_initialDelaySeconds }} timeoutSeconds: {{ .Values.k8s_liveness_timeoutSeconds }} periodSeconds: {{ .Values.k8s_liveness_periodSeconds }} readinessProbe: httpGet: path: /actuator/health port: {{ .Values.k8s_readinessProbe_port }} scheme: HTTPS httpHeaders: - name: X-Custom-Header value: Ready initialDelaySeconds: {{ .Values.k8s_readiness_initialDelaySeconds }} timeoutSeconds: {{ .Values.k8s_readiness_timeoutSeconds }} periodSeconds: {{ .Values.k8s_readiness_periodSeconds }} restartPolicy: Always securityContext: runAsUser: 100 runAsNonRoot: true volumes: - name: my-conf configMap: name: my-configmap items: - key: application.properties path: application.properties - key: myapp.properties path: myapp.properties - key: quartz.properties path: quartz.properties - key: logback-spring.xml path: logback-spring.xml - name: aksfs persistentVolumeClaim: claimName: {{ .Values.persistence_volume_claim_name }} - name: temp-volume emptyDir: {}
内容的提问来源于stack exchange,提问作者jase52476
相关产品推荐
相关产品推荐

