ConfigMap简介, 为什么设计ConfigMap
在k8s中, ConfigMap是一种API对象, 用于将非机密的配置数据存储到键值对中。
Configmap作用是, 把配置数据从应用代码中分隔开, 让镜像和配置文件解耦,实现了镜像的可移植性。
举个例子:
我有一个Squid(正向代理)的Pod, 需要获取用户配置的白名单做访问控制。 每个用户设置的白名单都不一样, 而且用户可以随时对白名单做增、删、改,所以这个白名单的配置不能写死在代码里。
我们可以把白名单配置存储到k8s的ConfigMap, 这样配置数据和镜像就实现了解耦,Pod中可以动态地获取白名单的配置。
如何使用ConfigMap
使用ConfigMap时, Pod可以将其用作环境变量、命令行参数或存储卷中的配置文件。
下面给出一个具体的案例,将ConfigMap用作存储卷中的配置文件,Pod中通过读取配置文件的内容,就获取到了配置信息。
ConfigMap示例
需求描述: 我有一个Squid的Pod, 用户可以修改一些配置信息,例如:白名单, 父级代理。 要求创建一个ConfigMap存储这些配置,并且将ConfigMap用作存储卷中的配置文件.
配置信息如下:
1 2
| whitelist: www.baidu.com:443,www.google.com:443 # 白名单 customerProxy: 192.168.52.204:3128 # Squid的父级代理
|
步骤
首先创建一个Squid Pod, 可以参考Squid Pod部署
再创建ConfigMap, 新建文件squid-configmap.yaml
, 内容如下:
1 2 3 4 5 6 7 8
| kind: ConfigMap apiVersion: v1 metadata: name: squid-configmap namespace: squid data: whitelist: "www.baidu.com,www.google.com" parentProxy: "192.168.52.204:3128"
|
修改Deployment, 将ConfigMap映射到Pod的/etc/squid-config目录下。 具体做法是编辑squid-deployment.yaml
, 添加如下内容:
1 2 3 4 5 6 7 8 9
| volumes: - name: squid-config-volume configMap: name: squid-configmap containers: - name: squid volumeMounts: - mountPath: /etc/squid-config name: squid-config-volume
|
完整的squid-deployment.yaml
如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| apiVersion: apps/v1 kind: Deployment metadata: name: squid namespace: squid labels: name: squid spec: replicas: 1 selector: matchLabels: app: squid template: metadata: labels: app: squid spec: volumes: - name: squid-volume persistentVolumeClaim: claimName: squid-claim - name: squid-config-volume configMap: name: squid-configmap dnsPolicy: ClusterFirstWithHostNet hostNetwork: true containers: - name: squid image: squid:IMAGE_PLACEHOLDER imagePullPolicy: IfNotPresent livenessProbe: httpGet: path: /healthz port: 5000 initialDelaySeconds: 5 periodSeconds: 10 failureThreshold: 3 resources: limits: memory: "4Gi" volumeMounts: - mountPath: /var/log/squid name: squid-volume - mountPath: /etc/squid-config name: squid-config-volume
|
应用configmap, deployment, 等待Pod Ready
1 2 3
| kubectl create -f squid-configmap.yaml kubectl -n squid delete deploy squid kubectl create -f squid-deployment.yaml
|
测试
先确认ConfigMap内容包含了配置信息
1 2 3 4 5 6 7 8
| # kubectl -n squid get cm squid-configmap -o yaml apiVersion: v1 data: customerProxy: 192.168.52.204:3128 whitelist: www.baidu.com,www.google.com kind: ConfigMap metadata: ...
|
再进入Pod,确认/etc/squid-config
目录下的文件内容
1 2 3 4 5
| # kubectl -n squid exec -it squid-64bbc7d8f5-dqklp -- /bin/bash cat /etc/squid-config/customerProxy 192.168.52.204:3128 # cat /etc/squid-config/whitelist www.baidu.com,www.google.com
|
编辑configmap中的配置,等待一段时间后进入容器确认/etc/squid-config/
的文件内容也随之更新
1 2
| # kubectl -n squid edit cm squid-congfimap 把whitelist的值设置为www.4399.com, 等待一段时间后进入容器中,查看`/etc/squid-config/whitelist`的内容更新为www.4399.com
|
参考
【1】 Kubernetes Documentation - ConfigMaps
【2】 kubernetes核心技术-ConfigMap