K8s的ConfigMap存储
非常重要的资源对象: ConfigMap ,在实际工作中许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息,这些配置信息我们肯定不会直接写死到 应用程序中去的,比如你一个应用连接一个redis 服务,下一次想更换一 个,还得重新去修改代码,重新制作一个镜像,这肯定是不可取的,而 ConfigMap 就给我们提供了向容器中注入配置信息的能力,不仅可以用来保存单个属性,也可以用来保存整个配置文件,比如我们可以用来配置一个redis服务的访问地址,也可以用来保存整个 redis的配置文件
ConfigMap 资源对象使用key-value 形式的键值对来配置数据,这些数据 可以在 Pod 里面使用,ConfigMap 可以比较方便的处理一些非敏感的数据,比如密码之类的还是需要使用Secrets来进行管理。下面举个例子说 明下ConfigMap 的使用方法:
vim demo.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: cm-demo
namespace: default
data:
data.1: hello
data.2: world
config: |
property.1=value-1
property.2=value-2
property.3=value-3
# | 表示保留换行符 > 在字符串中折叠换行
#查看
kubectl get cm
比如我们有一个 test 的目录,该目录下面包含一些配置文件,redis和mysql的连接信 息,如下:
mkdir test
cat > test/redis.conf <<EOF
host=127.0.0.1
port=6379
EOF
cat > test/mysql.conf <<EOF
host=127.0.0.1
port=3306
EOF
#可以使用 from-file关键字来创建包含这个目录下面所以配置文件的ConfigMap
kubectl create configmap cm-demo1 --from-file=test
kubectl get cm
NAME DATA AGE
cm-demo 3 2m53s
cm-demo1 2 4s
kube-root-ca.crt 1 38h
[root@k8s-master cm]# kubectl describe cm cm-demo1
Name: cm-demo1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
mysql.conf:
----
host=127.0.0.1
port=3306
redis.conf:
----
host=127.0.0.1
port=6379
Events: <none>
#使用这个命令可以查看更详细
kubectl get configmap cm-demo1 -o yaml
#也可以使用指定的文件进行创建不一定是目录
使用
ConfigMap 的配置数据可以通过很多种方式在Pod 里使用,主要有以下几种方式:
设置环境变量的值
在容器里设置命令行参数
在数据卷里面创建config文件
1.首先,使用ConfigMap 来填充我们的环境变量:
vim test.yaml
apiVersion: v1
kind: Pod
metadata:
name: testcm1-pod
spec:
containers:
- name: testcm1
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env: #设置环境变量
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo3
key: db.port
envFrom: #和上方env是一样的但是这里是直接调用cm中的所有变量
- configMapRef:
name: cm-demo1
2.通过数据卷使用,在数据 卷里面使用ConfigMap ,就是将文件填入数据卷,在这个文件中,键就是 文件名,键值就是文件内容:
vim test2.yaml
apiVersion: v1
kind: Pod
metadata:
name: testcm2-pod
spec:
containers:
- name: testcm2
image: busybox
command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
volumeMounts:
- name: config-redis #挂载这个卷
mountPath: /etc/config #挂载容器内路径
volumes:
- name: config-redis #创建卷从cm-demo2来
configMap:
name: redis.conf #此卷提前创建
#kubectl logs testcm2-pod 查看
#如果修改挂载文件生效
kubectl get cm
NAME DATA AGE
cm-demo 3 132m
cm-demo1 2 129m
cm-demo2 1 124m
kube-root-ca.crt 1 41h
redis.conf 1 22m
kubectl edit cm redis.conf
#修改文件即可热更新,pod会自动重启
#如果使用edit发现格式错乱,比如\n\t,是因为在文件中含有tab所有转换,先删除cm再重新创建
# 使用以下方法删除尾随空格
sed -i -E 's/[[:space:]]+$//g' file.txt
# 使用空格替换制表符
sed -i 's/\t/ /g' file.txt