使用ConfigMap
很多应用程序的配置需要通过配置文件,命令行参数和环境变量的组合配置来完成。这些配置应该从image内容中解耦,以此来保持容器化应用程序的便携性。ConfigMap API资源提供了将配置数据注入容器的方式,同时保持容器是不知道Kubernetes的。ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
ConfigMap总览
ConfigMap API资源保持键-值对配置数据,这个数据可以在pods里使用,或者被用来为像controller一样的系统组件存储配置数据。虽然ConfigMap跟Secrets类似,但是configmap可以更方便的处理不包含敏感信息的字符串
让我们来看看完成的例子吧:
data 一栏包括了配置数据。就如同你们看到的那样,ConfigMap可以被用来保存单个属性,也可以用来保存一个配置文件。
配置数据可以通过很多种方式在Pods里被使用。ConfigMaps可以被用来:
1、 设置环境变量的值
2、 在容器里设置命令行参数
3、 在数据卷里面创建config文件
用户和系统组件两者都可以在ConfigMap里面存储配置数据。
创建ConfigMaps
你可以使用 kubectl create configmap 命令轻松从文字值、文件或者目录来创建ConfigMaps。
让我们来看一看创建ConfigMap的很多不同的方法吧:
从目录创建
现在我们已经有一个包含一些文件的目录,它已经包含了我们想要设置ConfigMaps的数据:
kubectl create configmap命令可以被用来创建ConfigMap来存储这个目录里面每个文件的内容:
当--from-file指向目录的时候,每个在目录底下的所有文件会被用在ConfigMap里面创建一个键值对,键的名字就是文件名,值就是文件的内容。
让我们来看一下这个命令创建的ConfigMap:
你可以看到在映射里面的两个是从kubectl指定的目录中创建的文件名。这些键的内容可能会很大,所以在kubectl describe的输出中,你只能够看到键的名字和他们的大小。
如果我们想要看到键的值的话,我们可以仅仅只是kubectl get资源:
从文件创建
我们也可以传递给--from-file一个特定文件,并且多次传递到kubectl。以下命令跟上文例子中的结果是一样的:
我们也可以用 --from-file 通过传递 key=value为个别文件设置键来使用:
--from-file=game-special-key=docs/user-guide/configmap/kubectl/game.properties
从字面值创建
为ConfigMap使用kubectl create configmap提供字面值。--from-literal选项采用了 语法,这个语法允许字面值被直接运用到命令行:
在pods里面使用ConfigMap
使用案例:在环境变量中使用ConfigMap
ConfigMap可以被用来填入环境变量。举个例子,思考以下的ConfigMap:
我们可以像这样在一个pod中来使用这个ConfigMap的键:
当这个pod运行的时候,它的输出将包括以下几行:
使用案例:用ConfigMap设置命令行参数
ConfigMap也可以被使用来设置容器中的命令或者参数值。这是一个已经完成的使用Kubernetes$(VAR_NAME)替换的语法。考虑ConfigMap:
为了输入值到命令行里面,我们必须使用我们想要使用的键来作为环境变量,就如在上一个例子中的一样。然后我们可以参考他们,在容器的命令里使用$(VAR_NAME)语法。
当这个pod正在运行的时候,从test-container容器的输出将会是:
使用案例:通过数据卷插件使用ConfigMap
ConfigMap也可以在数据卷里面被使用。再次回到我们的ConfigMap的例子:
在数据卷里面使用这个ConfigMap,我们有不同的选项。最基本的就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容:
当这个pod运行的时候,输出是这样的:
我们也可以在ConfigMap值被映射的数据卷里控制路径。
当pod运行的时候,输出是这样的:
真实案例:配置Redis
让我们来看一下真实的案例:用Configmap配置redis。我们想要将redis作为一个缓存用推荐配置来输入redis。Redis 配置应该包括
docs/user-guide/configmap/redis里面有这样一个文件;有了它,我们可以使用下面的命令来创建一个ConfigMap实例:
现在,让我们用这个配置来创建一个pod:
注意,这个pod有一个ConfigMap数据卷,它在一个叫redis.conf的文件里替代了 example-redis-config ConfigMap的 redis-config密钥。这个数据卷增长到redis容器的 /redis-master目录里,在/redis-master/redis.conf里替代了我们的配置文件,/redis-master/redis.conf
就是image为master查找的redis配置文件。
如果我们kubectl exec到这个pod,并且运行redis-cli工具,我们可以检查到我们的配置被正确运用: