K8S资源介绍之configmap

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
相关推荐
蜜獾云20 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
年薪丰厚2 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container
zhangj11252 小时前
K8S Ingress 服务配置步骤说明
云原生·容器·kubernetes
岁月变迁呀2 小时前
kubeadm搭建k8s集群
云原生·容器·kubernetes
墨水\\2 小时前
二进制部署k8s
云原生·容器·kubernetes
Source、2 小时前
k8s-metrics-server
云原生·容器·kubernetes
上海运维Q先生2 小时前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
颜淡慕潇2 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
大熊程序猿4 小时前
K8s证书过期
云原生·容器·kubernetes