我是kubernetes的新手,我想知道将值注入ConfigMap的最佳方法。
现在,我定义了Deployment对象,该对象从ConfigMap文件中获取相关值。我希望在生产和暂存环境中使用相同的.yml
文件。因此只有configMap中的值会被更改,而文件本身将是相同的。
在不使用配置管理工具(例如Ansible,puppet等)的情况下,有没有办法在kubernetes中内置它?
答案 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)传递命令行参数。