在 k8s 中使用配置主要可以有以下几种方式来实现:

  1. 向容器传递命令行参数

  2. 为每个容器指定自定义的环境变量

  3. 通过特殊类型的卷将配置文件挂载到容器中

在 k8s 中覆盖命令行参数

和 docker 内一样,可以定义容器启动中的执行程序和参数,并且镜像的 ENTRYPOINT 和 CMD 会被 k8s 中的 command 和 args 覆盖。

Docker K8s 描述
ENTRYPOINT command 容器中运行可执行文件
CMD args 传给可执行文件的参数

在pod定义中可以这样子声明 command 和 args

kind: Pod
spec:
containers:
- image: some/image
command: ["/bin/command"]
args: ["args1", "args2", "args3"]

在容器中指定环境变量

在 k8s 中声明环境变量,在容器中可以通过环境变量来进行配置,但是需要注意的是,在每个容器中,k8s 会自动暴露相同命名空间下每个 service 对应的环境变量。虽然环境变量是被设置在 pod 的容器定义中,但是并非是 pod 级别的,比如说运维需要在容器中声明一些运维中特殊声明的环境变量。比如集群中的dns域名解析,当前宿主ip,当前pod的ip等等。

kind: Pod
spec:
containers:
- image: xxx/image
env:
- name: INTERVAL
value: "30"
name: env-config-name
...

在环境变量中引用另一个环境变量

env:
- name: OTHER_VAR
value: "foo"
- name: THIS_VAR
value: "$(OTHER_VAR)_change"

利用 config 配置

上面的两种配置方式更适合运维和 k8s 工程师在配置集群的时候进行硬编码的配置,对于服务开发来说,这两种配置方式不太合适。

使用指令 kubectl 创建 ConfigMap

$ kubectl create configmap set-config --from-literal=keyname=config-key-value --from-literal=one=two

$ kubectl describe configmap set-config
Name: set-config
Namespace: default
Labels: <none>
Annotations: <none> Data
====
keyname:
----
config-key-value
one:
----
two
Events: <none>

configmap可以混合使用不同的自选选项:完整文件夹、单独文件、自定义键名条目下的文件以及字面量等等。

$ kubectl create configmap my-config
--from-file=foo.json ## 单独文件
--from-file=var=foobar.conf ## 自定义键名条目下的文件
--from-file=config-opts/ ## 完整的文件夹
--from-literral=some=thing ## 字面量

在实际应用中,我们一般这样子使用 configmap,利用 configmap 配置不同环境下的配置文件,然后利用 volume 来挂载到 pod 容器文件夹内。

例如,先声明两个configmap,一个代表正式环境,一个代表测试环境

$ vim config-learn-test.xml
<conf>
<env>test</env>
<service>
<servicename></servicname>
<host></host>
<port></port>
</service>
<conf> $ vim config-learn-prod.xml
<conf>
<env>prod</env>
<service>
<servicename></servicname>
<host></host>
<port></port>
</service>
<conf>

生成 configmap

$ kubectl create configmap config-learn-prod --from-file=config-learn.xml=/path/configmap-learn/config-learn-prod.xml
$ kubectl create configmap config-learn-test --from-file=config-learn.xml=/path/configmap-learn/config-learn-test.xml

注意这里两个都使用的配置名称为 config-learn.xml,这样方便统一配置名

创建 pod,并且声明需要的配置,如果环境是测试则选择 config-learn-test,如果环境为正式则选择 config-learn-prod

$ vim ./configmap-learn.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-learn
spec:
containers:
- image: luksa/kubia
name: kubia
ports:
- containerPort: 8080
protocol: TCP
volumeMounts:
- name: configname
mountPath: /data/service/conf
readOnly: true
volumes:
- name: configname
configMap:
name: config-learn-test

在生成的 pod 中去检验对应目录下的配置文件如下:

$ kubectl exec configmap-learn cat /data/service/conf/config-learn.xml
<conf>
<env>test</env>
<service>
<servicename></servicname>
<host></host>
<port></port>
</service>
<conf>

可以看到确实是采取的测试环境配置,而且如果此目录下有相同名字的配置文件,此文件会被覆盖。

编辑修改configmap

$ kubectl edit configmap config-learn-prod

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
config-learn.xml: |
<conf>
<env>prod</env>
<service>
<servicename></servicname>
<host></host>
<port></port>
</service>
<conf>
kind: ConfigMap
metadata:
creationTimestamp: "2022-09-11T10:59:28Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:config-learn.xml: {}
manager: kubectl
operation: Update
time: "2022-09-11T10:59:28Z"
name: config-learn-prod
namespace: default
resourceVersion: "23045374"
selfLink: /api/v1/namespaces/default/configmaps/config-learn-prod
uid: 79663144-2b5e-4e29-8c94-0469d5906e19

保存文件后关闭编辑器,configmap 会在不久后更新对应的文件,文件更新过程需要一些时间,最后会看到配置文件的变化。但是一般容器进程并不会监控文件的变化在载入之后,所以一般都是重启容器并载入配置的。

玩转Configmap配置应用的各种姿势的更多相关文章

  1. IdentityServer4 4.x版本 配置Scope的正确姿势

    前言 IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证的框架 IdentityServer4官方文档:ht ...

  2. visual studio 2013 中配置OpenCV2.4.13 姿势

    首先在path中添加 “C:\OpenCV\opencv\build\x64\vc12\bin”   (地址随实际变化) 注:添加的都是*86不使用*64 在visualstudio 2013中配置 ...

  3. 使用ConfigMap配置您的应用程序

    转载自:https://kuboard.cn/learning/k8s-intermediate/config/config-map.html ConfigMap 作为 Kubernetes API ...

  4. Android玩转百度地图Sha1获取正确姿势?

    场景一 由于近期项目钟要用到定位功能因此肯定须要用到地图以及地位功能,相信大家也知道眼下国内比較出名的地图像百度.高德.腾讯等这些还是用到比較多的.于是思考了一下决定还是用百度,相信老司机们都知道的哈 ...

  5. [置顶] Android玩转百度地图Sha1获取正确姿势?

    场景一 由于最近项目钟要用到定位功能因此肯定需要用到地图以及地位功能,相信大家也知道目前国内比较出名的地图像百度.高德.腾讯等这些还是用到比较多的,于是思考了一下决定还是用百度,相信老司机们都知道的哈 ...

  6. k8s之configmap配置中心

    记录在石墨笔记中,懒得再粘贴了,大家直接移步下面地址 https://shimo.im/docs/ktNM72QPweEEkcWg/

  7. SpringBoot基础系列之自定义配置源使用姿势实例演示

    [SpringBoot基础系列]自定义配置源的使用姿势介绍 前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如 ...

  8. kubernetes 的configMap和sercet配置信息

    简介: 启动pod,pod启动时可以将configMap资源关联到当前pod上来,从中读一个数据c传递给pod内的容器的一个变量.任然是变量注入的方式来给容器传配置信息. 把每一个configMap当 ...

  9. K8S(10)配置中心实战-configmap资源

    k8s配置中心实战-configmap资源 目录 k8s配置中心实战-configmap资源 0 configmap前置说明 0.1.1 configmap和secret 0.1.2 怎么使用conf ...

随机推荐

  1. 【cartographer_ros】五: 发布和订阅陀螺仪Imu信息

    上一节介绍了里程计Odometry传感数据的订阅和发布. 本节会介绍陀螺仪Imu数据的发布和订阅.陀螺仪在cartographer中主要用于前端位置预估和后端优化. 目录 1:sensor_msgs/ ...

  2. Ubuntu 隐藏所有窗口快捷键不生效问题

    在绑定界面卡住时,切换到一个tty窗口,再切回来 gsettings reset-recursively org.gnome.settings-daemon.plugins.media-keys gs ...

  3. Re:用webpack从零开始的vue-cli搭建'生活'

    有了vue-cli的帮助,我们创建vue的项目非常的方便,使用vue create然后选择些需要的配置项就能自动帮我们创建配置好的webpack项目脚手架了,实在是'居家旅行'必备良药.这次借着学习w ...

  4. Redis配置与优化

    一.缓存概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级.二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据, ...

  5. C#程序设计的6大原则

    设计模式:面向对象语言开发过程中,遇到各种场景和问题,解决方案和思路沉淀下来,就是设计模式.俗称,套路 设计模式的六大原则:理解为面向对象语言开发过程中推荐的一些指导性的原则,通俗的说是套路的 套路 ...

  6. Scanner练习

    练习1 键盘输入两个数字求和 public static void main(String[] args) { Scanner in = new Scanner(System.in); System. ...

  7. YII页面缓存

    IndexController.php namespace frontend\controllers; use yii; use yii\web\Controller; class IndexCont ...

  8. centos安装torch==1.4.0与相关细节

    对于某些直接安装torch==1.4.0报错的情况(没错,就是我遇到了) 在网上查找了,大概的解决方法是先安装一个低版本的torch和torchvision, torchvision是pytorch中 ...

  9. Python3的单元测试模块Mock与性能测试模块CProfile

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_92 我们知道写完了代码需要自己跑一跑进行测试,一个写好的程序如果连测试都没有就上到生产环境是不敢想象的,这么做的人不是太自信就是太 ...

  10. 一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_185 2021年,君不言容器技术则已,欲言容器则必称Docker,毫无疑问,它是当今最流行的容器技术之一,但是当我们面对海量的镜像 ...