【Kubernetes资源篇】ConfigMap配置管理中心详解

news2024/11/17 17:54:00

文章目录

    • 一、ConfigMap配置中心理论知识
      • 1、ConfigMap配置中心简介
      • 2、ConfigMap局限性
    • 二、创建ConfigMap的四种方式
      • 1、第一种:通过命令行创建ConfigMap
      • 2、第二种:通过指定文件创建ConfigMap
      • 3、第三种:通过指定目录创建ConfigMap
      • 4、第四种:通过YAML资源清单创建ConfigMap
    • 三、使用ConfigMap的三种方式
      • 1、第一种:使用环境变量引入-configMapKeyRef方式
      • 2、第二种:使用环境变量引入-envfrom方式
      • 3、第三种:使用volume卷挂载
    • 四、拓展知识

一、ConfigMap配置中心理论知识

1、ConfigMap配置中心简介

官方中文参考文档:

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

2、ConfigMap局限性

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

二、创建ConfigMap的四种方式

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

创建 名为 mysql.conf 的 configmap

kubectl create configmap mysql.conf --from-literal=datadir=/var/lib/mysql --from-literal=socket=/var/lib/mysql/mysql.sock

查看 configmap详细信息:

kubectl describe cm  mysql.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sgFWDuK-1688205066564)(D:\MD归档文档\IMG\image-20230627212430774.png)]

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

首先创建nginx.conf文件,针对nginx.conf文件创建configmap

vim 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,使用--from-file 参数指定文件位置

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

查看详细信息:定义key=www,value=./nginx.conf 中的内容

kubectl describe cm nginx.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gsuEAdWO-1688205066566)(D:\MD归档文档\IMG\image-20230627213525723.png)]

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

首先创建config目录,目录中创建nginx、mysql配置文件,使用--from-file参数指定config目录。

mkdir config && cd config

vim 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;
}

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=./config

查看详细信息:key会以目录中文件名进行命名

kubectl describe cm config

在这里插入图片描述

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

创建 db-config configmap,定义master.cnf ,slave.cnf Key

cat db-config.yaml 
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config
  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 db-config.yaml

查看db-config configmap详细信息:

kubectl describe cm db-config

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CnNLBp2k-1688205066566)(D:\MD归档文档\IMG\image-20230629113041746.png)]

三、使用ConfigMap的三种方式

上面是通过key/value方式定义配置文件信息,下面来学习一下,如何引用配置文件。

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

创建名为nginx-config 的configmap:

cat nginx-config.yaml 
---
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资源,容器中引用nginx-config configmap的nginx.conf Key

cat web-nginx.yaml 

---
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 # 指定configmap名称
              key: nginx.conf    # 指定configmap中Key

执行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-84989c5546-6clp4  -- /bin/bash
printenv

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-938y5FRL-1688205066567)(D:\MD归档文档\IMG\image-20230701161133785.png)]

我们可以在创建Pod资源时使用command,来引用变量,进行启动操作,比如下面启动MongoDB操作。

command: ["/bin/mongod", "--bind_ip=$(变量名)"]

2、第二种:使用环境变量引入-envfrom方式

创建名为mysql-config 的configmap,其中定义了两个KEY

cat mysql-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
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,通过envfrom方式指定configmap,这种方式会引用configmap中所有的KEY为系统变量,由于只是演示envFrom方式特性,所有我这边使用 busybox 镜像演示,YAML资源清单如下:

cat envfrom_demo.yaml 

---
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: mysql-config    # 指定configmap名称

执行YAML文件:

kubectl apply -f mysql-config.yaml 
kubectl apply -f envfrom_demo.yaml 

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

kubectl get pods -l name=envfrom-demo
kubectl get configmap mysql-config

进入容器查看变量信息:

kubectl exec -it envfrom-demo-6cf79bf4bc-4xvcc -- /bin/sh
printenv

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oPQ7qXB-1688205066567)(D:\MD归档文档\IMG\image-20230701165551344.png)]

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

前两种都是使用环境变量方式引用配置的不会经常使用,最常用的还是使用卷挂载方式!

创建名为web的configmap:

cat web-config.yaml 
---
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镜像,创建Deployment,并使用挂载configmap

cat web.yaml 

---
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:           # 定义卷,使用名为web的configmap
          name: web
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: web-config  # 挂载卷
          mountPath: /etc/nginx/conf.d

执行YAML资源清单:

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

我将配置文件端口改为8080了,我们请求Nginx的8080端口,作为验证:

kubectl get pods -o wide
curl 10.244.235.251:8080

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ww7wQP5p-1688205066567)(D:\MD归档文档\IMG\image-20230701174553603.png)]

OK,上面可以成功通过8080端口访问到nginx,需要注意的是这种卷挂载方式,是针对目录的,打个比方,比如你挂载了 /etc/nginx 下面,那么容器 /etc/nginx目录之前的数据会被,挂载的数据代替。

四、拓展知识

1、编辑ConfigMap

kubectl edit cm web

编辑并保存后,对于卷挂载方式,支持热加载(大约等10s)生效,会更新到容器配置中,但对于变量方式并不支持,需要重新删除创建,更改的数据才会生效。

2、删除ConfigMap

kubectl delete cm web

3、configMapKeyRef和envfrom方式引入变量区别?

  • configMapKeyRef是一种将ConfigMap中的数据作为环境变量注入到容器中的方式。它允许你在Pod的定义中引用ConfigMap中的特定键值对,并将其作为环境变量传递给容器。这种方式适用于将ConfigMap中的配置数据直接暴露给容器内的应用程序。
  • envFrom是一种将整个ConfigMap的数据作为环境变量注入到容器中的方式。它允许你在Pod的定义中引用一个或多个ConfigMap,并将它们的所有键值对作为环境变量传递给容器。这种方式适用于将多个相关的配置数据一次性注入到容器内。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++线程池(1)理论基础及简单实现

写过CURD的程序员肯定都熟悉“数据库连接池”这个东西,数据库连接是个昂贵的东西,因为它的创建过程比较耗费资源。所以为了节约资源、提高数据库操作的性能,“数据库连接池”就应运而生了。 其实线程池跟数据库连接池类似,一个线…

《PyTorch深度学习实践》第七讲 处理多维特征的输入

b站刘二大人《PyTorch深度学习实践》课程第七讲处理多维特征的输入笔记与代码:https://www.bilibili.com/video/BV1Y7411d7Ys?p7&vd_sourceb17f113d28933824d753a0915d5e3a90 Diabetes Dataset 每一行是一个记录每一列是一个特征,每个样本有8个特征…

为什么我们家里的IP都是192.168开头的?

为什么我们家里的IP都是192.168开头的? 本文为掘金社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究! 是的,还是我小白,什么技术博主,老情感博主了。 来讲个故事。…

网络安全合规-数据安全分类分级

数据安全是指保护数据免受未经授权的访问、使用、泄露、破坏或篡改的措施。数据安全包括物理安全、网络安全、应用程序安全、数据备份和恢复等方面。 数据分级分类是指根据数据的重要性和敏感程度,将数据划分为不同的级别,并根据不同级别的数据制定不同…

enote笔记法之附录1——“语法词”(即“关联词”)(ver0.23)

enote笔记法之附录1——“语法词”(即“关联词”)(ver0.23) 最上面的是截屏的完整版,分割线下面的是纯文字版本: 作者姓名(本人的真实姓名):胡佳吉 居住地&#xff1…

前言-----

因要参加电赛,接触到STC89C52RC(A51)单片机 STC89C52RC引脚功能 1电源: ①VCC - 芯片电源,接5V; ②VSS - 接地端; 2.时钟: XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 3.控制线: 控制线共…

Java 17官方编程手册都针对哪些方面做了更新?

Java 17,官方编程手册, 《International Developer》杂志称为“全世界醉著名的编程书籍创作者之一”的Herbert Schildt倾情解读 《Java官方编程手册》从1996年首次出版以来,已经经历了数次改版,每次改版都反映 了Java不断演化的进…

分享解析,2+1链动模式为何能在市场上经久不衰

​小编介绍:10年专注商业模式设计及软件开发,擅长企业生态商业模式,商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地;扶持10余个电商平台做到营收过千万,数百个平台达到百万会员,欢迎咨询。 随…

服务网格:Istio 架构

什么是服务网格 服务网格(Service Mesh)这个术语通常用于描述构成这些应用程序的微服务网络以及应用之间的交互。随着规模和复杂性的增长,服务网格越来越难以理解和管理。 它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及通常更加复杂的运维需求&am…

数据结构--双端队列

数据结构–双端队列 双端队列(Double-ended Queue,简称Deque)是一种具有队列和栈特性的数据结构,可以在队列的两端进行插入和删除操作。双端队列允许从前端和后端同时进行插入和删除操作,因此可以称为“两端都可以进出…

「STC8A8K64D4开发板」第2-6讲:串口通信

第2-6讲:串口通信 学习目的掌握USB转串口电路的原理和设计。学习STC8A8K64D4的串口通信,包括串口初始化、波特率计算、串口发送和接收。编写串口收发程序,尤其是串口接收的软件缓存处理。编写串口发送命令控制LED指示灯亮灭的程序。 硬件电路…

【电商API接口系列】店铺所有商品数据的采集

API接口允许不同应用程序之间共享数据,在系统之间传输、读取和更新数据。例如,一个电商网站可以通过API接口获取支付系统的支付状态。API接口允许开发人员使用他人开发的功能来扩展自己的应用程序。通过调用第三方API接口,开发人员无需重新实…

二进制部署Kubernetes

二进制部署Kubernetes v1.20 k8s集群master01:192.168.142.10 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02:192.168.142.20 k8s集群node01:192.168.142.30 kubelet kube-proxy docker k8s集群node…

基于Java汽车售票网站设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

VUE_网页自定义右键菜单组件

可以在uni-app或vue脚手架项目使用 引入组件会接管页面右键事件&#xff0c;所有options为空数组时&#xff0c;在页面右键将没有反应 rightMenu.vue <template><view><view v-if"show" class"contextMenu" :style"lay_style"…

Kafka:Kafka资料整理

一、官网 二、博主文章 1、kafka是什么 • Worktile社区 三、源码解读

一文了解云计算

目录 &#x1f34e;云服务 &#x1f34e;云计算类型 &#x1f352;公有云 &#x1f352;私有云 &#x1f352;混合云 &#x1f34e;云计算服务模式 &#x1f352;IaaS基础设施即服务 &#x1f352;PaaS平台即服务 &#x1f352;SaaS软件即服务 &#x1f352;三者之间区别 &…

4.springboot原理篇

原理篇 spring与springboot区别 spring是承载容器 springboot做的主要工作&#xff1a; ①简化配置&#xff08;省去了spring中配置xml&#xff0c;引入application.yml文件&#xff09; ②为我们提供了 spring-boot-starter-web 依赖&#xff0c;这个依赖包含了Tomcat和sprin…

二进制搭建Kubernetes集群(二)——部署Worker Node 组件

四.部署node节点 4.1 所有node节点部署 docker引擎 #所有 node 节点部署docker引擎#安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2#设置阿里云镜像源yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker- ce.…

Nuget更新全局包、缓存和临时文件夹路径位置

Nuget更新缓存 1、查看默认的Nuget路径2、更改全局包路径2.1 通过环境变量来进行修改2.2通过Nuget.Config配置文件来进行修改 3、更改http-cache路径4、更改temp文件路径5、更改plugins-cache文件路径 NuGet是一个流行的软件包管理器&#xff0c;可以帮助.NET开发人员轻松地添加…