让Kubernetes的Pod读取多个ConfigMap,也可以让多个Pod读取相同的ConfogMap
这是什么?
在Kubernetes上部署了两个Pod,并使用ConfigMap动态共享相同的数据,也可以将多个ConfigMap加载到一个Pod中。
此外,在本教程中,我们将使用Redis介绍同时处理这些用法,因为仅仅通过ConfigMap的官方文档可能很难理解。
如果您只想简单地尝试一下,建议阅读这篇文章。
这次使用的环境和预先需要的东西。
-
- OSX El Capitan ver.10.11.6
-
- exec
-
- Vagrant
-
- VirtualBox
-
- CoreOS
- Kubernetes
请根据本文提供的文章参考,继续推进Kubernetes的环境构建工作。
准备所需文件
首先,请创建以下5个文件并放置在同一个文件夹中。
请务必将除了yaml文件以外的文件没有扩展名创建。
以下两个文件是用于指定本次使用的Redis Pod的配置信息的ConfigMap的源文件。
maxmemory 2mb
maxmemory-policy allkeys-lru
maxmemory 4mb
maxmemory-policy allkeys-lru
以下的文件是用于两个Pod中使用的动态共享数据的ConfigMap的源文件,采用yaml格式编写。
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-example
data:
example.property.1: hello
example.property.2: area
example.property.3: niki’s
example.property.4: world
example.property.5: create
下面的两个文件是关于本次使用的两个Redis Pod的配置信息。
apiVersion: v1
kind: Pod
metadata:
name: redis1
spec:
containers:
- name: redis
image: kubernetes/redis:v1
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
resources:
limits:
cpu: "0.1"
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
- mountPath: /redis-cli
name: redis-data
volumes:
- name: data
emptyDir{}
- name: config
configMap:
name: redis-config1
items:
- key: redis-config1
path: redis.conf
- name: redis-data
configMap:
name: redis-example
apiVersion: v1
kind: Pod
metadata:
name: redis2
spec:
containers:
- name: redis
image: kubernetes/redis:v1
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
resources:
limits:
cpu: "0.1"
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
- mountPath: /redis-cli
name: redis-data
volumes:
- name: data
emptyDir{}
- name: config
configMap:
name: redis-config2
items:
- key: redis-config2
path: redis.conf
- name: redis-data
configMap:
name: redis-example
如果能创建成功,就启动Kubernetes并继续下一步吧!
创建ConfigMap
创建 ConfigMap 的方法有以下三种模式。
-
- yamlファイルなどの設定ファイル直接記述して作る方法
kubectl create -f config.conf
方式
-
- 指定したい設定情報のみのファイルを記述して作る方法
kubectl create configmap –from-file
方式
-
- コマンドの引数に直接設定情報の引数を入れる方法
kubectl create configmap –from-literal
方式
我们将使用两种方法进行描述:一种是编写yaml文件的方法,另一种是编写只包含想要指定的配置信息的文件的方法。
首先,从只包含想要指定配置信息的文件中创建ConfigMap。
$ kubectl create configmap redis-config1 --from-file=redis-config1
configmap "redis-config1" created
$ kubectl create configmap redis-config2 --from-file=redis-config2
configmap "redis-config2" created
接下来,我们将使用yaml文件直接编写配置信息的方式来创建ConfigMap。
$ kubectl create -f redis-example.yaml
configmap "redis-example" created
让我们来确认一下是否正确创建了。
$ kubectl get configmap
NAME DATA AGE
redis-config1 1 6m
redis-config2 1 5m
redis-example 5 3m
尝试使用ConfigMap部署Pod。
在使用bash命令部署时,ConfigMap有两种设置环境变量的方法:一种是直接设置为环境变量,另一种是作为Volume挂载。在这里,我们将使用Volume来部署两个具有不同配置的Pod,并尝试动态地使用共享文件。
让我们使用以下命令一次性部署这两个Pod吧。
$ kubectl create -f redis-pod1.yaml &&kubectl create -f redis-pod2.yaml
pod "redis1" created
pod "redis2" created
让我们确认一下Pod是否正确部署了。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
redis1 1/1 Running 0 1m
redis2 1/1 Running 0 1m
如果状态变成“运行”,那么准备工作就完成了。让我们继续前进并尝试运行各种操作。
检查每个Pod是否正确配置了ConfigMap。
首先,让我们进入名为「redis1」的Pod并进行确认。
$ kubectl exec -it redis1 redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"
127.0.0.1:6379> exit
接下来,让我们进入名为”redis2″的Pod中进行确认。
$ kubectl exec -it redis2 redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "4194304"
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"
127.0.0.1:6379> exit
※因为yaml文件中写明了IP地址和端口必须相同,所以即使是分开的也是可以的。
我們這次把maxmemory設置不同,所以從輸出中可以看出有所不同。
让我们来确认一下是否能从ConfigMap中获取相同的动态数据。
$ kubectl exec redis1 cat /redis-cli/example.property.1
hello
$ kubectl exec redis2 cat /redis-cli/example.property.1
hello
确认当更改ConfigMap的值时,Pod的值也会随之改变。
让我们试试通过更改ConfigMap的Volume值来立即反映在Pod一侧。
$ kubectl edit configmap redis-example
標準情况下,vi会启动,所以让我们编辑如下:
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
example.property.1: niki’s #Change
example.property.2: area
example.property.3: hello #Change
example.property.4: world
example.property.5: create
kind: ConfigMap
metadata:
creationTimestamp: 2016-08-23T04:27:36Z
name: redis-example
namespace: default
resourceVersion: "93754"
selfLink: /api/v1/namespaces/default/configmaps/redis-example
uid: eb2a107c-68e9-11e6-96ee-080027e9ede8
按下Esc键,然后输入:wq来保存修改并退出Vi,然后可以确认修改是否生效。
$ kubectl exec redis1 cat /redis-cli/example.property.1
niki’s
$ kubectl exec redis2 cat /redis-cli/example.property.1
niki’s
让我们来查看一下最初创建ConfigMap时所编写的文件。
$ cat redis-example.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-example
data:
example.property.1: hello
example.property.2: area
example.property.3: niki’s
example.property.4: world
example.property.5: create
从这里可以看出,与最初用于创建ConfigMap的文件不同,Kubernetes上的ConfigMap是以一种ConfigMap每次被更新的形式进行更改的。此外,关于同时共享动态数据的机制,可以参考这篇文章。
请尝试自己实际修改各种数据并输出并尝试一下。(有五个示例属性,从example.property.1到example.property.5)
当你完成玩耍后,下一个指令将按原样执行。辛苦了!
$ kubectl delete pod redis1 && kubectl delete pod redis2 && kubectl delete configmap redis-example && kubectl delete configmap redis-config2 && kubectl delete configmap redis-config1
pod "redis1" deleted
pod "redis2" deleted
configmap "redis-example" deleted
configmap "redis-config2" deleted
configmap "redis-config1" deleted
引用文献
-
- Kubernetes – Using ConfigMap
-
- VagrantとCoreOSでkubernetesをMacで使ってみる ①環境構築編
- KubernetesのConfigMapを試してみる