自学内容网 自学内容网

k8s-configMap

一: configMap简述

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

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

ConfigMap
+--------+
|        |
|  key1  |
|  value1|
|        |
|  key2  |
|  value2|
+--------+

         |
         |---> Volume Mount
         |
Pod
+--------+
|        |
|  Container   |
|        |
+--------+

  • ConfigMap 包含两个键值对(key1/value1 和 key2/value2)。
  • Pod 包含一个容器。
  • ConfigMap 通过Volume Mount的方式将数据传递给Pod中的容器的那个目录下

二: 部署pod测试一下configMap的功能

先随便定义一个文件,比如说就my.cnf

vim  my.cnf

[mysqld]
server_id=1
[client]
user=sjl
password=123456

创建configMap

kubectl create configmap mconfig  --from-file=my.cnf   

这条命令就是将刚才创建的文件my.cnf创建成configMap

kubectl  get  cm   #查看创建的configMap

kubectl describe cm myconfig  #查看刚刚创建的configMap的详细信息,可以看到key就是my.cnf

创建一个pod

vim test.yaml 

apiVersion: v1
kind: Pod
metadata: 
  name: mysql
  labels:
    app: mysql
spec:
  containers:
  - name: my
    image: nginx:1.26
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    volumeMounts: 
    - name: config            #volume的名字
      mountPath: /mnt         #挂载的目录
  volumes:
  - name: config            
    configMap:                 #定义卷的类型为configMap
      name: myconfig           #刚刚创建的configMap

kubectl  apply   -f test.yaml  

kubectl  get pod  mysql  #查看pod 

kubectl exec -it mysql -- /bin/bash  #进入容器里面

可以看到文件中也是我们定义的内容

configMap热更新:

热更新 这意味着你可以在不重启Pod的情况下更新配置数据

kubectl edit  cm  myconfig   编辑这个configMap

比如将这个server_id从1换成了123

再进入容器里面查看

也成功换成了123,经过测试大概需要10几秒的时间才会更新完成

这种热更新能力主要适用于通过卷挂载的ConfigMap,而通过环境变量或subPath挂载的文件则不支持动态更新

三:实战例子,挂载nginx配置

创建自己的nginx.conf文件

vim nginx.conf

就只加了一个server_tokens off;  这个表示隐藏nginx版本号如果没有这个参数的话访问错误的话就是会显示出版本号

创建configMap

kubectl create configmap  nginx-config --from-file=nginx.conf

kubectl  get  configmap

可以看到已经创建成功了

创建pod

vim pod.yaml

apiVersion: v1
kind: Pod
metadata: 
  name: test
  labels:
    app: web
spec:
  containers:
  - name: cad
    image: nginx:1.26
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    volumeMounts:
    # 这里定义了如何将ConfigMap挂载到容器内部
    - name: nginxconf
      # 指定容器内挂载ConfigMap的路径
      mountPath: /etc/nginx/nginx.conf     
      # 指定ConfigMap中的文件名称
      subPath: nginx.conf
  volumes:
  # 定义了一个名为nginxconf的卷,这个卷将被挂载到容器中
  - name: nginxconf
    # 指定了这个卷的类型为ConfigMap,并且引用了一个名为nginx-config的ConfigMap对象
    configMap:
      name: nginx-config

kubectl  apply -f pod.yaml

kubectl  get  pod test

可以看到pod已经创建出来了

进入到容器查看一下

kubectl exec -it test  -- /bin/bash

可以看到确实是我们自己定义的内容

curl  pod ip测试一下

后面的aaa就是web服务没有这个路径所以显示404,可以看到确实已经隐藏了版本号了。

在浏览器访问看一下

浏览器访问的时候也是一样的隐藏了版本号!

注意: 在集群外部访问的话需要创建service 我这边是提前创建好了,创建nodePort类型的service就行。


原文地址:https://blog.csdn.net/weixin_63294004/article/details/142925766

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!