一.系统环境

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64

Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器 操作系统版本 CPU架构 进程 功能描述
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

使用ConfigMap的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。

三.ConfigMap概览

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap 是一个 API 对象, 让你可以存储其他对象所需要使用的配置。 和其他 Kubernetes 对象都有一个 spec 不同的是,ConfigMap 使用 data 和 binaryData 字段。这些字段能够接收键-值对作为其取值。data 和 binaryData 字段都是可选的。data 字段设计用来保存 UTF-8 字符串,而 binaryData 则被设计用来保存二进制数据作为 base64 编码的字串。

ConfigMap 的名字必须是一个合法的 DNS 子域名。

data 或 binaryData 字段下面的每个键的名称都必须由字母数字字符或者 -、_ 或 . 组成。在 data 下保存的键名不可以与在 binaryData 下出现的键名有重叠。

从 v1.19 开始,你可以添加一个 immutable 字段到 ConfigMap 定义中, 创建不可变更的 ConfigMap。

ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改

注意ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret,关于secret的使用请查看博客《Kubernetes(k8s)密码管理:Secret》, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。

ConfigMap的用途如下:使用 ConfigMap 来将你的配置数据和应用程序代码分开。

  • 比如,假设你正在开发一个应用,它可以在你自己的电脑上(用于开发)和在云上 (用于实际流量)运行。 你的代码里有一段是用于查看环境变量 DATABASE_HOST,在本地运行时, 你将这个变量设置为 localhost,在云上,你将其设置为引用 Kubernetes 集群中的 公开数据库组件的 服务。

这让你可以获取在云中运行的容器镜像,并且如果有需要的话,在本地调试完全相同的代码。

ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

四.创建ConfigMap

查询configmap

[root@k8scloude1 secret-manage]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 5h29m

configmap的创建方式和secret类似,可以使用键值对,也可以使用文件

使用键值对创建configmap

[root@k8scloude1 secret-manage]# kubectl create cm cm1 --from-literal=xioaming=zxc --from-literal=bob=plm
configmap/cm1 created [root@k8scloude1 secret-manage]# kubectl get cm
NAME DATA AGE
cm1 2 4s
kube-root-ca.crt 1 5h31m

查看configmap的详细内容

[root@k8scloude1 secret-manage]# kubectl describe cm cm1
Name: cm1
Namespace: secret-manage
Labels: <none>
Annotations: <none> Data
====
bob:
----
plm
xioaming:
----
zxc
Events: <none>

以yaml格式查看configmap

[root@k8scloude1 secret-manage]# kubectl get cm cm1 -o yaml
apiVersion: v1
data:
bob: plm
xioaming: zxc
kind: ConfigMap
metadata:
creationTimestamp: "2022-01-21T09:25:32Z"
name: cm1
namespace: secret-manage
resourceVersion: "890529"
selfLink: /api/v1/namespaces/secret-manage/configmaps/cm1
uid: bdbb0647-dfe9-45ec-827d-9af2ea12a0a1

使用文件创建configmap

[root@k8scloude1 secret-manage]# kubectl create cm cm2 --from-file=/etc/shadow --from-file=/etc/hosts
configmap/cm2 created [root@k8scloude1 secret-manage]# kubectl create cm cm3 --from-file=nginx.conf
configmap/cm3 created [root@k8scloude1 secret-manage]# kubectl get cm
NAME DATA AGE
cm1 2 4m18s
cm2 2 22s
cm3 1 4s
kube-root-ca.crt 1 5h35m

五.ConfigMap的使用

5.1 以环境变量的方式使用ConfigMap

使用MySQL镜像创建pod,以环境变量的方式引用ConfigMap

[root@k8scloude1 secret-manage]# vim mysqlconfgmap.yaml 

#configMapKeyRef:指定confgmap的名字和key
[root@k8scloude1 secret-manage]# cat mysqlconfgmap.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: mysql
name: mysql
spec:
terminationGracePeriodSeconds: 0
containers:
- image: hub.c.163.com/library/mysql:latest
imagePullPolicy: IfNotPresent
name: mysql
resources: {}
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name: cm1
key: xioaming
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

创建pod

[root@k8scloude1 secret-manage]# kubectl apply -f mysqlconfgmap.yaml
pod/mysql created [root@k8scloude1 secret-manage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql 1/1 Running 0 24s 10.244.112.139 k8scloude2 <none> <none>

连接mysql数据库

[root@k8scloude1 secret-manage]# mysql -uroot -pzxc -h 10.244.112.139
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.18 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> exit
Bye

查看mysql pod的mysql密码MYSQL_ROOT_PASSWORD,mysql密码没有显示

[root@k8scloude1 secret-manage]# kubectl describe pod mysql | grep -A10 Environment
Environment:
MYSQL_ROOT_PASSWORD: <set to the key 'xioaming' of config map 'cm1'> Optional: false
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dllmm (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:

删除pod

[root@k8scloude1 secret-manage]# kubectl delete pod mysql --force
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "mysql" force deleted

5.2 以卷的方式使用ConfigMap

配置pod,以卷的方式引用configmap,挂载cm3的nginx.conf到/etc/nginx/nginx.conf

[root@k8scloude1 secret-manage]# vim volumenginxconfconfigmap.yaml 

[root@k8scloude1 secret-manage]# cat volumenginxconfconfigmap.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
terminationGracePeriodSeconds: 0
#定义configmap类型的卷
volumes:
- name: configmap1
configMap:
name: cm3
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
#把nginx.conf文件挂载到/etc/nginx/nginx.conf
volumeMounts:
- name: configmap1
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

创建pod

[root@k8scloude1 secret-manage]# kubectl apply -f volumenginxconfconfigmap.yaml
pod/nginx created [root@k8scloude1 secret-manage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 9s 10.244.112.141 k8scloude2 <none> <none>

进入Nginx容器

[root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
root@nginx:/# cat /etc/nginx/nginx.conf | head -3
##modify file
user nginx;
worker_processes auto;
root@nginx:/# exit
exit

可以使用edit编辑nginx.conf文件

[root@k8scloude1 secret-manage]# kubectl edit cm cm3
configmap/cm3 edited

查看修改过后的configmap内容

[root@k8scloude1 secret-manage]# kubectl get cm cm3 -o yaml | head -7
apiVersion: v1
data:
nginx.conf: |+
##modify file
##new add
user nginx;
worker_processes auto;

进入容器查看Nginx的配置文件,可以发现:cm3里文件内容已经改变了,但是容器里文件内容没变。

pod里的配置文件nginx.conf没有变化,需要重新创建pod

[root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
root@nginx:/# cat /etc/nginx/nginx.conf | head -3
##modify file
user nginx;
worker_processes auto;
root@nginx:/# exit
exit

删除pod并重新创建pod

[root@k8scloude1 secret-manage]# kubectl delete pod nginx --force
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "nginx" force deleted [root@k8scloude1 secret-manage]# kubectl apply -f volumenginxconfconfigmap.yaml
pod/nginx created

此时nginx.conf文件内容已经改变了,就达到了修改configmap文件,从而改变容器里配置文件的目的。

[root@k8scloude1 secret-manage]# kubectl exec -it nginx -- bash
root@nginx:/# cat /etc/nginx/nginx.conf | head -3
##modify file
##new add
user nginx;
root@nginx:/# exit
exit

查看所有的configmap

[root@k8scloude1 secret-manage]# kubectl get cm -A
NAMESPACE NAME DATA AGE
default kube-root-ca.crt 1 12d
kube-node-lease kube-root-ca.crt 1 12d
kube-public cluster-info 1 12d
kube-public kube-root-ca.crt 1 12d
kube-system calico-config 4 12d
kube-system coredns 1 12d
kube-system extension-apiserver-authentication 6 12d
kube-system kube-proxy 2 12d
kube-system kube-root-ca.crt 1 12d
kube-system kubeadm-config 2 12d
kube-system kubelet-config-1.21 1 12d
ns1 kube-root-ca.crt 1 11d
ns2 kube-root-ca.crt 1 11d
pod kube-root-ca.crt 1 9d
secret-manage cm1 2 33m
secret-manage cm2 2 29m
secret-manage cm3 1 12m
secret-manage kube-root-ca.crt 1 6h5m
volume kube-root-ca.crt 1 3d5h

可以编辑其他的configmap内容

[root@k8scloude1 secret-manage]# kubectl edit cm calico-config -n kube-system
Edit cancelled, no changes made. [root@k8scloude1 secret-manage]# kubectl edit cm kube-proxy -n kube-system
Edit cancelled, no changes made.

Kubernetes(k8s)配置文件管理:ConfigMap的更多相关文章

  1. k8s配置中心-configmap,Secret密码

    目录 k8s配置中心-configmap,Secret 创建ConfigMap 使用ConfigMap subPath参数 Secret 官方文档 编写secret清单 使用secret 在 Pod ...

  2. Kubernetes K8S之存储ConfigMap详解

    K8S之存储ConfigMap概述与说明,并详解常用ConfigMap示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS ...

  3. 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

    写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 ​ 可能很多新手都会遇到同样的问题:我要我的Asp.net ...

  4. k8s配置集ConfigMap详解

    ConfigMap介绍 ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷,ConfigMap对象用于为容器中的应用提供配置文件等信息.但是比较敏感的数据,例如密钥.证书 ...

  5. Kubernetes K8S之存储Volume详解

    K8S之存储Volume概述与说明,并详解常用Volume示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...

  6. Kubernetes(k8s) docker集群搭建

    原文地址:https://blog.csdn.net/real_myth/article/details/78719244 一.Kubernetes系列之介绍篇   •Kubernetes介绍 1.背 ...

  7. Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解

    YAML语法规范:在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义.YAM ...

  8. Kubernetes K8S之鉴权RBAC详解

    Kubernetes K8S之鉴权概述与RBAC详解 K8S认证与授权 认证「Authentication」 认证有如下几种方式: 1.HTTP Token认证:通过一个Token来识别合法用户. H ...

  9. 【葵花宝典】lvs+keepalived部署kubernetes(k8s)高可用集群

    一.部署环境 1.1 主机列表 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 lvs-keepal ...

  10. Centos7 安装部署Kubernetes(k8s)集群

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4. ...

随机推荐

  1. CodeTON Round 3 (C.差分维护,D.容斥原理)

    C. Complementary XOR 题目大意: 给你两个01串ab,问你是否可以通过一下两种操作在不超过n+5次的前提下将两个串都变为0,同时需要输出可以的操作方案 选择一个区间[l,r] 将串 ...

  2. 钉钉dingtalk=6.3.5版本RCE复现

    看到网上公开了钉钉RCE的利用方式,第一时间来复现一下. 钉钉dingtalk=6.3.5版本RCE复现 免责声明: 影响版本: 漏洞POC: 漏洞复现: 存在漏洞版本下载地址: 免责声明: 本文章仅 ...

  3. 2022春每日一题:Day 17

    今天打CF去了,但是很菜,只做了三题.赛后一分钟做出了第四题,wa了,改了一下下,过了 第一题就是对应的小写字母在大写字母前出现. 第二题直接dfs. 第三题dp,f[i][j]表示以第i个数开始加了 ...

  4. NET 6 实现滑动验证码(一)、创建工程

    目录 实现滑动验证码的目的 创建.NET 6工程 实现滑动验证码的目的 传统验证码实现起来比较简单,但在OCR技术越来越成熟的情况下,验证码的破解难度越来越低,但如果将验证码难度加高(各种干扰背景,扭 ...

  5. vue 3.0 常用API 的介绍

    vue3.0 生命周期 写法一 和vue2.x 一致 区别在于(beforeUnmount.unmount)名称不一样 写法二 在setup 中使用, 需要引用 如: import { onBefor ...

  6. 如何利用C++使Windows蓝屏

    如何利用C++使Windows蓝屏 虽说windows非常强大,但是使它蓝屏也非常简单: 如果你想让Windows蓝屏,你一定会在运行框里输入: cmd /c for /f %I in ('wmic ...

  7. 新版的Eureka已经移除了基于Ribbon的客户端的负载均衡

    启用一个EurekaServer和一个服务调用方,两个copy的服务提供方. 本次测试用Springcloud 2021.0.1版本 客户端使用RestTemplate 的负载均衡 @LoadBala ...

  8. vue3响应式原理以及ref和reactive区别还有vue2/3生命周期的对比,第二天

    前言: 前天我们学了 ref 和 reactive ,提到了响应式数据和 Proxy ,那我们今天就来了解一下,vue3 的响应式 在了解之前,先复习一下之前 vue2 的响应式原理 vue2 的响应 ...

  9. 下载安装MinGW-w64详细步骤

    一.MinGW-w64介绍 MinGW 的全称是:Minimalist GNU on Windows ,实际上是将gcc(c/c++编译器)移植到了 Windows 平台下,并且包含了 Win32AP ...

  10. DHorse的链路追踪

    目前,DHorse的链路追踪功能是通过SkyWalking来实现.实现原理是DHorse在部署应用时,通过指定SkyWalking的Agent来收集服务的调用链路信息.下面就来具体看一下DHorse如 ...