我有
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,因为它需要更多依赖项,除非那是唯一的方法。谢谢
所以首先,我将以下硬编码属性包含到我的
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 在哪里查看额外的属性文件。