问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Kubernetes ConfigMap配置管理详解

创作时间:
作者:
@小白创作中心

Kubernetes ConfigMap配置管理详解

引用
CSDN
1.
https://m.blog.csdn.net/m0_71163619/article/details/140474512

Kubernetes中的ConfigMap是用于存储配置数据的重要组件,它允许将配置数据以键值对的形式保存,并可以将其应用到Pod中。本文将详细介绍ConfigMap的创建方式和使用方法,帮助读者更好地理解和使用这一功能。

一、ConfigMap配置中心简介

1. 官方文档

ConfigMap是API对象,用于存放明文(非机密性)数据保存到键值对中,可以使用环境变量、命令行参数或者存储卷方式应用到Pod中,ConfigMap相当于Pod中程序的配置文件,通过修改ConfigMap内容来修改程序的配置。

2. ConfigMap局限性

ConfigMap在设计上不是用来存储大量数据的,所以在ConfigMap中保存的数据不能超过1MiB。

二、创建ConfigMap的四种方式

1. 第一种:通过命令行创建ConfigMap

创建名为my.cnf的configmap:

kubectl create configmap my.cnf --from-literal=datadir=/var/lib/mysql --from-literal=socket=/var/lib/mysql/myqsl.sock

查看configmap详细信息:

kubectl describe cm my.cnf

2. 第二种:通过指定文件创建ConfigMap

首先创建nginx.conf文件:

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

创建名为nginx.conf的configmap:

kubectl create configmap nginx.conf --from-file=www=./nginx.conf

查看详细信息:

kubectl describe cm nginx.conf

3. 第三种:通过指定目录创建ConfigMap

首先创建config目录,目录中创建my.cnf配置文件:

mkdir config && cd config
vim my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

指定config目录创建configmap:

kubectl create cm config --from-file=/root/config/

查看详细信息:

kubectl describe cm config

4. 第四种:通过YAML资源清单创建ConfigMap

创建my.cnfconfigmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my.cnf
  labels:
    app: db
data:
  master.cnf: |
   [mysqld]
   datadir=/var/lib/mysql
   socket=/var/lib/mysql/mysql.sock
   symbolic-links=0
   server-id=1
  slave.cnf: |
   [mysqld]
   datadir=/var/lib/mysql
   socket=/var/lib/mysql/mysql.sock
   symbolic-links=0
   server-id=2

执行YAML文件:

kubectl apply -f my.cnf.yaml

查看my.cnfconfigmap详细信息:

kubectl describe cm my.cnf

三、ConfigMap三种使用方式

1. 第一种:使用环境变量引入-configMapKeyRef方式

创建名为nginx-config的configmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  labels:
    app: nginx
    env: uat
data:
  nginx.conf: |
    user  nginx;
    worker_processes  auto;
    error_log  /var/log/nginx/nginx-error.log notice;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  /var/log/nginx/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
        include /etc/nginx/conf.d/*.conf;
    }

创建deployment资源:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-nginx
  labels:
    app: nginx
    env: uat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
      env: uat
  strategy:
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: nginx
        env: uat
    spec:
      containers:
- name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        env:
- name: nginxConfig
          valueFrom:
            configMapKeyRef:
              name: nginx-config
              key: nginx.conf

执行YAML文件:

kubectl apply -f nginx-config.yaml
kubectl apply -f web-nginx.yaml

查看创建出来的资源信息:

kubectl get pods -l app=nginx
kubectl get configmap nginx-config

进入被创建Pod中容器,查看变量信息:

kubectl exec -it web-nginx-855f8db6c5-q978b  -- /bin/bash
root@web-nginx-855f8db6c5-q978b:/# printenv

2. 第二种:使用环境变量-envfrom方式

创建名为my.cnf的configmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my.cnf
data:
  master.cnf: |
   [mysqld]
   datadir=/var/lib/mysql
   socket=/var/lib/mysql/mysql.sock
   symbolic-links=0
   server-id=1
  slave.cnf: |
   [mysqld]
   datadir=/var/lib/mysql
   socket=/var/lib/mysql/mysql.sock
   symbolic-links=0
   server-id=2

创建Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: envfrom-demo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      name: envfrom-demo
  template:
    metadata:
      labels:
        name: envfrom-demo
    spec:
      containers:
- name: envfrom-demo
        image: busybox:1.28.0
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "sleep 360000"]
        envFrom:
- configMapRef:
            name: my.cnf

执行YAML文件:

kubectl apply -f my.cnf.yaml
kubectl apply -f envfrom_demo.yaml

查看创建出来的资源信息:

kubectl get pods -l name=envfrom-demo
kubectl get configmap my.cnf

进入容器查看变量信息:

kubectl exec -it envfrom-demo-6ddc9dc44-tph42  -- /bin/sh
/ # printenv

3. 第三种:使用volume卷挂载

创建名为web的configmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: web
data:
  nginx_8080.conf: |
    server {
    listen 8080;
     location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
         }
    }
  nginx_9090.conf: |
    server {
    listen 9090;
     location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
         }
    }

使用nginx镜像,创建Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      volumes:
- name: web-config
        configMap:
          name: web
      containers:
- name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
- name: web-config
          mountPath: /etc/nginx/conf.d/nginx_9090.conf
          subPath: nginx_9090.conf

执行YAML资源清单:

kubectl apply -f web-config.yaml
kubectl apply -f web.yaml

配置文件端口改为9090,请求Nginx的9090端口:

kubectl get pod -owide
NAME                               READY   STATUS    RESTARTS      AGE    IP            NODE        NOMINATED NODE   READINESS GATES
web-nginx-596bdbd7bd-4z8tm         1/1     Running   0             109m   10.244.1.43   k8s-node2   <none>           <none>
curl 10.244.1.43:9090

通过9090端口访问到nginx。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号