ConfigMap配置ConfigMap热更新及学习

一:配置 Pod 使用 ConfigMap
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/ —kubernetes官网介绍ConfigMap的地址

很多应用在其初始化或运行期间要依赖一些配置信息。 大多数时候,存在要调整配置参数所设置的数值的需求。 ConfigMap 是 Kubernetes 的一种机制,可让你将配置数据注入到应用的 Pod 内部。

ConfigMap 概念允许你将配置清单与镜像内容分离,以保持容器化的应用程序的可移植性。 例如,你可以下载并运行相同的容器镜像来启动容器, 用于本地开发、系统测试或运行实时终端用户工作负载。

本页提供了一系列使用示例,这些示例演示了如何创建 ConfigMap 以及配置 Pod 使用存储在 ConfigMap 中的数据。

1.创建 ConfigMap
kubectl create configmap
2.基于一个文件创建configmap

创建一个文件,文件中以key和value的格式记录信息
[root@k8s-master1 configmap]# touch db.properties
[root@k8s-master1 configmap]# vi db.properties
[root@k8s-master1 configmap]# cat db.properties
username=root
passwd=admin
#这个命令可以查看创建configmap的基本命令格式
[root@k8s-master1 configmap]# kubectl create configmap --help
#咱们基于db.properties这个配置文件创建个configmaop
[root@k8s-master1 configmap]# kubectl create configmap my-db-properties --from-file=/root/configure-pod-container/configmap/db.properties -n app
configmap/my-db-properties created
#查看configmap是否创建成功
[root@k8s-master1 configmap]# kubectl get configmap -n app
NAME               DATA   AGE
kube-root-ca.crt   1      8d
my-db-properties   1      35s
#查看configmap的详细信息
[root@k8s-master1 configmap]# kubectl describe configmap my-db-properties -n app
Name:         my-db-properties
Namespace:    app
Labels:       <none>
Annotations:  <none>

Data
====
db.properties:
----
username=root
passwd=admin


BinaryData
====

Events:  <none>

在pod环境变量中中加载进去configmap的配置

#创建一个configmap
[root@k8s-master1 configmap]# kubectl create configmap test-env-config --from-literal=JAVA_OPTS_TEST='-Xms512m -Xmx512m' --from-literal=APP_NAME=springboot-test-env -n app
[root@k8s-master1 configmap]# kubectl get configmap -n app
NAME               DATA   AGE
kube-root-ca.crt   1      8d
my-db-properties   1      19m
test-env-config    2      5m11s
[root@k8s-master1 configmap]# kubectl describe configmap test-env-config -n app
Name:         test-env-config
Namespace:    app
Labels:       <none>
Annotations:  <none>

Data
====
APP_NAME:
----
springboot-test-env
JAVA_OPTS_TEST:
----
-Xms512m -Xmx512m

BinaryData
====

Events:  <none>
#咱们将test-env-config这个configmap的配置加载到配置中,咱们创建一个pod
[root@k8s-master1 configmap]# cat app.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-env-cm
  namespace: app
spec:
  containers:
    - name: test-env-cm
      image: alpine
      command: ["/bin/sh","-c","env;sleep 3600"]
      imagePullPolicy: IfNotPresent
      env:
      - name: JAVA_VM_OPTS
        valueFrom:
          configMapKeyRef:
            name: test-env-config       #configmap的名字
            key: JAVA_OPTS_TEST         #表示从test-env-config这个configmap中获取名字为key的value值赋给环境变量名为JAVA_VM_OPTS的环境变量
            
创建pod
[root@k8s-master1 configmap]# kubectl create -f app.yaml
[root@k8s-master1 configmap]# kubectl get pods -n app
NAME          READY   STATUS    RESTARTS   AGE
test-env-cm   1/1     Running   0          6s
#查看容器的日志中的环境信息是不是咱们configmap中的配置
[root@k8s-master1 configmap]# kubectl logs -f test-env-cm -n app
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.255.0.1:443
HOSTNAME=test-env-cm
SHLVL=1
HOME=/root
JAVA_VM_OPTS=-Xms512m -Xmx512m           #在容器的日志中查看到了打印的环境变量的信息了

上面是通过configmap定义环境变量的配置,咱们在演示一个通过configmap定义容器内配置文件相关的配置

[root@k8s-master1 configmap]# kubectl get configmap -n app
NAME               DATA   AGE
kube-root-ca.crt   1      8d
my-db-properties   1      61m
test-env-config    2      47m
当前环境中有三个环境变量,下面咱们将my-db-properties环境变量中的信息写到容器内的配置文件中去
[root@k8s-master1 configmap]# cat app.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-env-cm
  namespace: app
spec:
  containers:
    - name: test-env-cm
      image: alpine
      command: ["/bin/sh","-c","env;sleep 3600"]
      imagePullPolicy: IfNotPresent
      env:
      - name: JAVA_VM_OPTS
        valueFrom:
          configMapKeyRef:
            name: test-env-config       #configmap
            key: JAVA_OPTS_TEST
      volumeMounts:              #加载数据卷
      - name : db-config         #表示加载volumes中的哪个数据卷
        mountPath: "/usr/local/mysql/comfig"     #想要加载的卷中的文件或者加载到哪个目录下
        readOnly: true            #是否只读
  volumes:                        #数据卷挂载configmap
    - name: db-config             #数据卷的名字
      configMap:                  #数据卷的类型为configmap
        name: my-db-properties    #configmap的名字,必须要跟想要加载的configmap的名字相同
        items:                    #对configmap中的key进行映射,如果不指定,默认将configmap中的所有的key转换为同一个文件
        - key: "db.properties"    #configmap中的key
          path: "db.properties"   #将key的值转换为文件


#创建容器
[root@k8s-master1 configmap]# kubectl apply -f app.yaml
pod/test-env-cm created
[root@k8s-master1 configmap]# kubectl get pods -n app
NAME          READY   STATUS    RESTARTS   AGE
test-env-cm   1/1     Running   0          15s
#进入容器内验证配置文件是否根据configmap的配置生成
[root@k8s-master1 configmap]# kubectl exec -it test-env-cm -n app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /usr/local/mysql/comfig/
/usr/local/mysql/comfig # ll
sh: ll: not found
/usr/local/mysql/comfig # ls -ltr
total 0
lrwxrwxrwx    1 root     root            20 Dec  8 06:33 db.properties -> ..data/db.properties
/usr/local/mysql/comfig # cat db.properties
username=root
passwd=admin

SubPath的使用

使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath

配置方式:
1.定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
2.在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同

先创建一个ngix.conf的ConfigMap的配置文件
[root@k8s-master1 configmap]# kubectl create configmap nginx-conf-cm --from-file=nginx.conf -n app
configmap/nginx-conf-cm created
[root@k8s-master1 configmap]# kubectl create configmap nginx-conf-cm --from-file=nginx.conf -n app
configmap/nginx-conf-cm created
[root@k8s-master1 configmap]# kubectl get cm -n app
NAME               DATA   AGE
kube-root-ca.crt   1      8d
my-db-properties   1      168m
nginx-conf-cm      1      65s
test-env-config    2      154m
#查看configmap的内容
[root@k8s-master1 configmap]# kubectl describe cm nginx-conf-cm -n app
Name:         nginx-conf-cm
Namespace:    app
Labels:       <none>
Annotations:  <none>

Data
====
nginx.conf:
----
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  10240;                                     #为了和容器基础镜像内的配置文件做区分,这里的1024我改成了10240
}


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;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}



BinaryData
====

Events:  <none>
#

编辑nginx的deployment,配置ngxin的数据卷
volumeMounts:
        - mountPath: /etc/nginx/nginx.conf
          name: nginx-conf
          subPath: etc/nginx/nginx.conf

volumes:
      - configMap:
          defaultMode: 420
          items:
          - key: nginx.conf
            path: etc/nginx/nginx.conf
          name: nginx-conf-cm
        name: nginx-conf

``

我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?

这得分成几种情况:
默认方式:会更新,更新周期是更新时间 + 缓存时间
subPath:不会更新
变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的

对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置

但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的吻技安删除即可。

```bash
[root@k8s-master1 configmap]# kubectl get cm -n app
NAME               DATA   AGE
kube-root-ca.crt   1      8d
my-db-properties   1      3h32m
nginx-conf-cm      1      40m
test-env-config    2      3h18m

[root@k8s-master1 configmap]# kubectl describe cm my-db-properties -n app
\Name:         my-db-properties
Namespace:    app
Labels:       <none>
Annotations:  <none>

Data
====
db.properties:
----
username=root
passwd=admin


BinaryData
====

Events:  <none>

[root@k8s-master1 configmap]# kubectl get pods -n app
NAME                            READY   STATUS    RESTARTS      AGE
nginx-deploy-85d8dd85f6-cgmpx   1/1     Running   0             17m
test-env-cm                     1/1     Running   2 (21m ago)   141m
[root@k8s-master1 configmap]# kubectl exec -it test-env-cm -n app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cat /usr/local/mysql/comfig/db.properties
username=root
passwd=admin

目前我们基于my-db-properties这个configmap启动了一个pod,当我们修改my-db-properties这个configmap的配置时,pod内的配置如何发生变化

#修改configmap的配置
[root@k8s-master1 configmap]# kubectl edit configmap my-db-properties -n app
configmap/my-db-properties edited
[root@k8s-master1 configmap]# kubectl describe configmap my-db-properties -n app
Name:         my-db-properties
Namespace:    app
Labels:       <none>
Annotations:  <none>

Data
====
db.properties:
----
username=mysql
passwd=123456


BinaryData
====

Events:  <none>

#过度时间进入容器发现pod内的配置发生变化
/usr/local/mysql/comfig # cat db.properties
username=mysql
passwd=123456

上面实现configmap热更新是通过编辑configmap实现了,下面演示另一种实现方式

#修改db.properties文件
[root@k8s-master1 configmap]# cat db.properties
username=xiaoming
passwd=20231208
#kubectl create cm my-db-properties --from-file=db.properties -n app --dry-run -o yaml将要更改的configmap输出成yaml的格式
[root@k8s-master1 configmap]# kubectl create cm my-db-properties --from-file=db.properties -n app --dry-run -o yaml
W1208 17:13:32.687657  100860 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
data:
  db.properties: |
    username=xiaoming
    passwd=20231208
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-db-properties
  namespace: app


[root@k8s-master1 configmap]# kubectl create cm my-db-properties --from-file=db.properties -n app --dry-run -o yaml|kubectl replace -f- -n app
W1208 17:14:06.766426  101067 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
configmap/my-db-properties replaced


当我们不想让ConfigMap发生变化时,只需要编辑comfigmap文件加上immutable: true 的参数即可

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值