首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将SpringBoot数组属性设置为kubernetes秘密?

如何将SpringBoot数组属性设置为kubernetes秘密?
EN

Stack Overflow用户
提问于 2022-10-26 08:28:56
回答 3查看 264关注 0票数 4

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

代码语言:javascript
运行
复制
apiVersion: v1
data:
  app.entry[0].name: {{.Values.firstEntry.name | b64enc }}
kind: Secret
metadata:
  name: my-secret
type: Opaque

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

代码语言:javascript
运行
复制
app.entry[0].name: "someName"

但是当我这样做的时候,我会发现一个错误:

代码语言:javascript
运行
复制
 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拒绝'[‘’
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-06 19:22:22

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

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

使用秘密,如:

代码语言:javascript
运行
复制
apiVersion: v1
data:
  value: {{.Values.firstEntry.name | b64enc }}
kind: Secret
metadata:
  name: my-secret
type: Opaque

然后用它和

代码语言:javascript
运行
复制
       env:
       - name: APP_ENTRY_0_NAME
         valueFrom:
           secretKeyRef:
             name: my-secret
             key: value
票数 4
EN

Stack Overflow用户

发布于 2022-11-06 17:25:41

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

例如,用以下方式定义您的k8s不透明秘密:

代码语言:javascript
运行
复制
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模板将完成此工作(请集中注意指定volumesvolumeMount的部分):

代码语言:javascript
运行
复制
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 }}

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

票数 1
EN

Stack Overflow用户

发布于 2022-11-02 18:47:37

您可以将json文件保存为秘密。

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

代码语言:javascript
运行
复制
{
  "entry": [
    {
      "name1": "data1",
      "key1": "dataX"
    },
    {
      "name2": "data2",
      "key2": "dataY"
    }
  ]
}

Step2 :从文件中创建一个秘密

代码语言:javascript
运行
复制
kubectl create secret generic data-1 --from-file=secret-data.json

第三步:将秘密附加到吊舱上

代码语言:javascript
运行
复制
env:
  - name: APP_DATA
    valueFrom:
      secretKeyRef:
        name: data-1
        key: secret-data.json

您可以通过exec将其验证为容器并检查env

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74204723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档