一  如何有效且更好的将配置写到pod的容器中

  

  考虑一个问题,就是在传统的应用中,程序里面需要的配置一般以配置文件的形式或者shell脚本里面的参数是在执行的时候在命令行里面进行添加,但是在kubernets的pod中,应该如何将变量引入到pod的容器中呢?

二  容器启动的时候是如何将变量引入容器中的

  

  2.1  了解ENTRYENTRYPOINT以及CMD

    Dockerfile中两种指令分别代表容器启动时被调用的可执行程序以及参数

    • ENTRYPOINT——定义容器启动时候的可执行程序
    • CMD——指定参数传递给ENTRYPOINT的
    • 当ENTRYPOINT不存在的时候CMD里面也可以当作容器启动时候的可执行程序

  2.2 了解shell以及exec形式的区别

    有以下两种形式的指令均可以作为容器的启动命令

    • shell形式——如ENTRYPOINT node app.js
    • exec形式——如ENTRYPOINT ['node','app.js']
    • 两者的区别在于shell形式的启动进程将会以shell的形式启动,但是往往这是多余的,所以尽量使用exec的形式

三 在kubernets中覆盖命令以及参数

  

  3.1  我们可以在pod中添加参数用以覆盖pod里面容器中的参数

apiVersion: v1
kind: pod
......
spec:
- image: some/image
command: [ "/bin/command" ]
args: ["args1","args2","args3"]
  • 在pod中我们用command来替换容器中的可执行文(等同于容器里面的entrypoint)
  • 用args来替换容器中的 参数(等同于容器里面的cmd)

四 为容器设置环境变量

  4.1  如前所述,容器化应用通常会使用环境变量的,同样在kubernets的pod中也支持使用环境的形式将配置写入到pod的容器中来供应用使用

......
kind: pod
spec:
containers:
- image: luksa/fortune:env
env:
- name: INTERVAL
value: "30"
- name: SECOND_VAR
value: "$(INTERVAL)bar"
name: html-generator
  • 在环境变量中添加一个新的变量
  • 可以看出环境变量的级别是容器级别而非pod级别的
  • 甚至我们可以通过如上的形式来引用环境变量中的变量
  • 这是一种方式,但是硬编码的形式不足之处在于无法对该pod进行复用

  

五  利用Configmap解耦配置

  5.1  kubernets允许将配置选项分离到单独的资源对象中Configmap,本质上就是一个键值对映射,值既可以是一个短字面的量也可以是一个完整的配置文件,应用无须直接读取configmap,甚至都可以不知道它的存在,映射的内容通过环境变量或者卷文件的形式传递给容器,然后容器里面的应用通过${ENV_VAR}来进行引用,从而可以达到将configmap的条目当作命令行参数传递给进程的效果。

  5.2 使用kubectl创建ConfigMap 

k create configmap fortune-config --from-literal=sleep-interval=25

 5.3 可以通过--from-literal参数为某个configmap添加多个键值对

k create configmap wxm_test_configmap --from-literal=name=wxm --from-literal=age=27 --from-literal=job=deploy

5.4 通过yaml文件创建configmap

apiVersion: v1
data:
firstkey:firstvalue
secondkey:secondvalue
kind: ConfigMap
metadata:
name: first-configmap

  5.5 从文件内容创建configmap

k create configmap test-create-configmap-from-file-second --from-file=create-configmap-from-file.conf --from-file=wxm.conf

[root@node01 configmap]# k get configmap test-create-configmap-from-file-second -o yaml
apiVersion: v1
data:
create-configmap-from-file.conf: |
this is a test
the content is nothing
wxm.conf: |
wq
kind: ConfigMap
metadata:
creationTimestamp: "2021-01-04T06:59:34Z"
name: test-create-configmap-from-file-second
namespace: default
resourceVersion: "2019025"
selfLink: /api/v1/namespaces/default/configmaps/test-create-configmap-from-file-second
uid: 66f19350-4e5a-11eb-ae9a-5254002a5691
  • 从文件创建configmap的话和命令行创建configmap没有很大的差别,通过多次指定--from-file来指定文件路径进行创建
  • 从文件创建configmap之后,文件的内容会被当作值,且文件名称会被当作键存储在kubernets集群中去

  5.6 通过指定文件夹来创建configmap

k create configmap test-create-config-from-dir --from-file=/root/wxm/Chapter07/configmap

k get configmap test-create-config-from-dir -o yaml
apiVersion: v1
data:
create-configmap-from-file.conf: |
this is a test
the content is nothing
haha.conf: "\twrcdw fecs\n"
wxm.conf: |
wq
kind: ConfigMap
metadata:
creationTimestamp: "2021-01-04T07:08:16Z"
name: test-create-config-from-dir
namespace: default
resourceVersion: "2020190"
selfLink: /api/v1/namespaces/default/configmaps/test-create-config-from-dir
uid: 9db8ed42-4e5b-11eb-ae9a-5254002a5691
  • 通过指定目录名称来创建configmap,目录下面所有的合法命名文件都会创建数据

六  给容器传递ConfigMap作为环境变量

  6.1 通过yaml文件创建configmap内容如下所示

apiVersion: v1
kind: Pod
metadata:
name: fortune-env-from-configmap
spec:
containers:
- image: luksa/fortune:env
name: test-for-configmap
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name:fortune-config
key: sleep-interval

  6.2 进入创建的容器查看是否有渲染为环境变量

[root@node01 Chapter07]# k get po
NAME READY STATUS RESTARTS AGE
fortune 2/2 Running 0 7d4h
fortune-env-from-configmap 1/1 Running 0 82s [root@node01 Chapter07]# k exec fortune-env-from-configmap -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=fortune-env-from-configmap
INTERVAL=25
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
HOME=/root
  • 可以看到确实会将集群中之前存在的configmap中sleep-interval的值渲染到了容器的变量
  • 这里设置了一个环境变量INTERVAL,并将configmap的sleep-interval传递给了它
  • 值得说明的是,如果pod里面引用了不存在的configmap的话,容器会被正常调度,但是会启动失败,当被引用的configmap被创建的时候,失败的容器会被自动重启

6.3 将所有的configmap的条例全部渲染到容器的环境变量中

apiVersion: v1
kind: Pod
meatdata:
name: test-for-all-env-from-configmap
spec:
containers:
- image: luksa/fortune:env
name: test-for-env-from-configmap
envFrom:
- prefix: CONFIG_
configMapRef:
name: wxm-test-configmap
  • 这个pod会引用wxm-test-configmap这个的下面的所有条目渲染为环境变量
  • prefix这个参数为当各个变量添加前缀

6.4 查看创建的容器里面是否有这些环境变量

[root@node01 Chapter07]# k exec test-for-all-env-from-configmap -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=test-for-all-env-from-configmap
CONFIG_age=27
CONFIG_job=deploy
CONFIG_name=
wxm
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
HOME=/root
  • 可以看到之前创建的configmap都渲染到了容器里面

6.5 还可以将configmap中条目当作参数传递给容器中主进程

apiVersion: v1
kind: Pod
metadata:
name: fortune-args-from-configmap
spec:
containers:
- image: luksa/fortune:args
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: fortune-config
key: sleep-interval
args: ["$(INTERVAL)"]
  • 添加args参数将已经渲染到容器里面的环境变量的参数当作命令行参数传递给容器的主进程

6.6 使用configmap卷将条目暴露为文件

apiVersion: v1
kind: Pod
metadata:
name: fortune-configmap-volume
spec:
containers:
- image: nginx:alpine
name: web-server
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: config
configMap:
name: fortune-config
items:
- key: my-nginx-config.conf
path: gzip.conf
  • 将configmap以configmap卷的形式挂载到容器当中
  • 并将指定的条例暴露为卷,其余的则会被渲染为环境变量
  • 有一点需要说明的是,挂载卷到某个文件夹,会使该文件夹里面所有的内容都会被隐藏起来

  

6.7 如何将文件夹挂载到某个文件夹下面并且不会使其中的文件被隐藏呢?

apiVersion: v1
kind: Pod
metadata:
name: fortune-configmap-volume-bak-2
spec:
containers:
- image: nginx:alpine
name: web-server
volumeMounts:
- name: config
mountPath: /etc/wxmconfig.conf
subPath: gzip.conf

readOnly: true
volumes:
- name: config
configMap:
name: fortune-config
    defaultMode: "6600"
items:
- key: my-nginx-config.conf
path: gzip.conf
  • 这个例子中,通过将fortune-config的configmap中的my-nginx-config.conf条目渲染成gzip的configmap卷
  • 之后挂载到web-server /etc/wxmconfig.conf下面,这么做的好处是使得/etc下面的内容不会被隐藏
  • 但是同样有个缺点就是无法被更新
  • defaultMode:参数可以指定configmap挂载的权限

6.8 之前提到的,为了能够快速替换容器中的配置再不重启容器的情况下,通过pod中的容器挂载configmap卷,即可快速更新容器中的内容

apiVersion: v1
kind: Pod
metadata:
name: fortune-configmap-volume-2
spec:
containers:
- image: nginx:alpine
name: web-server
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: config
configMap:
name: fortune-config
  • 这个pod挂载了fortune-config的configmap卷

更改configmap卷

apiVersion: v1
data:
my-nginx-config.conf: |
server {
listen 80;
server_name www.kubia.com;
gzip on;
gzip_types text/plain application/xml;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
sleep-interval: |
28
kind: ConfigMap
metadata:
creationTimestamp: "2021-01-04T08:37:05Z"
name: fortune-config
namespace: default
resourceVersion: "2063247"
selfLink: /api/v1/namespaces/default/configmaps/fortune-config
uid: 067d2f8c-4e68-11eb-ae9a-5254002a5691

[root@node01 Chapter07]# k exec fortune-configmap-volume-2 -- cat /etc/nginx/conf.d/sleep-interval
28
  • 将之前sleep-interval的内容为28,经过一段时间后,configmap里面的内容被替换为28
  • 有一点疑问是渲染到环境变量里面之后的值无法更改
  • 是否可以通过修改configmap关联的文件来修改configmap的内容
  • pod里面的文件是如何被更新的,是通过连接一个..data/linkfile的文件,每次被更新之后linkfile会被更新之后指向被更新的文件如下所示
  • 有一点需要注意的是挂载的是容器的单个文件而不是卷,则内容不会被更新
[root@node01 Chapter07]# k exec fortune-configmap-volume-2 -- ls -lA  /etc/nginx/conf.d/
total 0
drwxr-xr-x 2 root root 56 Jan 4 14:26 ..2021_01_04_14_26_37.288908214
lrwxrwxrwx 1 root root 31 Jan 4 14:26 ..data -> ..2021_01_04_14_26_37.288908214
lrwxrwxrwx 1 root root 27 Jan 4 14:14 my-nginx-config.conf -> ..data/my-nginx-config.conf
lrwxrwxrwx 1 root root 21 Jan 4 14:14 sleep-interval -> ..data/sleep-interval

kubernets之configMap和secret的更多相关文章

  1. kubernetes系列12—二个特色的存储卷configmap和secret

    本文收录在容器技术学习系列文章总目录 1.configmap 1.1 认识configmap ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.ConfigMa ...

  2. kubernetes ConfigMap和Secret:配置应用程序

    7.1.配置容器化应用程序 7.2.向容器传递命令行参数 7.2.1.待Docker中定义命令与参数 1.了解ENTRYPOINT与CMD ENTRYPOINT定义容器启动时被调用的可以执行程序 CM ...

  3. k8s之configmap和secret

    1.configmap configmap和secret是两种特殊的存储卷,它们不是给pod提供存储空间用的,而是给管理员或者用户提供了从外部向pod内部注入信息的方式. configmap:把配置文 ...

  4. 九,configMap及secret的基本使用

    目录 制定容器配置的方式 configMap(存储数据为明文,敏感数据慎用) 创建configMap的几种方式 命令行创建和测试configMap实例 创建一个Pod 挂载测试 通过指定文件创建con ...

  5. 容器编排系统K8s之ConfigMap、Secret资源

    前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...

  6. k8s env、configmap、secret外部数据加载配置

    K8s提供了多种外部数据注入容器的方式,今天我们主要学习环境变量.ConfigMap以及Secret的使用和配置. 环境变量 在docker项目中,对一个容器添加环境变量可以在容器创建时通过-e EN ...

  7. Kubernetes中的Configmap和Secret

    本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 应用场景:镜像往往是一个应用的基础,还有很多需要 ...

  8. (十)Kubernetes ConfigMap和Secret

    ConfigMap资源 介绍 ConfigMap是让配置文件从镜像中解耦,让镜像的可移植性和可复制性.许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.这些配置信息需要与docker im ...

  9. k8s之Configmap与Secret

    ConfigMap:k8s标准资源,将配置文件做成k8s资源,使其它资源可加载其中配置 Secret:实现加密功能的安全配置文件.由多个key:val中组成 创建configmap资源,可直接使用ku ...

随机推荐

  1. Vue3源码解析(computed-计算属性)

    作者:秦志英 前言 上一篇文章中我们分析了Vue3响应式的整个流程,本篇文章我们将分析Vue3中的computed计算属性是如何实现的. 在Vue2中我们已经对计算属性了解的很清楚了,在Vue3中提供 ...

  2. 聊聊Spring的FactoryBean其实没那么难

    前言 谈到Spring的FactoryBean,就会知道Spring中经典的面试题:FactoryBean和BeanFactory的区别.我们这里就简单概括下: . BeanFactory是接口,提供 ...

  3. DRF框架笔记

    序列化器类的定义格式? 继承serializers.Serializer:字段 = serializers.字段类型(选项参数) 序列化器类的基本使用? 序列化器类(instance=None, da ...

  4. 软件工程与UML的第一次课

    | 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzzcxy/2018SE1 | | 这个作业要求在哪里 | https://edu.cnblogs.com ...

  5. Python分析世界幸福指数

    前言 民意测验机构盖洛普从2012年起,每年都会在联合国计划下发布<世界幸福指数报告>,报告会综合两年内150多个国家的国民对其所处社会.城市和自然环境等因素进行评价后,再根据他们所感知的 ...

  6. 记一次 HBase Master is initializing 问题处理

    问题 hbase shell中建立建表出错 分析 org.apache.hadoop.hbase.PleaseHoldException: Master is initializing代表Master ...

  7. 微服务开发的最大痛点-分布式事务SEATA入门简介

    前言 在微服务开发中,存在诸多的开发痛点,例如分布式事务.全链路跟踪.限流降级和服务平滑上下线等.而在这其中,分布式事务是最让开发者头痛的.那分布式事务是什么呢? 分布式事务就是指事务的参与者.支持事 ...

  8. sychronized的实现原理和应用

    一.synchronized的使用 1.1修饰方法 public synchronized void method() { // todo } 1.2修饰代码块 public void run() { ...

  9. c#——ToString()的各种用法

    ToString()的各种用法 string str = ""; str = 123456.ToString("N"); //生成 12,3456.00 str ...

  10. git pull 和git fetch的区别

    git pull 是上下文环境敏感的,它会把所有的提交自动给你合并到当前分支当中,没有复查的过程 而git fetch只是把拉去的提交存储到本地仓库中,真正合并到主分支中需要使用merage head ...