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