我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能。将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是在面临大规模容器集群的场景下就显得力不从心了,因此我们可以使用ConfigMap进行统一配置。

一、ConfigMap介绍

ConfigMap是Kubernetes中的一种资源对象,用于将应用配置信息存储到键值对中,Pod在使用时,将其用作环境变量、命令行参数或者存储卷中的配置文件。通过ConfigMap可以实现应用配置与容器解耦,极大方便应用配置的维护。我们通过Yaml定义一个ConfigMap并通过kubectl create创建:

$ cat cm-appvars.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars
data:
var1: a
var2: b
var3: c
$ sudo kubectl create -f cm-appvars.yaml
configmap/cm-appvars created
$ sudo kubectl get configmap
NAME DATA AGE
cm-appvars 3 13s
kube-root-ca.crt 1 28d
$ sudo kubectl describe configmap cm-appvars
Name: cm-appvars
Namespace: default
Labels: <none>
Annotations: <none> Data
====
var1:
----
a
var2:
----
b
var3:
----
c
Events: <none>

二、在Pod中使用ConfigMap

1、通过环境变量方式使用ConfigMap

我们通过Busybox进行实验,Pod定义如下:

apiVersion: v1
kind: Pod
metadata:
name: busybox-pod
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "env | grep VAR"]
env:
- name: VAR_A
valueFrom:
configMapKeyRef:
name: cm-appvars
key: var1
- name: VAR_B
valueFrom:
configMapKeyRef:
name: cm-appvars
key: var2
restartPolicy: Never

我们busybox-pod在定义时通过valueFrom.configMapKeyRef为要注入的环境变量赋值,pod启动后通过env命令打印环境变量并退出。(这里设置restartPolicy: Never避免Pod执行完命令退出后再次重启)

我们创建Pod并通过kubectl logs命令进行验证:

$ sudo kubectl create -f busy_pod.yaml
pod/busybox-pod created
$ sudo kubectl logs busybox-pod
VAR_A=a
VAR_B=b

根据输出,我们可以得知容器内部的环境变量通过使用ConfigMap的值已经被正确配置。

2、通过挂载Volume使用ConfigMap

还是以busybox为例,我们在Pod定义中,将cm-appvars中的内容以文件的形式挂载到容器内部的/vars目录下。修改后的Pod定义文件如下:

apiVersion: v1
kind: Pod
metadata:
name: busybox-pod
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "top"]
volumeMounts:
- name: vars
mountPath: /vars
volumes:
- name: vars
configMap:
name: cm-appvars
items:
- key: var1 # key=var1
path: var1 # value将以var1文件名方式进行挂载
- key: var2 # key=var2
path: var2 # value将以var2文件名方式进行挂载

接着我们创建Pod并进入容器中查看是否有对应配置信息的文件:

$ sudo kubectl create -f busy_pod.yaml
pod/busybox-pod created
$ sudo kubectl exec -it busybox-pod /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ls
bin dev etc home proc root sys tmp usr var vars / # cd vars
/vars # ls
var1 var2
/vars # cat var1
a/vars #

其实我们这里的例子很简单,在实际使用时,我们可以在ConfigMap中存储配置文件内容(如redis.conf、server.xml等),然后通过volume方式挂载到Pod中供应用加载。

三、ConfigMap的使用注意事项

在使用ConfigMap时需要注意以下几点:

1)ConfigMap必须在Pod之前创建,这样Pod才能使用它;

2)ConfigMap只能用于相同命名空间中的Pod;

3)ConfigMap无法用于静态Pod。

Docker 与 K8S学习笔记(十九)—— Pod的配置管理的更多相关文章

  1. Docker 与 K8S学习笔记(九)—— 容器间通信

    容器之间可通过IP.Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下. 一.IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使 ...

  2. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  3. (C/C++学习笔记) 十九. 模板

    十九. 模板 ● 模板的基本概念 模板(template) 函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 语法: template <<模 ...

  4. Docker 与 K8S学习笔记(二十五)—— Pod的各种调度策略(上)

    上一篇,我们学习了各种工作负载的使用,工作负载它会自动帮我们完成Pod的调度和部署,但有时我们需要自己定义Pod的调度策略,这个时候该怎么办呢?今天我们就来看一下如何定义Pod调度策略. 一.Node ...

  5. Docker 与 K8S学习笔记(十八)—— Pod的使用

    Pod 是一组紧密关联的容器集合,它们共享IPC.Network和UTS namespace,是 Kubernetes 调度的基本单元.Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件 ...

  6. Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息

    Kubernetes在创建Pod时,会为Pod和容器设置一些额外的信息,比如Pod名称.Pod IP.Node IP.Label.Annotation.资源限制等,我们经常会在应用程序中使用到这些数据 ...

  7. Docker 与 K8S学习笔记(二十二)—— 高效使用kubectl的小技巧

    kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用. 一.命令自动补全 kubec ...

  8. Docker 与 K8S学习笔记(十)—— 容器的端口映射

    我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...

  9. Docker 与 K8S学习笔记(十 二)容器间数据共享

    数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...

随机推荐

  1. Qt之QListView和QStandardItemModel用法

    note 个人理解, QListView 用于 显示数据,而数据的逻辑维护则由 QStandardItemModel 完成. QStandardItemModel 创建 if (nullptr == ...

  2. C库函数将字符串转大小写

    头文件 #include <algorithm> transform 函数 转大写 std::string str_write; // 全部转为大写 std::transform(str_ ...

  3. c++之常见数据类型(int,double,float,long double long long 与std::string之间)相互转换(含MFC的CString、含C++11新特性函数)

    --- 已经通过初步测试---- ------------------ 下面的是传统常见数据类型的转换(非c++11)---------------  std::string 与其他常用类型相互转换, ...

  4. 【LeetCode】1436. 旅行终点站 Destination City (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 set 日期 题目地址:https://leetcod ...

  5. 【LeetCode】648. Replace Words 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 set 字典 前缀树 日期 题目地址:https:/ ...

  6. 【LeetCode】647. Palindromic Substrings 解题报告(Python)

    [LeetCode]647. Palindromic Substrings 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/p ...

  7. hdu-1299 Diophantus of Alexandria(分解素因子)

    思路: 因为x,y必须要大与n,那么将y设为(n+k);那么根据等式可求的x=(n2)/k+n;因为y为整数所以k要整除n*n; 那么符合上面等式的x,y的个数就变为求能被n*n整除的数k的个数,且k ...

  8. pandas tutorial 2

    @ 目录 Group_By 对数据进行分组 对 group进行迭代 选择一个group get_group() Aggregations 在group的基础上传入函数整合 Transformation ...

  9. 【MySQL作业】SELECT 数据查询——美和易思MySQL运算符应用习题

    点击打开所使用到的数据库>>> 1.查询指定姓名的客户(如"张晓静")的地址和电话号码. select address 地址, phone 电话号码 from c ...

  10. Mysql 8.0版本以上和8.0以下jar包版本 需要注意的 URL连接参数useSSL、serverTimezone 相关问题

    在语法上的需要注意的: MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = "com.mysql.jdbc ...