简单记录一下ConfigMap使用的一个小坑。最近演示项目,需要用ArgoCD部署一个demo的app,app需要从一个.net 的pod连接另外一个postgres的pod。
ConfigMap 主要就是两种用途,一个是作为配置文件通过volume来挂载,一个是作为环境变量通过envFrom来传入变量值。下面看看具体使用例子
下面是相关的manifest文件
首先是dotnet的配置文件
dotnet-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: template-service-app-settings
data:
appsettings.json: |-
{
"ConnectionStrings": {
"WebApiDatabase": "Host=template-service-postgres; Port=5432; SearchPath=template; Username=postgres; Password=Template"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
dotnet-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: template-service
annotations:
kubernetes.io/ingress.class: addon-http-application-routing
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: template-service
port:
number: 80
dotnet-svc.yml
apiVersion: v1
kind: Service
metadata:
name: template-service
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 7000
selector:
name: template-service
dotnet.yml 这里注意使用了subpath的方式来挂载一个文件,而不是整个挂载到/app上,不然会覆盖掉他原先的其他的文件,无法启动
apiVersion: apps/v1
kind: Deployment
metadata:
name: template-service
spec:
selector:
matchLabels:
name: template-service
template:
metadata:
labels:
name: template-service
spec:
containers:
- name: template-service
image: gitlabazuredemo.azurecr.io/template_service_app:latest
imagePullPolicy: Always
workingDir: /app
volumeMounts:
- name: template-service-app-settings
mountPath: /app/appsettings.json
subPath: appsettings.json
ports:
- containerPort: 7000
volumes:
- name: template-service-app-settings
configMap:
name: template-service-app-settings
然后是postgres的配置
postgres-configmap.yml, 这个configmap作为环境变量传入
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: Template
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-initdb-config
data:
initdb.sql: |
CREATE SCHEMA template;
SET search_path TO template;
CREATE TABLE template_data (
id serial PRIMARY KEY,
username VARCHAR ( 255 ) UNIQUE NOT NULL,
email VARCHAR ( 255 ) UNIQUE NOT NULL
);
INSERT INTO template_data(username, email) VALUES ('John Doe', '[email protected]');
apiVersion: v1
kind: Service
metadata:
name: template-service-postgres
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
selector:
name: template-service-postgres
apiVersion: apps/v1
kind: Deployment
metadata:
name: template-service-postgres
spec:
selector:
matchLabels:
name: template-service-postgres
template:
metadata:
labels:
name: template-service-postgres
spec:
containers:
- name: template-service-postgres
image: postgres
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- name: postgres-initdb
mountPath: /docker-entrypoint-initdb.d
volumes:
- name: postgres-initdb
configMap:
name: postgres-initdb-config