给容器内应用程序传递参数的实现方式:
1. 将配置文件直接打包到镜像中,但这种方式不推荐使用,因为修改配置不够灵活。
2. 通过定义Pod清单时,指定自定义命令行参数,即设定 args:[“命令参数”],这种也可在启动Pod时,传参来修改Pod的应用程序的配置文件.
3. 使用环境变量来给Pod中应用传参修改配置
但要使用此种方式,必须符合以下前提之一:
1) Pod中的应用程序必须是Cloud Native的应用程序,即支持直接通过环境变量来加载配置信息。
2) 通过定义Entrypoint脚本的预处理变量来修改Pod中应用程序的配置文件,这些Entrypoint脚本
可以使用set,sed,grep等工具来实现修改,但也要确保容器中有这些工具。
4.存储卷: 我们可将配置信息直接放到存储卷中,如PV中,Pod启动时,自动挂载存储卷到配置文件目录,
来实现给Pod中应用提供不同的配置。
5. configMap 或 secret
configMap的主要作用:
就是为了让镜像 和 配置文件解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,将来可直接注入到Pod中的容器使用,而注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中; configMap是KeyValve形式来保存数据的,如: name=zhangsan 或 nginx.conf=“http{server{…}}” 对于configMap的Value的长度是没有限制的,所以它可以是一整个配置文件的信息。
configMap: 它是K8s中的标准组件,它通过两种方式实现给Pod传递配置参数:
A. 将环境变量直接定义在configMap中,当Pod启动时,通过env来引用configMap中定义的环境变量。
B. 将一个完整配置文件封装到configMap中,然后通过共享卷的方式挂载到Pod中,实现给应用传参。
secret: 它时一种相对安全的configMap,因为它将configMap通过base64做了编码, 让数据不是明文直接存储在configMap中,起到了一定的保护作用,但对Base64进行反编码,对专业人士来说,没有任何难度,因此它只是相对安全。
二,configMap是标准的k8s资源清单,有两种创建方式命令行和ymal
Create a configmap based on a file, directory, or specified literal value
1,命令创建cm命令格式
kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run] [options]
例1. /data/下创建一个nginx的配置文件
kubectl create configmap my-nginx.confv1 --from-file=nginx.key=/data/nginx.conf 创建一个名my-nginx.confv1,key为nginx.key,内容为nginx.conf里面的配置文件
例2
kubectl create cm nginx.conf --from-literal=server_name=nginx --from-literal=ngxin_port=8080
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200713131322976.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzM1ODA2,size_16,color_FFFFFF,t_70
三.给Pod中的容器传递configMap定义的变量的示例
两种方法:
- A. 将环境变量直接定义在configMap中,当Pod启动时,通过env来引用configMap中定义的环境变量。
- 将一个完整配置文件封装到configMap中,然后通过共享卷的方式挂载到Pod中,实现给应用传参。
A.环境变量方式使用configMap
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
namespace: default
spec:
containers:
- name: nginx
ports:
- name: http
containerPort: 80
image: nginx
imagePullPolicy: IfNotPresent
env:
- name: NGINX_SERVER_PORT
valueFrom:
configMapKeyRef:
name: nginx-config
key: nginx_port
- name: NGINX_SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: server_name
进入容器后printenv 查看我们定义的变量有没有传递进来
kubectl edit cm nginx.conf(对内容进行修改,从8080改为80)
进去以后查看没有发生变化
可以看到值是不会改变的,它仅会在创建Pod时,加载一次configmap中的数据.
将一个完整配置文件封装到configMap中,然后通过共享卷的方式挂载到Pod中,实现给应用传参。
apiVersion: v1
kind: Pod
metadata:
name: nginx1
spec:
containers:
- name: nginx1
ports:
- name: http
containerPort: 80
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: cm
mountPath: /etc/nginx/config.d/
readOnly: true
volumes:
- name: cm
configMap:
name: nginx.conf
进入容器后可看到配置文件已被加载
测试动态更新configmap的变量值
kubectl edit cm nginx-config
#修改nginx-config的中server_port为8080 查看Pod中的变化.
不过要有点耐心,因为APIServer通告完成是需要时间的。
通常若非敏感数据,均可使用明文存储的configMap来做,若涉及到密码,私钥等数据时,一定要使用secret类型.