1 configmap介绍
是什么:是K8S内置的一种存储卷,数据存储在etcd数据库中
应用场景:主要是存储应用的配置,实现配置与应分离,可以实现类似配置配置中心的功能
由于镜像是只读的特性,如果想要修改需要重新打镜像。但是每次打镜像都会带来繁琐的工作。如果说只是配置文件发生修改,完全没有必要打镜像,可以将配置文件定义为一个cm资源,然后将其挂载到容器的相应路径
- configmap存在形式
- 键值对形式
- 类文件形式
2 configmap创建和删除
2.1 响应式创建configmap
创建一个类似mysql配置的cm
bash
kubectl create cm my.cnf --from-literal=port=3306 --from-literal=socket=/tmp/mysql80.sock
[root@master231~]# kubectl describe cm my.cnf
Name: my.cnf
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
socket:
----
/tmp/mysql80.sock
port:
----
3306
BinaryData
====
Events: <none
[root@master231~]# kubectl get cm my.cnf -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my.cnf
namespace: default
data:
port: "3306"
socket: /tmp/mysql80.sock
2.2 基于现有配置文件创建configmap
从已有的文件创建一个cm,比较便捷
1.先写一个mysql.conf配置文件
bash
cat > /data/3306/my.cnf <<eof
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8
[mysqld]
user=mysql
mysqlx=0
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
eof
2.基于文件创建
bash
kubectl create cm mysql.conf --from-file=mysql.conf
3.查看文件内容,内容部分使用一个|
引用。也可以手写yaml进行创建。
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql.conf
namespace: default
data:
mysql.conf: |
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8
[mysqld]
user=mysql
mysqlx=0
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
2.3 键值对和类文件同时使用
键值对和类文件同时使用也是可以创建成功的
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my.cnf
namespace: default
data:
port: "3306"
socket: /tmp/mysql80.sock
mysql.conf: |
mysql_user=root
data_path=/data/mysql/data1
index=true
2.4 占位符|和/说明
\
表示下级字段原样输出
``/`表示将下级字段放在一行
1.编写一个cm配置
yaml
cat > << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: test1
namespace: default
data:
mysql.conf: /
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8
[mysqld]
user=mysql
mysqlx=0
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
EOF
2.查看到全部内容在一行中
yaml
[root@master23102-configmap]# kubectl get cm test1 -o yaml
apiVersion: v1
data:
mysql.conf: / [mysql] socket=/tmp/mysql.sock default-character-set=utf8 [mysqld]
user=mysql mysqlx=0 basedir=/usr/local/mysql datadir=/data/3306/data socket=/tmp/mysql.sock
kind: ConfigMap
....
bash
[root@master23102-configmap]# kubectl describe cm test1
Name: test1
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
mysql.conf:
----
/ [mysql] socket=/tmp/mysql.sock default-character-set=utf8 [mysqld] user=mysql mysqlx=0 basedir=/usr/local/mysql datadir=/data/3306/data socket=/tmp/mysql.sock
BinaryData
====
2.5 删除configmap的方式
方式1:
kubectl delete cm my.cnf mysql.conf
方式2:
删除对应的yaml配置文件
3 pod环境变量引用configmap的key
其实就是引用上一个01-cm-games.yaml
的键
一些容器容器运行时需要传递环境变量,这是就可以引用configmap中定义的key。
如:mysql容器,nacos容器...
1.创建cm
yaml
[root@master23102-configmap]# cat 01.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: db1.cnf
namespace: default
data:
port: "3306"
socket: /tmp/mysql80.sock
author: wzy666
mysql.conf: |
mysql_user=root
data_path=/data/mysql/data1
index=true
2.创建pod测试
yaml
[root@master231 configmaps]# cat 02-deploy-cm-env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-cm-env
spec:
replicas: 1
selector:
matchExpressions:
- key: apps
values:
- xiuxian
operator: In
template:
metadata:
labels:
apps: xiuxian
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v3
env:
- name: author_name1
# 指定值从哪里获取,从cm中获取
valueFrom:
configMapKeyRef:
# 指定上一步创建的cm db1.cnf
name: db1.cnf
key: author
3.测试变量可以获取到,打印出来
bash
kubectl exec deploy-cm-env-f449485f-hdxth -- /bin/sh -c 'echo ${author_name1}'
wzy666
[root@master23102-configmap]# kubectl exec eploy-cm-env-f449485f-hdxth -- /bin/sh -c 'env |grep author'
author_name1=wzy666