k8s ConfigMap创建与使用

configmap 

一、cinfig描述信息

ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象。

1.1 ConfigMap

configmap 配置中心(明文存放)

1.可以轻松应对各种环境(开发、测试、生产),当启动容器时,根据需求去加载对应的配置文件
2.当需要对容器内的配置进行修改时,只需要修改配置中心的配置文件
3.也可以进行灰度发布,针对单个pod内容器进行更新

1.2 加载方式

1.  变量注入

当启动pod时,可以将配置中心的configmap配置文件关联到pod上,从中读取数据传递给pod内作为容器的一个变量,变量注入方式传递给容器;

但是当configmap 发生改变时,并不会同步到容器内变量中,仅在pod启动时生效。

2. 配置文件

也可以把configmap当做存储卷,直接挂载到容器内的目录上,应用程序去读取这个目录的配置文件,同时支持热更新

二、ConfigMap变量的创建使用

2.1 文件方式创建

复制代码
# 准备两个文件
[root@master cm]# cat game.txt version
=1.17 name=dave age=18 [root@master cm]# cat ui.properties level=2 color=yellow
复制代码

2.1.1 指定多个文件创建

kubectl create configmap game-config-2 --from-file=./game.txt  --from-file=./ui.properties

一种错误的创建方式

复制代码
[root@master-1 secret]# cat bar/username.txt
zhangsan
lisi
wangwu
zhaoliu

[root@master-1 secret]# cat bar/password.txt
xxxxx
zzzzz
ccccc
vvvvv
# 查看secret [root@master
-1 secret]# kubectl get secret my-secret -oyaml apiVersion: v1 data: password: eHh4eHgKenp6enoKY2NjY2MKdnZ2dnYK username: emhhbmdzYW4KbGlzaQp3YW5nd3UKemhhb2xpdQo= kind: Secret metadata: creationTimestamp: "2024-12-18T06:40:02Z" managedFields: ... manager: kubectl-create operation: Update time: "2024-12-18T06:40:02Z" name: my-secret namespace: default resourceVersion: "1296147" uid: 263cbea3-05e3-4109-b789-24eee920c89f type: Opaque [root@master-1 secret]# echo eHh4eHgKenp6enoKY2NjY2MKdnZ2dnYK |base64 --decode xxxxx zzzzz ccccc vvvvv [root@master-1 secret]# echo emhhbmdzYW4KbGlzaQp3YW5nd3UKemhhb2xpdQo= |base64 --decode zhangsan lisi wangwu zhaoliu 容器加载 env: - name: USERNAME valueFrom: secretKeyRef: name: my-secret key: username - name: PASSWORD valueFrom: secretKeyRef: name: my-secret key: password [root@master-1 secret]# kubectl exec secret-files-5bb67f8d6c-5zdtc -- env |egrep -w -i 'username|password' USERNAME=zhangsan # 只匹配到文件的第一行 PASSWORD=xxxxx # 同上
复制代码

由此可以看到使用文件创建cm时,尽可能写到一行,而不是分行,不然容器加载键值只能加载第一行。

实在想要kv形式的,可以使用--from-env-file  或者--from-literal=k1=v1

2.1.2 使用文件创建一个nginx的configmap

复制代码
[root@master-1 configmap]# kubectl create cm nginx-cm --from-file=nginx.conf   # 不指定文件名称
configmap/nginx-cm created

[root@master-1 configmap]# kubectl describe cm nginx-default-config
Name:         nginx-default-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
default.conf:
----
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;
...
复制代码

 2.1.3 指定自定义key值(文件名称)

复制代码
[root@master-1 configmap]# kubectl create cm nginx-cm --from-file=nginx.default.conf=nginx.conf
configmap/nginx-cm created

[root@master-1 configmap]# kubectl get cm
NAME                                    DATA   AGE
nginx-cm                                1      5s
nginx-default-config                    1      21d

[root@master-1 configmap]# kubectl describe cm nginx-cm
Name:         nginx-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx.default.conf:  # 名称发生了改变
----

#user  nobody;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
...
复制代码

2.2 使用清单文件创建cm

复制代码
cat nginx-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: app
data:
  nginx.conf: |   # 文件名

    #user  nobody;
    worker_processes  auto;

    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;

    #pid        logs/nginx.pid;

    events {
        worker_connections  1024;
    }

    http {
        include       mime.types;
        default_type  application/octet-stream;
...
复制代码

2.3 指定目录创建

指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容

[root@master-1 configmap]# ll /root/.ssh/
总用量 12
-rw-------. 1 root root 1679 10月 31 10:47 id_rsa
-rw-r--r--. 1 root root  395 10月 31 10:47 id_rsa.pub
-rw-r--r--. 1 root root  718 11月  4 15:16 known_hosts

kubectl create cm ssh-rsa --from-file=/root/.ssh/
configmap/ssh-rsa created
查看
复制代码
[root@master-1 configmap]# kubectl describe  cm ssh-rsa
Name:         ssh-rsa
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
id_rsa.pub:   # key名称
----
ssh-rsa AAAAB3NzaC1yc2EAKfL/xn4jbXKyxsAi78pfm+BHcuF root@master-1

known_hosts:   # key名称
----
node-1,192.168.64.130 ecdsa-sha2-niBF3TdjDDBHdEBpR7r913zenUgo5ASCdU=
node-2,192.168.64.131 ecdsa-sha2-nistpk3nV80jI38WT2EscRuaLdn0naI4=
192.168.43.130 ecdsa-sha2-nistp256+OxABFD8uMdxp213zenUgo5ASCdU=
192.168.43.131 ecdsa-sha2-nistp256/E6pExEfkQ274GQkBbib9scRuaLdn0naI4=

id_rsa:   # key名称
----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA0AboTXGE7JK/3twlsKda2Qr6pufWaNP4TziLUqh1Ei2tDJIO
cogQIypVJ7CGelxUhsd/o5YFxpNfXUTJLtMJs=
-----END RSA PRIVATE KEY-----

Events:  <none>
复制代码

2.4 指定文件与自定义键值对创建

—from-file 这个参数可以使用多次

复制代码
kubectl create cm ssh-rsa --from-file=/root/.ssh/ --from-literal=user=root
configmap/ssh-rsa created

[root@master-1 configmap]# kubectl describe  cm ssh-rsa
Name:         ssh-rsa
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
id_rsa.pub:
----
ssh-rsa AAAAB3NzaC1yc2EAAHUSLa0M+BHcuF root@master-1

known_hosts:
----
node-1,192.168.64.130 ecdsa-sha2-nistp256 Ago5ASCdU=
node-2,192.168.64.131 ecdsa-sha2-nistp256 AAn0naI4=
192.168.43.130 ecdsa-sha2-nistp256 AAAAE2VjZCdU=
192.168.43.131 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNaI4=

user:
----
root
id_rsa:
----
-----BEGIN RSA PRIVATE KEY-----
MIIlxUhsd/oKtvZNYjx2duKTjgE12qiVJJdj5dlIUA5YFxpNfXUTJLtMJs=
-----END RSA PRIVATE KEY-----

Events:  <none>
复制代码

2.5 使用自定义键值对创建

利用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下
$ kubectl create configmap literal-config --from-literal=name=dave --from-literal=password=pass

3. configmap使用方法

3.1 清单文件

复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: literal-config
  namespace: default
data:
  name: dave
  password: pass

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
复制代码

3.2 创建pod调用configmap

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: cm-env-test-pod
spec:
  containers:
    - name: test-container
      image: wangyanglinux/myapp:v1
      command: [ "/bin/sh", "-c", "env" ]
      env:     //导入单个变量
        - name: USERNAME      //导入后显示在容器内部 key 名称
          valueFrom:
            configMapKeyRef:
              name: literal-config   //cm 名称
              key: name              //cm 中key 名称,取出来赋值给容器内部USERNAME变量的值
        - name: PASSWORD
          valueFrom:
            configMapKeyRef:
              name: literal-config
              key: password
      envFrom:     //导入cm所有变量
        - configMapRef:
            name: env-config
  restartPolicy: Never
复制代码

3.3 使用ConfigMap 设置命令行参数输出,容器内部调用

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: cm-command-dapi-test-pod
spec:
  containers:
    - name: test-container
      image: wangyanglinux/myapp:v1
      command: [ "/bin/sh", "-c", "echo $(USERNAME) $(PASSWORD)" ]
      env:
        - name: USERNAME
          valueFrom:
            configMapKeyRef:
              name: literal-config
              key: name
        - name: PASSWORD
          valueFrom:
            configMapKeyRef:
              name: literal-config
              key: password
  restartPolicy: Never
复制代码

4. 通过数据卷(配置文件)插件使用ConfigMap

 4.1 定义一个ConfigMap

复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: linux40
data:
 default: |
    server {
       listen       80;
       server_name  www.mysite.com;
       index        index.html;

       location / {
           root /data/nginx/html;
           if (!-e $request_filename) {
               rewrite ^/(.*) /index.html last;
           }
       }
    }
复制代码

4.2 pod挂载

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: linux40
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /data/nginx/html
          name: nginx-static-dir
        - mountPath: /etc/nginx/nginx.conf   
          name:  nginx-conf                 // 跟下面随便写那个保持一致
          subPath: nginx.conf    
      volumes:
      - name: nginx-static-dir
        hostPath:
          path: /data/nginx/linux39
      - name: nginx-config        //随便写
        configMap:
          name: nginx-config     // configmap 名称
          items:                //加载configmap中某个参数,如果不写,全部转换key内容为同名文件
             - key: default     //定义加载key的名称,configmap必须有这个 key=default
               path: nginx.conf   // 两个功能:1. 重定义key名称   2. mountPath的子目录
复制代码
4.2.1 items测试
复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-secret
  namespace: app
spec:
  imagePullSecrets:
  #- name: docker-cfg-impull
  - name: user-registry
  serviceAccountName: default
  containers:
  - name: nginx-secret
    image: 124.222.68.142:10006/k8s/nginx:latest
    imagePullPolicy: Always
    #command: ["sleep", "3600"]
    volumeMounts:
    - name: nginx-default-config
      mountPath: /mnt/nginx
  volumes:
  - name: nginx-default-config
    configMap:
      name: nginx-default-config
      items:
      - key: default.conf
        path: nginx.config
复制代码

 

进入容器查看

[root@master-1 busybox]# kubectl  exec nginx-secret -n app -- ls /mnt/nginx
nginx.config

5. 不可变的cm和secret

重要文件设置此参数,上线后禁止修改

kubectl create cm test-immutable --from-file=/etc/nginx.conf
kubectl edit cm etst-immutable
...
immutable: true  # 此参数表示cm或secret不可被更改

 6. 验证热更新

创建两个pod,加载同一个configmap,一个挂载,一个注入

6.1 configmap存储卷挂载方式

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: configmap-volume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configmap-volume
  template:
    metadata:
      labels:
        app: configmap-volume
    spec:
      imagePullSecrets:
      - name: docker-cfg-impull
      containers:
      - name: configmap-volume
        image: 124.222.68.142:10006/k8s/busybox:1.28
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        command: ["sh", "-c","echo 123 > /123.txt ; sleep 3600"]
        volumeMounts:
        - name: mysql-configmap-env
          mountPath: /etc/configmap
          readOnly: true
      volumes:
      - name: mysql-configmap-env
        configMap:
          name: files-env--kv-literal-cm
复制代码

6.2 变量注入方式

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: configmap-kv-all
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configmap-kv-all
  template:
    metadata:
      labels:
        app: configmap-kv-all
    spec:
      imagePullSecrets:
      - name: docker-cfg-impull
      containers:
      - name: configmap-kv-all
        image: 124.222.68.142:10006/k8s/busybox:1.28
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        command: ["sh", "-c","echo 123 > /123.txt ; sleep 3600"]
        envFrom:
          - configMapRef:
              name: files-env--kv-literal-cm
复制代码

6.3 修改cm

复制代码
]# kubectl edit cm files-env--kv-literal-cm
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  PASSWORD: 88888888..
  PORT: "33060"
  SERVER: 192.168.43.129
  USERNAME: root
kind: ConfigMap
metadata:
  creationTimestamp: "2024-12-19T01:20:19Z"
  name: files-env--kv-literal-cm
  namespace: default
  resourceVersion: "1617807"
  uid: a0edc88c-c08b-4d34-9509-dff0694cebf1
复制代码

6.4 进入容器查看变量 

复制代码
# 变量注入
[root@master-1 configmap]# while true;do kubectl exec configmap-kv-all-5497bc449d-kf8l4 -- env |egrep -iw 'password|username|port|server';sleep 3;done
PORT=3306
SERVER=192.168.43.129
USERNAME=root
PASSWORD=666666..

# 挂载存储卷
[root@master-1 configmap]# kubectl exec configmap-volume-844c84566b-5spvl -- cat /etc/configmap/PASSWORD
88888888..
[root@master-1 configmap]# kubectl exec configmap-volume-844c84566b-5spvl -- cat /etc/configmap/PORT
33060
复制代码

结论:

1. 变量注入:
当configmap 发生改变时,并不会同步到容器内变量中,仅在pod启动时生效。

2. 配置文件:
configmap存储卷方式支持热更新。

 

posted @   不会跳舞的胖子  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示