在kubernetes中,如何访问configmap中的环境变量?
我有一个用例将pod名称附加到“jdbc\u db\u url”属性中。位于“common configmap.config”文件中。为了实现这一目标,我遵循了以下步骤,但不幸的是无法实现 第1步: 通用configmap.config在kubernetes中,如何访问configmap中的环境变量?,kubernetes,kubernetes-helm,kubernetes-pod,Kubernetes,Kubernetes Helm,Kubernetes Pod,我有一个用例将pod名称附加到“jdbc\u db\u url”属性中。位于“common configmap.config”文件中。为了实现这一目标,我遵循了以下步骤,但不幸的是无法实现 第1步: 通用configmap.config # Database Properties jdbc_auto_commit=false jdbc_postgresql_driverClassName=org.postgresql.Driver jdbc_db_url=jdbc:postgresql://d
# Database Properties
jdbc_auto_commit=false
jdbc_postgresql_driverClassName=org.postgresql.Driver
jdbc_db_url=jdbc:postgresql://dev.postgres.database.azure.com/dbname?ApplicationName=${POD_NAME}
第二步:
使用下面的命令将configmap部署到集群中
kubectl create configmap common-configmap --from-env-file /app/conf/common-configmap.config -n default
第三步:
使用下面的清单文件创建了“myapp”容器和服务
部署清单文件:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
meta.helm.sh/release-name: master
meta.helm.sh/release-namespace: default
generation: 1
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: myapp
app.kubernetes.io/version: 4.0.0
helm.sh/chart: myapp-4.0.0
name: myapp
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
sidecar.istio.io/inject: "true"
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
spec:
containers:
- env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: myapp-configmap
- configMapRef:
name: common-configmap
image: docker.com/myapp:4.0.0
imagePullPolicy: Always
name: myapp
ports:
- containerPort: 8080
name: http
protocol: TCP
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: master
meta.helm.sh/release-namespace: default
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: myapp
app.kubernetes.io/version: 4.0.0
helm.sh/chart: myapp-4.0.0
name: myapp
namespace: default
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
sessionAffinity: None
type: ClusterIP
服务清单文件:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
meta.helm.sh/release-name: master
meta.helm.sh/release-namespace: default
generation: 1
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: myapp
app.kubernetes.io/version: 4.0.0
helm.sh/chart: myapp-4.0.0
name: myapp
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
sidecar.istio.io/inject: "true"
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
spec:
containers:
- env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: myapp-configmap
- configMapRef:
name: common-configmap
image: docker.com/myapp:4.0.0
imagePullPolicy: Always
name: myapp
ports:
- containerPort: 8080
name: http
protocol: TCP
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: master
meta.helm.sh/release-namespace: default
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: myapp
app.kubernetes.io/version: 4.0.0
helm.sh/chart: myapp-4.0.0
name: myapp
namespace: default
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
sessionAffinity: None
type: ClusterIP
验证已进入shell运行容器的结果,并打印环境变量:
kubectl exec --stdin --tty myapp-d5db776b9-h25q5 -c myapp -- /bin/sh
实际结果:
# printenv
jdbc_auto_commit=false
jdbc_postgresql_driverClassName=org.postgresql.Driver
jdbc_db_url=jdbc:postgresql://dev.postgres.database.azure.com/dbname?ApplicationName=${POD_NAME}
jdbc_auto_commit=false
jdbc_postgresql_driverClassName=org.postgresql.Driver
jdbc_db_url=jdbc:postgresql://dev.postgres.database.azure.com/dbname?ApplicationName=myapp-d5db776b9-h25q5
预期结果:
# printenv
jdbc_auto_commit=false
jdbc_postgresql_driverClassName=org.postgresql.Driver
jdbc_db_url=jdbc:postgresql://dev.postgres.database.azure.com/dbname?ApplicationName=${POD_NAME}
jdbc_auto_commit=false
jdbc_postgresql_driverClassName=org.postgresql.Driver
jdbc_db_url=jdbc:postgresql://dev.postgres.database.azure.com/dbname?ApplicationName=myapp-d5db776b9-h25q5
- 如何替换配置映射中的环境变量 部署/容器运行时?或者有没有其他方法可以 在JDBC\u URL中传递/替换pod\u名称
- 我可以知道吗,我在这件事上做错了什么
提前感谢您的帮助。您可以使用init容器来实现这一点,该容器与主容器之间具有类型为
emptyDir
的共享卷
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
meta.helm.sh/release-name: master
meta.helm.sh/release-namespace: default
generation: 1
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: myapp
app.kubernetes.io/version: 4.0.0
helm.sh/chart: myapp-4.0.0
name: myapp
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
sidecar.istio.io/inject: "true"
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
spec:
containers:
- env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: myapp-configmap
- configMapRef:
name: common-configmap
image: docker.com/myapp:4.0.0
imagePullPolicy: Always
name: myapp
command:
- bash
- -c
- export JDBC_URL=$(echo $JDBC_URL | sed "s/POD_NAME/${POD_NAME}/1")
ports:
- containerPort: 8080
name: http
protocol: TCP
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
首先,编辑部署以添加emptyDir
卷和init容器,并将卷装载到这两个容器中:
apiVersion:apps/v1
种类:部署
元数据:
注释:
deployment.kubernetes.io/revision:“1”
meta.helm.sh/release-name:master
meta.helm.sh/release-namespace:默认值
世代:1
标签:
app.kubernetes.io/instance:master
app.kubernetes.io/managed-by:Helm
app.kubernetes.io/name:myapp
app.kubernetes.io/version:4.0.0
helm.sh/chart:myapp-4.0.0
名称:myapp
名称空间:默认值
规格:
进度死线秒数:600
副本:5份
修订历史限制:10
选择器:
火柴标签:
app.kubernetes.io/instance:master
app.kubernetes.io/name:myapp
战略:
滚动更新:
最大浪涌:25%
最大不可用:25%
类型:RollingUpdate
模板:
元数据:
注释:
sidecar.istio.io/inject:“true”
标签:
app.kubernetes.io/instance:master
app.kubernetes.io/name:myapp
规格:
体积:#清空整个吊舱的IR体积
-名称:配置卷
emptyDir:{}
initContainers:#一个init容器,它将用pod名称编译env var
-名称:配置编译器
图片:bash
体积数量:
-名称:配置编译器
装载路径:/configs
环境:
-名称:POD_名称
价值来源:
fieldRef:
fieldPath:metadata.name
来自:
-configMapRef:
名称:通用配置映射
命令:
-猛击
--c
-'echo$jdbc_db_url|sed“s/POD_NAME/${POD_NAME}/”>/configs/compiled.env'
容器:
-体积数量:
-名称:配置编译器
装载路径:/configs
环境:
-名称:POD_名称
价值来源:
fieldRef:
fieldPath:metadata.name
来自:
-configMapRef:
名称:myapp configmap
-configMapRef:
名称:通用配置映射
图片:docker.com/myapp:4.0.0
imagePullPolicy:始终
名称:myapp
端口:
-集装箱港口:8080
名称:http
协议:TCP
资源:{}
DNS政策:集群优先
restartPolicy:始终
然后,您需要确保您的实际pod正在读取env vars文件-您可以通过编辑entrypoint脚本来添加一行,如下所示:
source /configs/compiled.env
或者将pod的命令编辑为如下内容:
命令:['source','/configs/compiled.env;','previous command']
以上两个都有点黑客风格——因此我建议您做的是查看应用程序默认读取的配置文件,并将编译脚本与这些文件相匹配
例如,如果您的应用程序读取/etc/myapp/confs.d/files.env
,请将空目录装载到/etc/myapp/confs.d
,并让init容器写入files.env
,并以应用程序期望的格式执行此操作(例如,如果它是ini文件而不是env文件,请编译它以使其与该格式匹配)
显然,有更好的方法来编译配置文件,而不是使用
sed
——但是,如果您想(并且能够负担得起)让事情变得简短的话,这是一个选项。简单的方法是在部署中使用一个简单的命令,假设JDBC_URL值只在示例pod中使用。否则,可以在自定义基本映像(如果有的话)或init容器中使用类似的逻辑
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
meta.helm.sh/release-name: master
meta.helm.sh/release-namespace: default
generation: 1
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: myapp
app.kubernetes.io/version: 4.0.0
helm.sh/chart: myapp-4.0.0
name: myapp
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
sidecar.istio.io/inject: "true"
labels:
app.kubernetes.io/instance: master
app.kubernetes.io/name: myapp
spec:
containers:
- env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: myapp-configmap
- configMapRef:
name: common-configmap
image: docker.com/myapp:4.0.0
imagePullPolicy: Always
name: myapp
command:
- bash
- -c
- export JDBC_URL=$(echo $JDBC_URL | sed "s/POD_NAME/${POD_NAME}/1")
ports:
- containerPort: 8080
name: http
protocol: TCP
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
请注意我插入的代码片段:
command:
- bash
- -c
- export JDBC_URL=$(echo $JDBC_URL | sed "s/POD_NAME/${POD_NAME}/1")
您是在用例中使用部署还是静态pod?如果是静态pod,则名称不会更改,并且可以在ConfigMap中使用,而不是静态pod名称。。将使用deployment处理此问题的更好方法是为部署创建一个服务(类型为ClusterIP),然后在configmap中添加服务名称,而不是pod名称。与pod名称不同的是,服务名称不会发生更改,通过这样做,您可以在以后的部署中添加更多副本。谢谢。现在,我已经使用部署和服务(类型为ClusterIP)清单创建了容器。请让我知道我需要如何引用服务名称,我还附上了部署和服务清单,您可以通过myapp.default(.)引用该服务。谢谢您的输入。在实现以下内容后,部署时发生错误:未能启动容器“myapp”:来自守护进程的错误响应:OCI运行时创建失败:容器\u linux。go:349:启动容器进程导致“exec:\“bash\”:在$PATH中找不到可执行文件:未知从中-我想象