我正在使用kubectl将ASP.Net核心应用程序部署到K8S集群。目前,我对数据库的容器PORTs和ConnectionString进行了硬编码,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeploy
spec:
replicas: 1
selector:
matchLabels:
app: mydeploy
template:
metadata:
labels:
app: mydeploy
spec:
containers:
- name: mydeploy
image: harbor.com/my_app:latest
env:
- name: MyApp__ConnectionString
value: "Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password"
ports:
- containerPort: 5076
但我认为最好的解决方案是使用appsettings.json
文件(ASP.Net配置文件(中的这些变量。所以我的问题-如何从JSON文件加载这个vars并在yaml文件中使用
JSON文件如下:
{
"MyApp": {
"ConnectionString": "Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password"
},
"ClientBaseUrls": {
"MyApp": "http://mydeploy-svc:5076/api",
}
}
您可以使用以下命令创建configmap,然后将其安装到您的contianer
kubectl create configmap appsettings --from-file=appsettings.json --dry-run -o yaml
对于挂载,您应该向您的部署或sts添加一个卷,如下所示:
volumes:
- name: config
configMap:
name: appsettings
然后将其安装到您的容器:
volumeMounts:
- mountPath: /appropriate/path/to/config/appsettings.json
subPath: appsettings.json
name: config
此外,如果你愿意,你可以使用配置映射作为你的环境变量源,如下所示:
envFrom:
- configMapRef:
name: config
您可以尝试使用文字模式:
kubectl create configmap appsettings --from-literal='ConnectionString'='Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password' --from-literal='MyApp'='http://mydeploy-svc:5076/api'
如果这不起作用,您可能需要编写单独的JSON-YAML解析器。
为了更好地使用,我将所有评论作为社区wiki答案。
如果在容器中运行printenv
,请参阅:
appsettings.json={ "MyApp": { "ConnectionString": "Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password" }, "ClientBaseUrls": { "MyApp": "http://mydeploy-svc:5076/api", } }
而不是类似的:"MyApp__ConnectionString":"..."
和"ClientBaseUrls__MyApp":"..."
您应该使用--from-env-file
选项来创建configmap。
例如:kubectl create configmap appsettings --from-env-file=appsettings.json --dry-run -o yaml
和使用envFrom
,就像在后kubernetes.io/docs/tasks/configure pod container/中提到的那样。