K8s-configmap

root
233
文章
0
评论
2021年8月17日13:49:34 评论 5162字阅读17分12秒

配置管理中心configmap

Configmap概述

什么是Configmap?

Configmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存。

Configmap能解决哪些问题?

我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。

1、Configmap是k8s中的资源, 相当于配置文件,可以有一个或者多个Configmap;

2、Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;

3、容器中应用程序按照原有方式读取容器特定目录上的配置文件。

4、在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

Configmap应用场景

1、使用k8s部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,configmap可以将配置信息和docker镜像解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。configmap注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中

2、使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用configmap可以友好的进行配置共享。

局限性

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

Configmap创建方法

1.命令行直接创建

直接在命令行中指定configmap参数创建,通过--from-literal指定参数

[root@master01 ~]#  kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
[root@master01 ~]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      10d
tomcat-config      2      52s

#查看详情

[root@master01 ~]# kubectl describe cm tomcat-config 
Name:         tomcat-config
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
server_name:
----
myapp.tomcat.com
tomcat_port:
----
8080
Events:  <none>

 

2.通过文件创建

通过指定文件创建一个configmap,--from-file=<文件>

[root@master01 cm]# cat nginx.conf 
server {
  server_name www.nginx.com;
  listen 80;
  root /home/nginx/www/
}
                                                                              #configmap名字             #key值   #配置文件
[root@master01 cm]# kubectl create configmap www-nginx --from-file=www=./nginx.conf
[root@master01 cm]# kubectl describe cm www-nginx
Name:         www-nginx
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
www:
----
server {
  server_name www.nginx.com;
  listen 80;
  root /home/nginx/www/
}


Events:  <none>

 

3.指定目录创建configmap

#创建配置文件

[root@master01 cm]# mkdir test-a
[root@master01 cm]# cd test-a
[root@master01 test-a]# echo "server-id=1" >my-server.cnf
[root@master01 test-a]# echo "server-id=2" >my-slave.cnf
[root@master01 test-a]# ll
总用量 8
-rw-r--r--. 1 root root 12 8月  17 12:16 my-server.cnf
-rw-r--r--. 1 root root 12 8月  17 12:16 my-slave.cnf
[root@master01 cm]#  kubectl create configmap mysql-config --from-file=./test-a/
configmap/mysql-config created

#查看configmap详细信息

[root@master01 cm]# kubectl describe cm mysql-config
Name:         mysql-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
my-server.cnf:
----
server-id=1

my-slave.cnf:
----
server-id=2

Events:  <none>

 

编写configmap资源清单yaml文件

[root@master01 cm]# kubectl explain cm
KIND:     ConfigMap
VERSION:  v1

DESCRIPTION:
     ConfigMap holds configuration data for pods to consume.

FIELDS:
   apiVersion	<string>
   binaryData	<map[string]string>
   data	<map[string]string>
   immutable	<boolean>
   kind	<string>
   metadata	<Object>

#编写configmap的yaml文件

[root@master01 cm]# cat mysql-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  master.cnf: |
    [mysqld]
    log-bin
    log_bin_trust_function_creators=1
    lower_case_table_names=1
  slave.cnf: |
    [mysqld]
    super-read-only
    log_bin_trust_function_creators=1

使用Configmap

 

把configmap通过变量的方式注入到pod里

1.通过环境变量引入:使用configMapKeyRef

[root@master01 cm]# cat key-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
    log: "1"
    lower: "1"
[root@master01 cm]# kubectl apply -f key-configmap.yaml 
configmap/mysql created

#创建pod,引用Configmap中的内容

[root@master01 cm]# cat key-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:
    - name: log_bin   #定义环境变量log_bin
      valueFrom: 
        configMapKeyRef:
          name: mysql     #指定configmap的名字
          key: log #指定configmap中的key
    - name: lower   #定义环境变量lower
      valueFrom:
        configMapKeyRef:
          name: mysql
          key: lower
  restartPolicy: Never

#更新资源清单文件

[root@master01 cm]# kubectl apply -f key-pod.yaml
/ # printenv
log_bin=1
lower=1

 

2.通过环境变量引入:使用envfrom

[root@master01 cm]# cat mysql-pod-envfrom.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-envfrom
spec:
  containers:
  - name: mysql
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom: 
    - configMapRef:
       name: mysql     #指定configmap的名字
  restartPolicy: Never

#更新资源清单文件

[root@master01 cm]# kubectl apply -f mysql-pod-envfrom.yaml
[root@master01 cm]# kubectl exec -it mysql-pod-envfrom -- /bin/sh
/ # printenv
lower=1
log=1

把configmap通过volume的方式注入到pod里【最常用】

[root@master01 cm]# cat volume-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
    log: "1"
    lower: "1"
    my.cnf: |
      [mysqld]
      Welcome=hwf
[root@master01 cm]# kubectl apply -f volume-configmap.yaml
[root@master01 cm]# cat pod-volume-configmap.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-volume
spec:
  containers:
  - name: mysql
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh","-c","sleep 3600" ]
    volumeMounts:
    - name: mysql-config
      mountPath: /tmp/config
  volumes:
  - name: mysql-config
    configMap:
      name: mysql
  restartPolicy: Never
[root@master01 cm]# kubectl apply -f pod-volume-configmap.yaml
[root@master01 cm]# kubectl exec -it mysql-pod-volume -- /bin/sh
/ # ls /tmp/config/
log     lower   my.cnf

 

Configmap热更新

[root@master01 cm]# kubectl edit configmap mysql

把logs: “1”变成log: “2”

保存退出

[root@master01 cm]# kubectl exec -it mysql-pod-volume -- /bin/sh
/tmp/config # cat log
2/tmp/config # 
/tmp/config # cat lower 
2/tmp/config # 

注意:

更新 ConfigMap 后:

使用该 ConfigMap 挂载的 Env 不会同步更新

使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

继续阅读
历史上的今天
8月
17
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2021年8月17日13:49:34
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
k8s-Service Account Kubernetes

k8s-Service Account

k8s-Service Account的授权管理 Service Account也是一种账号,是给运行在Pod里的进程提供了必要的身份证明。需要在Pod定义中指明引用的Service Account,...
k8s-RBAC Kubernetes

k8s-RBAC

k8s-RBAC认证授权策略 RBAC介绍 在Kubernetes中,所有资源对象都是通过API进行操作,他们保存在etcd里。而对etcd的操作我们需要通过访问 kube-apiserver 来实现...
k8s-Secret Kubernetes

k8s-Secret

配置管理中心Secret Secret是什么? Configmap一般是用来存放明文数据的,如配置文件,对于一些敏感数据,如密码、私钥等数据时,要用secret类型 Secret解决了密码、token...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: