我想使用从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: ...
"app.entry[0].name": ...
- k8s拒绝'[‘’'app.entry[0].name': ...
- k8s拒绝'[‘’发布于 2022-11-06 19:22:22
您应该能够使用环境变量,如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
发布于 2022-11-06 17:25:41
您可以做的是将在application.properties秘密中指定的k8s文件传递给您的Spring应用程序。
例如,用以下方式定义您的k8s不透明秘密:
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-secret
data:
application.properties: "app.entry[0].name={{ .Values.firstEntry.name }}"
当然,您还需要在application.properties
文件中设置更多的属性,因此,只需将此作为一个示例,说明您需要指定的条目类型,如您的问题中所述。我不是Spring专家,但是可以(如果可能的话)告诉Spring应用程序查找多个application.properties文件,这样您只需要从外部传递一些配置参数,而不是所有参数。
当将kubernetes秘密作为kubernetes官方文件中指定的文件使用时,秘密data
映射中的每个键都会成为卷挂载路径下的文件名(参见第4点)。
因此,您只需将在application.properties秘密中定义的k8s文件挂载到运行Spring应用程序的容器中。假设您使用了舵图中的部署模板,下面是一个示例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 }}
如所需,这将为您提供一个无需更改任何应用程序代码的解决方案。我希望这能让你按预期的方式前进。
发布于 2022-11-02 18:47:37
您可以将json文件保存为秘密。
步骤1:创建json文件,该文件需要作为秘密example : secret-data.json
存储
{
"entry": [
{
"name1": "data1",
"key1": "dataX"
},
{
"name2": "data2",
"key2": "dataY"
}
]
}
Step2 :从文件中创建一个秘密
kubectl create secret generic data-1 --from-file=secret-data.json
第三步:将秘密附加到吊舱上
env:
- name: APP_DATA
valueFrom:
secretKeyRef:
name: data-1
key: secret-data.json
您可以通过exec
将其验证为容器并检查env
。
https://stackoverflow.com/questions/74204723
复制相似问题