一  如何有效且更好的将配置写到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. Centos7.8安装Redis

    一.安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装  [root@localhost local]# ...

  2. js下 Day03、DOM操作--节点方法

    语法:parentNode.appendChild(child) 功能:向父节点的子节点列表的末尾添加新的子节点 语法:parentNode.removeChild(child) 功能:从子节点列表中 ...

  3. [日常摸鱼]poj2778 DNA Sequence

    这题太神啦 题意:求长度为$n$的不包含给定DNA序列的DNA序列个数,给定的不超过10个 构建出Trie图,用$danger[i]$来表示不能走到$i$,对于DNA序列结尾的结点$danger$设为 ...

  4. sql中大于等于小于的写法

    由于在mybatis框架的xml中<= , >=解析会出现问题,编译报错,所以需要转译第一种写法: 原符号 < <= > >= & ' "替换符号 ...

  5. sql中筛选条件为空值

    <select id="getEmployeeBasicInformationList" resultType="org.springblade.entity.Al ...

  6. 阿里面试:问springBoot自动装配我这样回答的,面试官对我竖起了大拇指

    引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...

  7. package和import机制

    package是Java中的包机制,包机制的作用是方便为了程序的管理.不同功能的类机制分别存放在不同的包下面.(按照功能划分,不同的包有着不同的性质) package怎么使用:package是一个关键 ...

  8. 为什么 StackOverflow 上的代码片段会摧毁你的项目?

    昨天公司里碰到一件令人哑然失笑的事情.帮朋友公司做的一个项目,做SIT测试的时候发现一些bug,仔细查了下原因,原来是因为当初觉得这个项目比较简单,交给了几个新入职的新丁,也算是给他们练练手,结果其中 ...

  9. SSM框架实现多张图片和其他数据一起上传

    一.SSM+Form 多张图片和其他数据一起上传, 1.导包: commons-fileupload-1.3.3.jar commons-io-2.4.jar 2.springmvc.xml 文件配置 ...

  10. java类的主动使用/被动使用

    对类的使用方式分为:主动使用.被动使用 所有的java虚拟机实现必须在每个类或接口被java程序"首次主动使用"时才初始化他们 ps:被动使用不会初始化类,但是有可能会加载类(JV ...