kubernetes /将值注入configMap的最佳实践

时间:2018-07-30 12:10:03

标签: kubernetes

我是kubernetes的新手,我想知道将值注入ConfigMap的最佳方法。

现在,我定义了Deployment对象,该对象从ConfigMap文件中获取相关值。我希望在生产和暂存环境中使用相同的.yml文件。因此只有configMap中的值会被更改,而文件本身将是相同的。

在不使用配置管理工具(例如Ansible,puppet等)的情况下,有没有办法在kubernetes中内置它?

3 个答案:

答案 0 :(得分:2)

您还创建了configmap

kubectl create configmap special-config \
    --from-env-file=configure-pod-container/configmap/kubectl/game-env-file.properties

并在容器中访问它

apiVersion: v1
kind: Pod
metadata:
   name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never

答案 1 :(得分:1)

您可以在答案的末尾找到引用文字的链接。

  

编写应用程序时的一个好习惯是将应用程序代码与配置分开。我们希望使应用程序作者能够轻松地在Kubernetes中采用这种模式。尽管Secrets API允许从应用程序中分离诸如凭据和密钥之类的信息,但是对于普通的非秘密配置,过去没有对象。在Kubernetes 1.2中,我们添加了一个名为ConfigMap的新API资源来处理这种类型的配置数据。

     

此外,Secrets数据将以base64编码形式存储,这也适用于诸如密钥之类的二进制数据,而ConfigMaps数据将以纯文本格式存储,这对于文本文件来说是很好的。

ConfigMap API在概念上很简单。从数据角度来看,ConfigMap类型只是一组键值对。

有几种创建配置映射的方法:

  • 在命令行中使用值列表

    $ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
    
  • 使用磁盘上的文件作为数据源

    $ kubectl create configmap game-config-2 --from-file=docs/user-guide/configmap/kubectl/game.properties --from-file=docs/user-guide/configmap/kubectl/ui.properties
    $ kubectl create configmap game-config-3 --from-file=game-special-key=docs/user-guide/configmap/kubectl/game.properties
    
  • 使用包含文件的目录作为数据源

    $ kubectl create configmap game-config --from-file=configure-pod-container/configmap/kubectl/
    
  • 结合所有前面提到的三种方法

有几种方法可以在Pods中使用ConfigMap数据

  • 将ConfigMap中的值用作环境变量

    spec:
      containers:
        - name: test-container
          image: k8s.gcr.io/busybox
          command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY)" ]
          env:
            - name: SPECIAL_LEVEL_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: SPECIAL_LEVEL
    
  • 将ConfigMap中的数据用作卷上的文件

    spec:
      containers:
        - name: test-container
          image: k8s.gcr.io/busybox
          command: [ "/bin/sh", "-c", "ls /etc/config/" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            # ConfigMap containing the files
            name: special-config
    
  

在卷中使用的ConfigMap中的仅更改将在运行的pod内可见。 Kubelet正在检查是否在每个定期同步中都重新安装已安装的ConfigMap。但是,它使用其基于本地ttl的缓存来获取ConfigMap的当前值。结果,从更新ConfigMap到将新密钥投射到Pod的时间的总延迟可能与kubelet同步时间+ kubelet中ConfigMaps缓存的ttl一样。

在规范中包含对不存在的ConfigMap或Secrets的任何引用的Pod将不会启动。

考虑阅读官方文档和其他好的文章以获取更多详细信息:

答案 2 :(得分:0)

如果您想使用ansible,那么我怀疑您会为此而想看helm。我认为kubernetes本身不会解决这个问题,但掌舵是kubernetes项目。

如果我理解正确,则您有一个configmap yaml文件,并且希望使用一组用于登台的值和一个用于生产的值来部署它。

一种自然的方法是保留文件的两个副本,并在名称上附加“ -staging”和“ -prod”,并让CI为要部署到的环境选择一个副本。或者,您可以在CI中使用一个Shell脚本,对要为环境切换的特定值进行sed /替换。

使用头盔,您可以在部署时或通过参数文件(values.yaml)传递命令行参数。