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

标签 kubernetes kubernetes-helm kubernetes-pod

我有用例将pod名称附加到“ jdbc_db_url ”属性中。该文件位于“ common-configmap.config ”文件中。为了实现这一点,我已按照以下步骤操作,但不幸的是无法实现。
步骤1:
common-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}
步骤2:
使用以下命令将configmap部署到集群中
kubectl create configmap common-configmap --from-env-file /app/conf/common-configmap.config -n default
步骤3:
使用以下 list 文件创建“myapp”容器和服务
部署 list 文件:
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
服务 list 文件:
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
  • 我如何在配置映射中替换环境变量
    部署/容器运行时?或还有其他方法
    通过/替换中的 pod_name JDBC_URL
  • 我可以知道,在这种情况下我做错了什么?

  • 预先感谢您的帮助。

    最佳答案

    您可以使用init-container进行此操作,该容器与您的主容器之间的共享卷类型为emptyDir
    首先,编辑您的部署以添加emptyDir卷和一个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:
          volumes: # emptyDir volume for the entire pod
            - name: config-volume
              emptyDir: {}
          initContainers: # an init container that will compile the env var with the pod name
          - name: config-compiler
            image: bash
            volumeMounts:
            - name: config-compiler
              mountPath: /configs
            env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            envFrom:
            - configMapRef:
                name: common-configmap
            command: 
            - bash
            - -c
            - 'echo $jdbc_db_url | sed "s/POD_NAME/${POD_NAME}/" > /configs/compiled.env'
          containers:
          - volumeMounts:
            - name: config-compiler
              mountPath: /configs
            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
    
    然后,您需要确保您的实际Pod正在读取env vars文件-您可以通过编辑入口点脚本以添加如下一行来做到这一点:
    source /configs/compiled.env
    
    或将广告连播的命令编辑为类似以下内容:
    command: [ 'source', '/configs/compiled.env;', 'previous-command' ]
    
    上面的两者都有点漏洞-因此,我建议您做的是查看应用程序默认读取的配置文件,并使您的编译脚本与之匹配。
    例如,如果您的应用程序从/etc/myapp/confs.d/files.env读取-将空目录挂载到/etc/myapp/confs.d并将init容器写入files.env,并按照应用程序期望的格式进行操作(例如,如果它是ini文件而不是env文件,请对其进行编译它将与该格式匹配)
    显然,还有更好的方法可以使用sed来编译配置文件-但是,如果您希望(并且负担得起)使事情简短,则可以选择此方法

    关于kubernetes - 在kubernetes中,如何访问configmap中的环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64358558/

    相关文章:

    kubernetes - 构建 kubernetes 配置文件

    kubernetes - RocketChat android应用SSL连接问题

    kubernetes - 使用 RBAC API 创建用户组?

    azure - 在 Azure AKS 中实现就绪性和活跃度探测

    Python Kubernetes 客户端相当于 kubectl get pods

    node.js - 在 kubernetes 中使用 azure cosmos mongodb

    kubernetes - Gitlab Autodevops如何始终保持一个 pods 存活

    kubernetes - 如何将Kubernetes集群添加到Spinnaker

    kubernetes - 如何更改 Kubernetes 中运行的 Pod 限制?

    kubernetes - 通过 Informer 接口(interface)查看 Kubernetes Pod、命名空间和节点状态