Kubernetes 实战——配置应用(ConfigMap、Secret)
配置容器化应用的方式:①命令行参数;②环境变量;③文件化配置
一、向容器传递命令行参数或环境变量
这两种方式在 Pod 创建后不可被修改
1. 在Docker中定义命令与参数
- ENTRYPOINT:容器启动时被调用的可执行程序
- CMD:传递给 ENTRYPOINT 的默认参数。可被覆盖
docker run <image> <arguments>
上面两条指令均支持以下两种形式
- shell:
ENTRYPOINT node app.js(/bin/sh -c node app.js) - exec:
ENTRYPOINT ["node", "app.js"](node app.js)
e.g.
FROM ubuntu:latest
ADD test.sh /bin/test.sh # test.sh每“$1”秒输出一行文本
ENTRYPOINT ["/bin/test.sh"]
CMD ["10"]
docker build -t lb/test:args .
docker push lb/test:args
docker run -it lb/test:args
docker run -it lb/test:args 15 # 传递参数
2. 向容器传递命令行参数
镜像的 ENTRYPOINT 和 CMD 均可被覆盖
kind: Pod
spec:
containers:
- image: some/image
command: ["/bin/command"] # 对应ENTRYPOINT,一般情况不覆盖
args: ["arg1", "arg2"] # 对应CMD
另一种参数表示方式
args:
- foo # 字符串无需引号标记
- "15" # 数值需要
3. 为容器设置环境变量
K8s 可为 Pod 中的每个容器指定环境变量
kind: Pod
spec:
containers:
- image: some/image
env: # 指定环境变量
- name: FOO
value: "foo"
- name: BAR
value: "$(INTERVAL)bar" # 引入其他环境变量(command和args属性值也可以借此引用环境变量)
在每个容器中,K8s 会自动暴露相同命名空间下每个 service 对应的环境变量
二、ConfigMap
1. 介绍
- 本质为键值对映射,值可以为字面量或配置文件
- 应用无需读取 ConfigMap,映射的内容通过环境变量或卷文件的形式传递给容器
- Pod 通过名称引用 ConfigMap

2. 创建 ConfigMap
apiVersion: v1
kind: ConfigMap
data:
sleep-interval: "25" # 配置条目
metadata:
name: my-config
直接创建
# 可指定字面量或配置文件
kubectl create configmap my-config \
--from-file=foo.json \ # 单独的文件
--from-file=bar=foobar.conf \ # 自定义键名目录下的文件
--from-file=config-opts/ \ # 完整文件夹
--from-literal=some=thing # 字面量

ConfigMap 键名需仅包含数字、字母、破折号、下划线、圆点,可首位圆点。键名不合法则不会映射
3. 传递 ConfigMap 作为环境变量
kind: Pod
spec:
containers:
- image: some/image
env:
- name: INTERVAL
valueFrom: # 使用ConfigMap中的key初始化
configMapKeyRef:
name: my-config
key: sleep-interval
启动 Pod 时若无 ConfigMap:Pod 正常调度,容器启动失败。后续创建 ConfigMap,失败容器会重启。可设置
configMapKeyRef.optional=true,这样即使 ConfigMap 不存在,容器也能启动
一次性传递所有
spec:
containers:
- image: some/image
envFrom: # 传递所有
- prefix: CONFIG_ # 为所有环境变量设置前缀(可选)
configMapKeyRef:
name: my-config
若不是合法的环境变量名称,K8s 不会自动转换键名(如 CONFIG_FOO-BAR)
4. 传递 ConfigMap 作为命令行参数
使用 ConfigMap 初始化某个环境变量,然后在参数字段中引用该环境变量
apiVersion: v1
kind: Pod
spec:
containers:
- image: some/image
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: my-config
key: sleep-interval
args: ["$(INTERVAL)"] # 参数中引用环境变量
5. 传递 ConfigMap 作为配置文件
ConfigMap 卷会将每个条目暴露成一个文件,运行在容器中的进程可通过读取文件内容获取相应的值
将 ConfigMap 卷挂载到某个文件夹
apiVersion: v1
kind: Pod
metadata:
name: test-configmap
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

$ kubectl exec test-configmap -c web-server ls /etc/nginx/conf.d
my-nginx-config.conf
sleep-interval
暴露指定的 ConfigMap 条目
spec:
volumes:
- name: config
configMap:
name: fortune-config
items: # 只暴露指定条目为文件
- key: my-nginx-config.conf
path: test.conf
# 此时 /etc/nginx/conf.d/ 中只有 test.conf
不隐藏文件夹中的其他文件
subPath 可用作挂载卷中的某个独立文件或文件夹,无需挂载整个卷
spec:
containers:
- image: some/image
volumeMounts:
- name: config
mountPath: /etc/someconfig.conf # 挂载到某个文件
subPath: myconfig.conf # 仅挂载条目myconfig.conf

这种文件挂载方式会有文件更新的缺陷
为 ConfigMap 卷中的文件设置权限
volumes:
- name: config
configMap:
name: fortune-config
defaultMode: "6600" # 默认644
6. 更新配置且不重启应用程序
更新 ConfigMap 后,卷中引用它的文件也会相应更新,进程发现文件改变后进行重载。K8s 也支持文件更新后手动通知容器
kubectl edit configmap fortune-config
kubectl exec test-configmap -c web-server cat /etc/nginx/conf.d/my-nginx-config.conf
kubectl exec test-configmap -c web-server -- nginx -s reload
- 所有文件会被一次性更新:ConfigMap 更新后,K8s 会创建一个文件夹写入所有文件,最终将符号链接转为该文件夹
- 如果挂载的是容器中的单个文件而不是完整的卷,ConfigMap 更新后对应的文件不会被更新
三、Secret
与 ConfigMap 类似。区别:①K8s 仅将 Secret 分发到需要访问 Secret 的 Pod 所在的机器节点;②只存在于节点的内存中;③etcd 以加密形式存储 Secret
1. 默认令牌 Secret
默认被挂载到所有容器(可通过设置 Pod 定义中或 Pod 使用的服务账户中的automountServiceAccountToken=false来关闭该默认行为)
$ kubectl get secrets
NAME TYPE DATA AGE
default-token-zns7b kubernetes.io/service-account-token 3 2d
$ kubectl describe secrets
...
Data # 包含从 Pod 内部安全访问 K8s API 服务器所需的全部信息
====
ca.crt: 570 bytes
namespace: 7 bytes
token: eyJhbGciO...
$ kubectl describe pod
...
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-zns7b
$ kubectl exec mypod ls /var/run/secrets/kubernetes.io/serviceaccount/
ca.crt
namespace
token
2. 创建 Secret
$ kubectl create secret generic fortune-https --from-file=https.key --from-file=https.cert --from-file=foo
$ kubectl get secret fortune-https -o yaml
apiVersion: v1
kind: Secret
data:
foo: YmFyCg==
https.cert: HtD4SF...
https.key: PJgF0G...
Secret 条目的内容会被 Base64 编码:Secret 条目可涵盖二进制数据,Base64 编码可将二进制数据转为纯文本(但 Secret 大小限于 1MB)
向 Secret 添加纯文本条目
stringData: # 该字段只写,查看时不会显示,而是被编码后展示在data字段下
foo: bar
3. 使用 Secret
将 Secret 卷暴露给容器后,条目的值会被自动解码并以真实形式写入对应文件或环境变量
apiVersion: v1
kind: Pod
metadata:
name: test-secret
spec:
containers:
- image: luksa/fortune:env
name: html-generator
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: fortune-config
key: sleep-interval
volumeMounts:
- name: html
mountPath: /var/htdocs
- image: nginx:alpine
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
- name: certs
mountPath: /etc/nginx/certs/
readOnly: true
ports:
- containerPort: 80
- containerPort: 443
volumes:
- name: html
emptyDir: {}
- name: config
configMap:
name: fortune-config
items:
- key: my-nginx-config.conf
path: https.conf
- name: certs
secret:
secretName: fortune-https
Secret 也支持通过 defaultModes 指定卷中文件的默认权限

# Secret 卷采用内存文件系统列出容器的挂载点,不会写入磁盘
$ kubectl exec test-secret -c web-server -- mount | grep certs
tmpfs on /etc/nginx/certs type tmpfs (ro,relatime)
暴露 Secret 为环境变量
不推荐,该方式可能无意中暴露 Secret 信息
env:
- name: FOO_SECRET
valueFrom:
secretKeyRef:
name: fortune-https
key: foo
4. 镜像拉取 Secret
从私有镜像仓库拉取镜像时,K8s 需拥有拉取镜像所需的证书
①创建包含 Docker 镜像仓库证书的 Secret
kubectl create secret docker-registry mydockerhubsecret \
--docker-username=myusername --docker-password=mypassword --docker-email=myemail
②Pod 中字段imagePullSecrets引用该 Secret
apiVersion: v1
kind: Pod
metadata:
name: private-pod
spec:
imagePullSecrets:
- name: mydockerhubsecret
containers:
- image: username/private:tag
name: test
后续可添加 Secret 到 ServiceAccount 使所有 Pod 都能自动添加上该 Secret
Kubernetes 实战——配置应用(ConfigMap、Secret)的更多相关文章
- k8s配置中心-configmap,Secret密码
目录 k8s配置中心-configmap,Secret 创建ConfigMap 使用ConfigMap subPath参数 Secret 官方文档 编写secret清单 使用secret 在 Pod ...
- kubernetes实战-配置中心(一)configmap资源
在我们的环境中测试使用configmap资源,需要先对我们的环境进行一些准备,首先将dubbo服务调整为0个pod ,然后把zookeeper进行拆分: 拆分zk环境,模拟测试环境跟生产环境: 停止z ...
- kubernetes实战-配置中心(四)分环境使用apollo配置中心
要进行分环境,需要将现有实验环境进行拆分 portal服务,可以各个环境共用,但是apollo-adminservice和apollo-configservice必须要分开. 1.zk环境拆分为tes ...
- kubernetes实战-配置中心(二)交付apollo配置中心到k8s
apollo官网:官方地址 apollo架构图: apollo需要使用数据库,这里使用mysql,注意版本需要在5.6以上: 本次环境mysql部署在10.4.7.11上,使用mariadb:10.1 ...
- kubernetes实战-配置中心(三)配置服务使用apollo配置中心
使用配置中心,需要开发对代码进行调整,将一些配置,通过变量的形式配置到apollo中,服务通过配置中心来获取具体的配置 在配置中心修改新增如下配置: 项目信息: 配置: 重新打包镜像,使用apollo ...
- kubernetes 实战5_命令_Assign Pods to Nodes&Configure a Pod to Use a ConfigMap
Assign Pods to Nodes how to assign a Kubernetes Pod to a particular node in a Kubernetes cluster. Ad ...
- 新书推荐《再也不踩坑的Kubernetes实战指南》
<再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...
- kubernetes实战(二十六):kubeadm 安装 高可用 k8s v1.16.x dashboard 2.x
1.基本配置 基本配置.内核升级.基本服务安装参考https://www.cnblogs.com/dukuan/p/10278637.html,或者参考<再也不踩坑的Kubernetes实战指南 ...
- kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x
1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...
随机推荐
- Win64 驱动内核编程-14.回调监控文件
回调监控文件 使用 ObRegisterCallbacks 实现保护进程,其实稍微 PATCH 下内核,这个函数还能实现文件操作监视.但可惜只能在 WIN7X64 上用.因为在 WIN7X64 上 P ...
- Day002 Hello,World!!!
Hello,World! 随便新建一个文件,存放代码 新建一个java文件 文件后缀名为.java Hello.java [注意点] 系统可能没有显示文件后缀名,我们需要手动打开 编写代码 publi ...
- TortoiseGit:拉代码密码错误remote: Coding 提示: Authentication failed! 认证失败,请确认您输入了正确的账号密码
问题 在控制面板里找到凭据管理器 修改密码之后拉取密码
- Android学习之TTS踩坑笔记
•前言 最近在做一款英文词典的 APP,做到语音模块的时候,我裂开,从网上搜索了各种博客,各种瞎捣鼓,模拟器就是不发音: 辗转反侧数日,终于让我找到解决之法,接下来就本次测试列出一些需要(必须)解决的 ...
- springboot开发浅谈 2021/05/11
学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...
- Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路
前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...
- LightningChart JS 3.0 新功能上线
在这次的LC JS更新中,首次将极坐标图引入图表库. 这种全新的图表类型可以通过API轻松地进行样式设置.极坐标可以用作独立图表或在仪表板中使用. 另外,用于 XY图表的对数轴也添加到了这次的更新,L ...
- Java中对象池的本质是什么?(实战分析版)
简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...
- 服务治理演进剖析 & Service Mesh、 xDS核心原理梳理
基于XDS协议实现控制面板与数据面板通信分享 基于这段时间在同程艺龙基础架构部的蹲坑,聊一聊微服务治理的核心难点.历史演进.最新动态, 以上内容属自我思考,不代表同程艺龙技术水准.如理解有偏差.理解不 ...
- KMP算法以及优化(代码分析以及求解next数组和nextval数组)
KMP算法以及优化(代码分析以及求解next数组和nextval数组) 来了,数据结构及算法的内容来了,这才是我们的专攻,前面写的都是开胃小菜,本篇文章,侧重考研408方向,所以保证了你只要看懂了,题 ...