如何将SpringBoot数组属性设置为kubernetes机密



我想使用从k8s密钥到SpringBoot属性的直接转换。因此,我有一个舵图(但与普通k8s相似(:

apiVersion: v1
data:
app.entry[0].name: {{.Values.firstEntry.name | b64enc }}
kind: Secret
metadata:
name: my-secret
type: Opaque

这样一来,我的意图是这样做,就好像我设置了spring属性文件:

app.entry[0].name: "someName"

但当我这样做的时候,我会得到一个错误:

Invalid value: "[app.entry[0].name]": a valid config key must consist of alphanumeric characters, '-', '_' or '.' (e.g. 'key.name',  or 'KEY_NAME',  or 'key-name', regex used for validation is '[-._a-zA-Z0-9]+'),

因此,[0]似乎不被允许作为机密的密钥名称。

知道如何从k8s秘密名称直接将数组条目注入spring中吗

疯狂地四处射击,我尝试了这些都失败了:

  • app.entry[0].name: ...-k8s拒绝"[">
  • app.entry__0.name: ...-k8s可以,但Spring不认为这是数组(我认为(
  • "app.entry[0].name": ...--k8s拒绝"[">
  • 'app.entry[0].name': ...--k8s拒绝"[">

您应该能够使用sprint-boot-env中描述的环境变量。

app.entry[0].name属性将使用APP_ENTRY_0_NAME环境变量设置。这可以在您的部署中设置。

使用秘密类:

apiVersion: v1
data:
value: {{.Values.firstEntry.name | b64enc }}
kind: Secret
metadata:
name: my-secret
type: Opaque

然后将其与一起使用

env:
- name: APP_ENTRY_0_NAME
valueFrom:
secretKeyRef:
name: my-secret
key: value

您可以做的是将k8s Secret中指定的application.properties文件传递给您的Spring Boot应用程序。

例如,这样定义你的k8s不透明秘密:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-secret
data:
application.properties: "app.entry[0].name={{ .Values.firstEntry.name }}"

当然,您将有更多的属性要在application.properties文件中设置,所以只需将其视为一个示例,其中包含您需要指定的条目类型,如您的问题中所述。我不是Spring Boot专家,但如果可能的话,可以告诉Spring Boot应用程序查找多个application.properties文件,这样您只需要从外部传入一些配置参数,而不需要传入所有参数。

当使用kubernetes机密作为pods中的文件时,如官方kubernete文档中所述,机密data映射中的每个密钥都将成为卷装载路径下的文件名(参见第4点(。

因此,您只需将k8s机密中定义的application.properties文件装载到运行Spring Boot应用程序的容器中即可。假设您使用helm图表中的部署模板,这里有一个示例deployment.yaml模板可以完成这项工作(请关注指定volumesvolumeMount的部分(:

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "sample.fullname" . }}
labels:
{{- include "sample.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "sample.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "sample.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "sample.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
volumeMounts:
- name: my-awesome-volume
mountPath: /path/where/springboot/app/expects/application.properties
subPath: application.properties
volumes:
- name: my-awesome-volume
secret:
secretName: my-secret
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}

根据需要,这为您提供了一个无需更改任何应用程序代码的解决方案。我希望这能让你按预期的方式前进。

您可以将json文件保存为机密

步骤1:创建需要作为机密example : secret-data.json存储的json文件

{
"entry": [
{
"name1": "data1",
"key1": "dataX"
},
{
"name2": "data2",
"key2": "dataY"
}
]
}

步骤2:从文件创建一个秘密

kubectl create secret generic data-1 --from-file=secret-data.json

步骤3:将机密附加到吊舱

env:
- name: APP_DATA
valueFrom:
secretKeyRef:
name: data-1
key: secret-data.json

您可以通过将exec放入容器并检查env来验证

最新更新