Kubernetes 将多个k8s秘密组合到一个env变量中
我的k8s命名空间包含一个在部署时创建的Kubernetes 将多个k8s秘密组合到一个env变量中,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我的k8s命名空间包含一个在部署时创建的Secret(通过svcat),因此这些值事先不知道 apiVersion: v1 kind: Secret type: Opaque metadata: name: my-database-credentials data: hostname: ... port: ... database: ... username: ... password: ... 部署需要以稍微不同的格式注入这些值: ... containers:
Secret
(通过svcat
),因此这些值事先不知道
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-database-credentials
data:
hostname: ...
port: ...
database: ...
username: ...
password: ...
部署
需要以稍微不同的格式注入这些值:
...
containers:
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: my-database-credentials
key: jdbc:postgresql:<hostname>:<port>/<database> // ??
- name: DATABASE_USERNAME
valueFrom:
secretKeyRef:
name: my-database-credentials
key: username
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: my-database-credentials
key: password
。。。
容器:
环境:
-名称:数据库地址
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键字:jdbc:postgresql::/??
-名称:数据库\用户名
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键字:用户名
-名称:数据库密码
价值来源:
secretKeyRef:
名称:我的数据库凭据
密钥:密码
数据库的URL
需要由主机名
,端口
,“数据库”组成,这些数据来自先前定义的机密
有没有办法写这篇作文 有几种方法可供选择(按复杂性增加的顺序):
你可以做一些我能想到的事情:
数据库URL
环境变量启动应用程序
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: your_db_container
command: [ "yourscript.sh" ]
volumeMounts:
- name: mycreds
mountPath: "/etc/credentials"
volumes:
- name: mycreds
secret:
secretName: my-database-credentials
defaultMode: 256
命令
键中传递env变量:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: your_db_container
command: [ "/bin/sh", "-c", "DATABASE_URL=jdbc:postgresql:<hostname>:<port>/<database>/$(DATABASE_USERNAME):$(DATABASE_PASSWORD) /start/yourdb" ]
env:
- name: DATABASE_USERNAME
valueFrom:
secretKeyRef:
name: my-database-credentials
key: username
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: my-database-credentials
key: password
apiVersion:v1
种类:豆荚
元数据:
姓名:mypod
规格:
容器:
-姓名:mypod
图:您的_db_容器
命令:[“/bin/sh”、“-c”、“DATABASE\u URL=jdbc:postgresql:://$(DATABASE\u USERNAME):$(DATABASE\u PASSWORD)/start/yourdb”]
环境:
-名称:数据库\用户名
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键字:用户名
-名称:数据库密码
价值来源:
secretKeyRef:
名称:我的数据库凭据
密钥:密码
Kubernetes允许您使用先前定义的环境变量作为配置中其他地方后续环境变量的一部分。从: 变量引用$(VAR_NAME)使用容器中先前定义的环境变量和任何服务环境变量展开 因此,您可以首先将所需的秘密值提取到环境变量中,然后用这些变量组成
数据库\u URL
。。。
容器:
环境:
-名称:DB\u URL\u主机名//第1部分
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键字:主机名
-名称:DB\U URL\U端口//第2部分
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键字:端口
-名称:DB\u URL\u DBNAME//第3部分
价值来源:
secretKeyRef:
名称:我的数据库凭据
关键词:数据库
-名称:数据库\u URL//combine
值:jdbc:postgresql:$(DB\u URL\u主机名):$(DB\u URL\u端口)/$(DB\u URL\u DBNAME)
...
注意用于变量扩展的圆括号
$(…)
。如果所有前置变量都定义为env变量:
- { name: DATABASE_URL, value: '{{ printf "jdbc:postgresql:$(DATABASE_HOST):$(DATABASE_PORT)/$(DB_URL_DBNAME)" }}'}
通过此语句,您还可以从values.yaml文件中引入vlaues:
例如:
如果您可能在值文件中定义了DB_URL_DBNAME:
- { name: DATABASE_URL, value: '{{ printf "jdbc:postgresql:$(DATABASE_HOST):$(DATABASE_PORT)/%s" .Values.database.DB_URL_DBNAME }}'}