Spring Boot 不会从 Kubernetes Secrets 中读取属性

问题描述 投票:0回答:1

我有

Secret
ConfigMap
ConfigMap
一切都很好,但问题是
Secret
.

所以我做的第一件事就是将属性添加为环境变量:

      containers:
        - name: {{ include "helper.app-name" . }}
          envFrom:
          - configMapRef:
              name: {{ include "helper.app-name" . }}-config
          - secretRef:
              name: {{ .Values.credentials.secretName }}

以点命名的属性,例如

my.property.name
即使在 ConfigMap 中也不起作用,这让我感到惊讶,因为几年前同样的东西工作得很好。仅当我将名称更改为
MY_PROPERTY_NAME
时它才有效,但这并不方便,因为可能有 10 或 20 个属性并且将它们转换为该格式很容易出错。

然后我决定将属性添加为 YAML 文件:

# configmaps
data:
  application-configmap.yaml: |-
     my.property.name: A Name

并按如下方式安装它们:

spec:
      volumes:
        - name: config-volume
          configMap:
            name: {{ include "helper.app-name" . }}-config
            items:
              - key: "bootstrap.yaml"
                path: "bootstrap.yaml"
              - key: "application-configmap.yaml"
                path: "application-configmap.yaml"
 ...
 containers:
     ....
          volumeMounts:
            - name: config-volume
              mountPath: "/config"
              readOnly: true
            - name: secret-volume
              mountPath: "/secret"
              readOnly: true   

现在 ConfigMap 可以工作,但 secret 不行!无论是作为环境变量还是作为文件,它都是行不通的。 (注意:我已经将活动配置文件设置为

configmap

然后做了一些调查并尝试了Spring Cloud:

implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-fabric8-config:3.0.2")

在 ConfigMap 中定义的

bootstrap.yaml
中:

    spring:
      config.import: optional:configtree:/secret
      cloud:
        kubernetes:
          reload:
            enabled: true
          secrets:
            enabled: true
            name: my-secret-config

和秘密:

# secret
metadata:
  name: my-secret-config
stringData:
  my.credentials.password: somepass

但没有运气。我在某处看到它后添加了

spring.config.import
属性,但它只是不喜欢 Secret.

请注意,我已将

Role
RoleBinding
添加到
configmaps
secrets
的读取权限。
还有一件事是,当我安装秘密时,如下所示,稍后当我检查部署的 POD 的 yaml 输出时,奇怪的是它不在那里。好像K8s忽略了它:

ServiceAccount

我到处搜索,包括 StackOverflow 和 Spring Cloud 文档,并尝试了所有方法,但没有任何效果。

有人知道这里缺少什么吗?我不喜欢使用 Spring Cloud,因为它需要更多依赖项,除非那是唯一的方法。谢谢

spring-boot kubernetes spring-cloud
1个回答
0
投票

所以首先,我将以下硬编码属性包含到我的

volumeMounts: - name: secret-volume mountPath: "/secret" readOnly: true

中,让 Spring 知道这些属性在哪里:

ConfigMap

然后我安装了我的
#configmap.yaml apiVersion: v1 data: SPRING_CONFIG_IMPORT: "file:/config/application-configmap.yaml,file:/secret/application-secret.yaml"

ConfigMap
来匹配上面的路径:
Secret

这解决了问题。所以缺少的部分是 
spec: container: volumeMounts: - name: config-volume mountPath: "/config" readOnly: true - name: secret-volume mountPath: "/secret" readOnly: true

属性,它告诉 Spring 在哪里查看额外的属性文件。

    

© www.soinside.com 2019 - 2024. All rights reserved.