k8s:configMap 在部署中不起作用

k8s: configMap does not work in deployment

我们 运行 最近遇到了一个关于在容器内使用环境变量的问题。

OS: windows 10 亲
k8s 集群:minikube
k8s 版本: 1.18.3

1.这种方式行不通,但它是我们的首选方式

这里是 deployment.yaml 使用 'envFrom':

apiVersion: apps/v1
kind: Deployment
metadata:
  name: db
  labels:
    app.kubernetes.io/name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: db
  template:
    metadata:
      labels:
        app.kubernetes.io/name: db
    spec:
      serviceAccountName: default
      securityContext:
        {}
      containers:
        - name: db
          image: "postgres:9.4"
          ports:
            - name: http
              containerPort: 5432
              protocol: TCP
          envFrom:
            - configMapRef:
                name: db-configmap

这里是 db.properties:

POSTGRES_HOST_AUTH_METHOD=trust

第 1 步:

kubectl create configmap db-configmap ./db.properties

第 2 步:

kebuctl apply -f ./deployment.yaml

第 3 步:

kubectl get pod

运行以上命令,得到如下结果:

db-8d7f7bcb9-7l788        0/1    CrashLoopBackOff   1      9s

表示环境变量POSTGRES_HOST_AUTH_METHOD是注入的。

2。工作方式(我们不能使用这种方法)

这里是 deployment.yaml 使用 'env':

apiVersion: apps/v1
kind: Deployment
metadata:
  name: db
  labels:
    app.kubernetes.io/name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: db
  template:
    metadata:
      labels:
        app.kubernetes.io/name: db
    spec:
      serviceAccountName: default
      securityContext:
        {}
      containers:
        - name: db
          image: "postgres:9.4"
          ports:
            - name: http
              containerPort: 5432
              protocol: TCP
          env:
            - name: POSTGRES_HOST_AUTH_METHOD
              value: trust

第 1 步:

kubectl apply -f ./deployment.yaml

第 2 步:

kubectl get pod

运行以上命令,得到如下结果:

db-fc58f998d-nxgnn                   1/1        Running        0            32s

以上表示环境注入,db启动。

第一种情况我做错了什么?

提前感谢您的帮助。

更新:

提供配置图:

 kubectl describe configmap db-configmap
Name:         db-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
db.properties:
----
POSTGRES_HOST_AUTH_METHOD=trust

你是不是丢了钥匙? (请参阅下面的“键:”(无引号))而且我认为您需要提供环境变量的名称……人们通常使用键名,但您不必这样做。我在下面重复了相同的值(“POSTGRES_HOST_AUTH_METHOD”)作为环境变量名称和配置映射的键名。

  #start env .. where we add environment variables
env:
    # Define the environment variable
- name: POSTGRES_HOST_AUTH_METHOD
  #value: "UseHardCodedValueToDebugSometimes"

  valueFrom:
    configMapKeyRef:
          # The ConfigMap containing the value you want to assign to environment variable (above "name:")
      name: db-configmap 
          # Specify the key associated with the value
      key: POSTGRES_HOST_AUTH_METHOD      

我的示例(尝试使用您的值)....来自这个通用示例:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#define-container-environment-variables-using-configmap-data

pods/pod-single-configmap-env-variable.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # Define the environment variable
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name: special-config
              # Specify the key associated with the value
              key: special.how
  restartPolicy: Never

PS

您可以使用“描述”查看您的配置映射,在您(想想:))正确设置之后。

kubectl describe configmap db-configmap --namespace=IfNotDefaultNameSpaceHere

用于为用例 1 创建配置映射。请使用以下命令

kubectl create configmap db-configmap --from-env-file db.properties

看看你什么时候像你描述的那样做。

deployment# exb db-7785cdd5d8-6cstw
root@db-7785cdd5d8-6cstw:/# env | grep -i TRUST
db.properties=POSTGRES_HOST_AUTH_METHOD=trust

env 集不完全 POSTGRES_HOST_AUTH_METHOD 它实际上在 env 中使用文件名。 通过创建配置映射 kubectl create cm db-configmap --from-env-file db.properties 它实际上会将 env POSTGRES_HOST_AUTH_METHOD 放入 pod.