在 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. Mybatis-Plus介绍

    Mybatis-Plus介绍 Mybatis-Plus概念 Mybatis-Plus介绍 官网https://mybatis-plus/或https://mp.baomidou.com/ mybati ...

  2. Python: 列表、数组及迭代器切片的区别及联系

    1. 对列表和数组进行切片 1.1 切片索引 众所周知,Python中的列表和numpy数组都支持用begin: end语法来表示[begin, end)区间的的切片索引: import numpy ...

  3. 可落地的DDD(7)-战术设计上的一些误区

    背景 几年前我总结过DDD战术设计的一些落地经验可落地的DDD(5)-战术设计,和一次关于聚合根的激烈讨论最近两年有些新的落地体验,回过头来发现,当初对这些概念的理解还是没有深入,这篇文章重新阐述下. ...

  4. Java开发学习(十三)----基于注解开发定义第三方bean及注解开发总结

    在前面的博客中定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,这个时候该怎么办? 遇到上述问题,我们就需要有一种更加 ...

  5. Unity3D学习笔记9——加载纹理

    目录 1. 概述 2. 详论 2.1. Resources方式 2.2. API方式 2.3. Web方式 1. 概述 理论上,Unity中加载纹理并没有什么难度,只需要将图片放置在Assets文件夹 ...

  6. 2022徐特立科学营&BIT机器人队电控课程讲义

    目录 \(\cdot\)电控简介 \(\cdot\)认识单片机   什么是单片机   时钟-单片机的脉搏 \(\cdot\)外设及应用   GPIO   PWM   定时器   UART \(\cdo ...

  7. CodeForce——Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)前三道题目题解

    目录 A: B: C: 题目链接 A Divide and Multiply standard input/output 1 s, 256 MB 正在上传-重新上传取消 x13036 B Willia ...

  8. 新建 Microsoft Office Word 文档 来源:牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28886/1015 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  9. 物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_221 一般情况下,大家对Python原生的并发/并行工作方式:进程.线程和协程的关系与区别都能讲清楚.甚至具体的对象名称.内置方法 ...

  10. ERROR: null value in column "name" of relation "res_company" violates not-null constraint

    1 # 创建res.company公司信息的时候,发现它执行了两次create()方法,并且第二次调用create,传了一个[{}]做为参数 2 # 原因是,你创建res.company的时候并没有指 ...