Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在kubernetes中,如何访问configmap中的环境变量?_Kubernetes_Kubernetes Helm_Kubernetes Pod - Fatal编程技术网

在kubernetes中,如何访问configmap中的环境变量?

在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

我有一个用例将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://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中找不到可执行文件:未知从中-我想象