我想使用从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模板可以完成这项工作(请关注指定volumes
和volumeMount
的部分(:
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
来验证