给容器内应用程序传递参数的实现方式:
  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类型.

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐