【kubernetes系列】Kubernetes之configMap_configmap挂载配置文件-程序员宅基地

技术标签: kubernetes  容器  linux  Kubernetes  

概述

工作中,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如服务需要配置MySQL、Redis等相关信息。而业务上线一般要经历开发环境、测试环境、预发布环境只到最终的线上环境,每一个环境一般都需要其独立的配置。如果我们不能很好的管理这些配置文件,运维工作将顿时变的无比的繁琐而且很容易出错。工作中最佳实践是将应用所需的配置信息于程序进行分离,这样可以使得应用程序被更好的复用,如将应用打包为容器镜像后,可以通过环境变量或外挂文件的方式在创建容器时进行配置注入。我们可以使用如nacos这样的配置管理中心,kubernetes自身也提供了自己的一套方案,即ConfigMap,来实现对容器中应用的配置管理。

使用

ConfigMap:容器应用的配置管理

ConfigMap 供容器使用的典型用法如下:

  • 生成为容器的环境变量。
  • 以 Volume 的形式挂载为容器内部的文件或目录。

ConfiMap 以一个或多个 key:value 的形式保存在 Kubernetes 系统中提供应用使用,即可以用于表示一个变量的值(例如 apploglevel=info),也可以用于表示一个完整配置文件的内容(例如:server.xml=<?xml…>…)

创建 ConfigMap 资源对象

通过 yaml 配置文件方式创建

下面的例子 cm-appvars.yaml 描述了将几个应用所需的变量定义为 ConfigMap 的用法:

[root@k8s-m1 tmp]# cat appvar-cm.yml  
apiVersion: v1
kind: ConfigMap
metadata:
  name: appvars-cm
data:
  apploglevel: info
  appdatadir: /var/log

[root@k8s-m1 tmp]# kubectl apply -f appvar-cm.yml 
configmap/appvars-cm created

[root@k8s-m1 tmp]# kubectl get cm appvars-cm 
NAME         DATA   AGE
appvars-cm   2      25s
[root@k8s-m1 tmp]# kubectl describe cm appvars-cm 
Name:         appvars-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
appdatadir:
----
/var/log
apploglevel:
----
info
Events:  <none>

也可以查看 yaml 形式数据:
[root@k8s-m1 tmp]# kubectl get cm appvars-cm -o yaml

通过 kubectl 命令行方式创建

如果不想使用 yaml 文件,可直接通过 kubectl 也可以创建 ConfigMap,可以使用参数 –from-file 或 –from-literal 指定内容,并且可以在一行命令中指定多个参数。

1、通过 --from-file 参数从文件中进行创建,可以指定 key 的名称,也可以在一个命令行中创建多个 key 的 ConfigMap,文件的内容被设置为 value,语法为:kubectl create configmap NAME --from-file=[key=]source --from-file=[key=]source,其中key可以省略,如果省略的话,默认的key就是文件名。
如:

[root@k8s-m1 tmp]# cat username.txt 
admin[root@k8s-m1 tmp]# cat password.txt 
Abcd@123[root@k8s-m1 tmp]# 
#指定key
[root@k8s-m1 tmp]# kubectl create configmap my-config-1 --from-file=username=/tmp/username.txt --from-file=password=/tmp/password.txt
configmap/my-config-1 created
#不指定key
[root@k8s-m1 tmp]# kubectl create configmap my-config-2 --from-file=/tmp/username.txt --from-file=/tmp/password.txt
configmap/my-config-2 created

2、通过 --from-file 参数从文件中进行创建,文件名都被设置为 key,文件的内容被设置为 value,语法为:kubectl create configmap NAME --from-file=config-files-dir
如:

#注意此方式目录下不能有其他不需要的文件,最好就新建一个单独的文件夹
[root@k8s-m1 configmap]# ll
total 8
-rw-r--r-- 1 root root 8 Jul  6 11:21 password.txt
-rw-r--r-- 1 root root 5 Jul  6 11:21 username.txt

[root@k8s-m1 configmap]# kubectl create configmap my-config-3 --from-file=./
configmap/my-config-3 created

3、–from-literal 从命令行中进行创建,直接将指定的 key:value 创建为 ConfigMap 的内容语法为: kubectl create configmap NAME --from-literal=keyl=valuel --from-literal= key2=value2

[root@k8s-m1 configmap]# kubectl create configmap my-config-4 --from-literal=username=admin --from-literal=password=Admin@123
configmap/my-config-4 created

容器应用对 ConfigMap 的使用有以下两种方法。

  • 通过环境变量获取 ConfigMap 中的内容。(不支持动态更新)
  • 通过 Volume 挂载的方式将 ConfigMap 中的内容关在为容器内部的文件或目录。(支持动态更新)

第一种方式示例(通过环境变量的方式使用 ConfigMap):

方法一:可以单独引用某个key

[root@k8s-m1 tmp]# cat configmap-env-pod.yml 
apiVersion: v1
kind: Pod
metadata:
  name: cm-env-pod
spec:
  containers:
  - name: cm-env-pod
    image: busybox
    command: ["/bin/sh","-c","sleep 3600s"]
    env:
    - name: APPLOGLEVEL             # 定义环境变量的名称
      valueFrom:                    # key "apploglevel" 对应的值
        configMapKeyRef:
          name: appvars-cm          # 环境变量的值取自 appvars-cm 中
          key: apploglevel          # key 为 "apploglevel"
    - name: APPDATADIR
      valueFrom:
        configMapKeyRef:
          name: appvars-cm
          key: appdatadir
  restartPolicy: Never

#部署
[root@k8s-m1 tmp]# kubectl  apply  -f configmap-env-pod.yml 
pod/cm-env-pod created
#检查
[root@k8s-m1 tmp]# kubectl exec -it cm-env-pod -- /bin/sh
/ # env|egrep -i 'app'
APPDATADIR=/var/log
APPLOGLEVEL=info
#通过检查发现容器内部的环境变量使用 ConfigMap appvars-cm 中的值进行了正确的设置

方法二:直接引用所有的key
从 Kubernetes 1.6 开始,引入了一个新的字段 envFrom,实现在 Pod 环境内将 ConfigMap(也可以用于 Secret 资源对象)中所有定义的 key=value 自动生成为环境变量:

[root@k8s-m1 tmp]# cat configmap-env-pod-all.yml 
apiVersion: v1
kind: Pod
metadata:
  name: cm-env-pod-all
spec:
  containers:
    - name: cm-env-pod-all
      image: busybox
      command: ["/bin/sh","-c","sleep  3600"]
      envFrom:
      - configMapRef:
          name: appvars-cm   # 根据 cm-appvars 中的 key=value 自动生成环境变量
  restartPolicy: Never
#部署
[root@k8s-m1 tmp]# kubectl apply  -f configmap-env-pod-all.yml 
pod/cm-env-pod-all created
#检查
[root@k8s-m1 tmp]# kubectl exec -it cm-env-pod-all -- /bin/sh
/ # env|egrep -i app
apploglevel=info
appdatadir=/var/log
#通过结果发现configmap appvars-cm中所有的key都被引用,大小写也保持原有的格式

注:需要说明的是 ,环境变量的名称受 POSIX 命名规范([a-zA-Z][a-zA-Z0-9]*)约束 ,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个 Event 来描 述环境变量无法生成,但并不阻止 Pod 的启动。

第二种方式示例(通过 VolumeMount 使用 ConfigMap)

挂载多个文件
使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为文件内容,下面是一个示例:(当一个configmap中有多个key-value键值对时要注意每一个key-value键值对都会生成一个文件)

[root@k8s-m1 tmp]# cat configmap-volume-opod.yml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
  namespace: default
  labels:
    app: nginx1
spec:
  containers:
  - name: configmap-volume-pod
    image: nginx
    volumeMounts:
      - name: config      # 指定要挂在的名称
        mountPath: /etc/nginx/conf.d/    #指定要挂在到哪里
    imagePullPolicy: IfNotPresent
    ports:
     - name: http
       containerPort: 80
     - name: https
       containerPort: 443
  volumes:
    - name: config         # 定义一个挂在名称
      configMap:
        name: appvars-cm         #configmap name
#部署
[root@k8s-m1 tmp]# kubectl apply -f configmap-volume-opod.yml 
pod/configmap-volume-pod created
#检查
[root@k8s-m1 tmp]# kubectl exec -it configmap-volume-pod -- /bin/bash
root@configmap-volume-pod:/# ls /etc/nginx/conf.d/
appdatadir  apploglevel
root@configmap-volume-pod:/# 
exit
command terminated with exit code 130

#编辑configmap[root@k8s-master volumes]# kubectl edit cm cm-appvarsconfigmap/cm-appvars edited

#查看是否编辑生效(修改已经生效)[root@master-1 app]# kubectl exec -it nginx-test4 – printenv

挂载单个文件
使用volume将ConfigMap作为文件或目录直接挂载到某个服务上做服务的配置文件,例如下面将www.conf配置文件使用configmap的方式挂载到nginx的配置文件目录下作为nginx的配置文件。此方式还支持动态修改

[root@k8s-m1 tmp]# cat www.conf 
server {
    
    server_name myapp.magedu.com;
    listen 80;
    root /data/web/html;
}
#部署configmap
[root@k8s-m1 tmp]#kubectl create configmap www-config --from-file=./www.conf 

[root@k8s-m1 tmp]# cat configmap-volume-pod.yml 
apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
  namespace: default
  labels:
    app: nginx1
spec:
  containers:
  - name: configmap-volume-pod
    image: nginx
    volumeMounts:
      - name: config      # 指定要挂在的名称
        mountPath: /etc/nginx/conf.d/    #指定要挂在到哪里
    imagePullPolicy: IfNotPresent
    ports:
     - name: http
       containerPort: 80
     - name: https
       containerPort: 443
  volumes:
    - name: config         # 定义一个挂在名称
      configMap:
        name: www-config  #configmap name
#使用新的configmap www-config部署
[root@k8s-m1 tmp]# kubectl apply -f configmap-volume-pod.yml 
pod/configmap-volume-pod created

[root@k8s-m1 tmp]# kubectl exec -it configmap-volume-pod -- nginx -T
#查看最后几行,端口现在是80
# configuration file /etc/nginx/conf.d/www.conf:
server {
    
    server_name myapp.magedu.com;
    listen 80;
    root /data/web/html;
}

#修改configmap www-config的端口设置,将80端口 改成 443端口
[root@k8s-m1 tmp]# kubectl edit cm www-config 

#隔一段时间检查nginx是否加载新的配置,大概几十秒
# configuration file /etc/nginx/conf.d/www.conf:
server {
    
    server_name myapp.magedu.com;
    listen 443;
    root /data/web/html;
}

加粗样式

使用 ConfigMap 的限制条件

  • ConfigMap 必须在 Pod 之前创建。
  • ConfigMap 受 Namespace 限制,只有处于同 Namespace 的 Pod 可以引用它。
  • kubelet 只支持可以被 API Server 管理的 Pod 使用 ConfigMap。
  • kubelet 在本 Node 上通过 --manifest-url 或-config 自动创建的静态 Pod 将无法引用 ConfigMap。
  • 在 Pod 对 ConfigMap 进行挂载(VolumeMount)操作时,容器内部只能挂载为 ”目录“,无法挂在为文件。在挂载到容器内部后,目录中将包含 ConfigMap 定义的每个 item,如果该目录下原来还有其他文件(包括文件夹),则容器内的该目录将会被挂载的 ConfigMap 覆盖。如果应用程序要挂载的文件夹下面有其他的文件或者文件夹,则需要进行额外的处理。可以将 ConfigMap 挂载到容器内部的临时目录,在通过启动脚本将配置文件复制或者链接到(cp 或者 link、ln 命令)应用所用的实际配置目录下。

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/margu_168/article/details/131558960

智能推荐

【机器学习小常识】“parameters(参数)” 与 “hyperparameters(超参数)”的概念及区别详解_parameters参数-程序员宅基地

文章浏览阅读8.1k次,点赞8次,收藏32次。目录1、参数与超参数概念1.什么是参数2.什么是超参数2、二者有什么区别1.得到方式不同2.影响因素不同3.可控程度不同说在前面的话有些概念其实,很纠结,它到底是属于机器学习呢,还是属于深度学习呢?比如说,分类与回归,这个有些是很难界定的,有人说,它属于深度学习,又有人说,它属于机器学习。其实争论这些,好像并无太大意义,就像一个男生对一个姑娘宠溺的说:这天下..._parameters参数

TNS-12535: TNS: 操作超时-程序员宅基地

文章浏览阅读333次。今天一个服务器装了数据库后,本机可以登录了,但是其他机器登录就是提示 tns连接超时,不管是用tnsping ip还是tnsping sid命令,都是提示TNS-12535: TNS: 操作超时。原因:一定要把xp系统自身的防火墙关闭,而不是一些杀毒软件的防火墙关闭。 ..._linux tnsping timeout 12535

linux qt5启动失败,Qt Creator 启动失败 可能的解决办法-程序员宅基地

文章浏览阅读619次。blocking and unblocking mechanism for linux drivern code概念: 1> 阻塞操作 是指在执行设备操作时,若不能获得资源,则挂起进程直到满足操作条件后再进行操作.被挂起的进程进入休眠,被从调度器移走,直到条件满足: 2> 非阻塞操作 在 ...学习笔记:java线程安全首先得明白什么是线程安全: 线程安全是编程中的术语,指..._linux下无法启动qtcreator

python存txt不删之前_我怎样才能保存到一个.txt文件而不覆盖其中已经存在的所有内容?...-程序员宅基地

文章浏览阅读604次。我在空闲时间做一个应该是非常基本的操作系统。但是,我试图创建它以便您可以拥有任意多个用户,但是每次我创建一个新用户时,它都会删除旧用户。到目前为止,我有这个:def typer():print("Start typing to get started. Unfortunately, you cannot currently save your files.")typerCMD = input(" ..._txt存文件之前的留下来

请使用c++通过遗传算法解决旅行商问题-程序员宅基地

文章浏览阅读60次。我可以向您提供关于使用遗传算法解决旅行商问题的一些指导。首先,需要确定旅行商问题的地图数据,然后编写代码,创建一个遗传算法,然后对算法进行调优,以获得最佳路线。最后,将结果显示在地图上,以便查看最终路线。...

学习JAVA游戏服务器开发需要了解的情况_java游戏服务器开发用到数据库吗-程序员宅基地

文章浏览阅读1.3w次,点赞21次,收藏85次。一,游戏服务器开发的工作介绍近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换个环境等等。不管出于什么原因吧,做为一名几年的游戏服务器开发者,当然是持欢迎态度的,那么我就先介绍一下游戏服务器开发的工作吧,游戏服务器开发具体要做哪些工作呢?1,团队沟通基本上不管做什么开发,都是一个团队来完..._java游戏服务器开发用到数据库吗

随便推点

Ribbon实战与原理剖析_ribbon原理-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏11次。通过实现IRule接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。}_ribbon原理

Centos 安装GPU并行lammps_centos lammps gpu-程序员宅基地

文章浏览阅读6.1k次,点赞6次,收藏16次。以下描述了如何在Centos服务器上安装GPU版本的lammps。安装环境目标属性系统Linux/CentOS 7.6CPU12*Intel Xeon CPU E5-2609 v3 @ 1.90GHzGPU2*NVIDIA Tesla K80/CUDA 8.0安装准备1. CUDA由于是安装GPU版本lammps,首先应确保系统安装有显卡所对..._centos lammps gpu

小米HR:说说对API有多少的理解? 看了后,和面试官扯皮,吹牛逼!绰绰有余!_能直接温hr是不是刷api的吗-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏32次。目录什么是API?什么是API测试API测试的测试用例:API测试方法:如何进行API测试API测试的最佳做法:API测试检测到的错误类型API测试工具API测试的挑战结论:最后什么是API?API(全称Application Programming Interface)是两个单独的软件系统之间的通信和数据交换。实现API的软件系统包含可以由另一个软件系统执行的功能/子例程。什么是API测试API测试是一种用于验证API(应用程序编程接口)的._能直接温hr是不是刷api的吗

Android开发 入门篇(二) - 常用UI控件_能(textview、edittext、button、progressbar、alertdialog-程序员宅基地

文章浏览阅读915次,点赞2次,收藏7次。date: 2020-01-12 21:46:05文章目录控件ButtonTextViewEditTextImageViewProgressBarAlertDialogProgressDialog布局LenearLayoutandroid:layout_gravityandroid:layout_weightRelativeLayoutFrameLayout百分比布局其他自定义控件ListVie..._能(textview、edittext、button、progressbar、alertdialog、progressdialog、lis

python3.4中文版下载-Python 3.4 入门指南 官方中文版.pdf-程序员宅基地

文章浏览阅读1.2k次。【实例简介】【实例截图】【核心代码】CONTENTS1 开胃菜 22 使用 Python 解释器 42.1 调用 Python 解释器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 解释器及其环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...._python_3.4_入门指南(官方中文版).pdf

java json 修改字段_我们如何使用Java中的Jackson来更改JSON中的字段名称?-程序员宅基地

文章浏览阅读1.2k次。杰克逊注释@JsonProperty上使用期间的属性或方法的序列或反串行化的JSON。它带有一个可选的' name '参数,当属性名称与JSON中的' key '名称不同时,该参数很有用。默认情况下,如果键名称与属性名称匹配,则将值映射到属性值。在下面的示例中,我们可以使用@JsonProperty注解更改JSON中的字段名称。示例importjava.io.IOException;import...

推荐文章

热门文章

相关标签