k8s: 在deployment中configMap不起作用

9
我们最近遇到了一个使用容器内环境变量的问题。 操作系统: Windows 10 Pro
k8s集群: Minikube
k8s版本: 1.18.3

1. 不起作用的方法,虽然这是我们首选的方法 下面是使用 'envFrom' 的 deployment.yaml 文件:
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

步骤二:

kebuctl apply -f ./deployment.yaml

步骤三:

kubectl get pod

运行上述命令,得到以下结果:
db-8d7f7bcb9-7l788        0/1    CrashLoopBackOff   1      9s

这表明环境变量POSTGRES_HOST_AUTH_METHOD未被注入。

2. 这种方式是可行的(但我们不能采用这种方法)

下面是使用“env”选项的deployment.yaml文件:

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

步骤二:
kubectl get pod

运行上述命令,获得以下结果:

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

以上表明环境被注入,以便启动数据库。

在第一个案例中,我做错了什么?

提前感谢您的帮助。

更新:

提供配置映射:

 kubectl describe configmap db-configmap

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

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


你能否用实际文本的复制/粘贴替换你的截图?这有助于寻找类似错误的人(在SO上也有一定程度的辅助性)。 - c-x-berger
3个回答

9
创建用于 usecase-1 的配置映射,请使用以下命令:
kubectl create configmap db-configmap --from-env-file db.properties

1
这个可以工作。标记为解决方案。我没有意识到有一个专门用于环境变量的单独选项--from-env-file。 - zeisen

0
你是否遗漏了关键部分?(请参考下面的“key:”(不含引号))此外,我认为你需要提供env-variable的名称...人们通常使用key-name,但你并不一定要这样做。我已在下面将相同的值(“POSTGRES_HOST_AUTH_METHOD”)重复作为环境变量名称和配置映射的keyname。
  #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

提示

你可以使用 "describe" 命令来查看你的配置映射,确认你已经正确地设置了它。

kubectl describe configmap db-configmap --namespace=IfNotDefaultNameSpaceHere

@grandaCoder,感谢您的快速回复。正如我在帖子中提到的那样,使用“env”是可行的,无论您使用“name/value”还是像您一样使用“name/valueFrom”,但我们更希望使用“envFrom”作为更通用的解决方案。这样,它将与属性文件中的任何环境变量一起使用。 - zeisen
你是在谈论使用容器构建的属性文件吗?我认为你可能没有理解配置映射和k8机密的重点。这是处理配置值的方法,而不是将这些值嵌入到容器中。将机密嵌入容器是一种可怕的做法。https://techbeacon.com/devops/how-keep-your-container-secrets-secure - granadaCoder
@grandaCoder,意图是通过configMap将配置文件中的数据注入到k8s容器中。这些都是非机密配置数据。另外,我不确定你说的将值烘焙进容器是什么意思。如果我尝试实现的方法不是注入容器数据的正确方法,请告诉我最佳实践是什么。 - zeisen
将configmap和/或secrets推入kubernetes系统。可能会针对每个环境(dev、QA、staging、production)设置这些值。然后构建需要配置值的容器。容器不包含内置到容器中的配置值或secrets。但是容器知道如何查找/读取配置值和secrets。容器查找配置值/ secrets的位置是kubernetes挂载值的地方...由yml指定..通常有两种方式。 - granadaCoder
非常感谢您提供的详细解释。我相信我们所尝试实现的与您所描述的是一致的。唯一的区别是,我们已经做出了明智的决定,选择不采用卷挂载,而是在创建Pod时将配置数据注入到容器中。我非常感激您的帮助。至于这个反对投票,我并不确定。 - zeisen
显示剩余2条评论

0

看看你描述的方式如何实现。

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

环境设置并不是完全基于POSTGRES_HOST_AUTH_METHOD,实际上它会在环境变量中读取文件名。 通过以下命令创建configmap: kubectl create cm db-configmap --from-env-file db.properties 这将在pod中实际上将POSTGRES_HOST_AUTH_METHOD设置为环境变量。


谢谢你的回答。看到环境变量不是预期格式很有趣,但在我的情况下确实有效。如果我采用这种方法需要注意什么,请告诉我。 - zeisen
我认为在生产环境中这样使用Postgres的整个想法都不太好。即使我在测试环境中运行它,它也会给我一个警告,告诉我不应该这样做。此外,你打算如何持久化数据?高可用性呢?主从? - Abhi Gadroo
我在示例中使用Postgres来说明我发布的问题。实际上,我们只是在云中使用托管的数据库服务。 - zeisen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接