K8s系列之:Pod的配置管理

  • 应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使得应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。
  • 将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。
  • K8s提供了一种统一的应用配置管理方案-ConfigMap。

一、ConfigMap概述

ConfigMap供容器使用的典型用法如下:

  • 生成为容器内的环境变量
  • 设置容器启动命令的启动参数(需设置为环境变量)
  • 以Volume的形式挂载为容器内部的文件或目录

ConfigMap以一个或多个key:value的形式保存在K8s系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可用于表示一个完整配置文件的内容(例如server.xml=<?xml…>)

可以通过yaml配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap。

二、创建ConfigMap资源对象

1.通过yaml配置文件方式创建

下面的例子cm-appvars.yaml描述了将几个应用所需的变量定义为ConfigMap的用法:

cm-appvars.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appvars
data:
  apploglevel: info
  appdatadir: /var/data

执行kubectl create命令创建该ConfigMap:

kubectl create -f cm-appvars.yaml
configmap "cm-appvars" created

查看创建好的Configmap

kubectl get coinfigmap
NAME             DATA             AGE
cm-appvars        2                3s
kubectl describe configmap cm-appvars
Name:             cm-appvars
Namespace:           default
Labels:             <none>
Annotations:        <none>

Data:
====
appdatadir:         9 bytes
apploglevel:        4 bytes
kubectl get configmap cm-appvars -o yaml
apiVersion: v1
data:
  appdatadir: /var/data
  apploglevel: info
kind: ConfigMap
metadata:
  creationTimestamp: 2016-07-28T19:57:16Z
  name: cm-appvars
  namespace: default
  resourceVersion: "78709"
  selfLink: /api/v1/namespaces/default/configmaps/cm-appvars
  uid: 7bb2e9c0

下面的例子cm-appconfigfiles.yaml描述了将两个配置文件server.xml和logging.properties定义为ConfigMap的用法,设置key为配置文件的别名,value则是配置文件的全部文本内容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appconfigfiles
data:
  key-serverxml:
  <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.apache.kafka.clients" level="info" />
</configuration>
  key-loggingproperties: "flume.root.logger=INFO,LOGFILE,
	flume.log.dir=./logs,
	flume.log.file=flume.log"

执行kubectl create创建该ConfigMap:

kubectl create -f cm-appconfigfiles.yaml
configmap "cm-appconfigfiles" created
kubectl get configmap cm-appconfigfiles
NAME                  DATA      AGE
cm-appconfigfiles       2         14s
kubectl describe configmap cm-appconfigfiles
Name:            cm-appconfigfiles
Namespace:           default
Labels:               <none>
Annotations:          <none>


Data:
====
key-loggingproperties: 1809 bytes
key-serverxml:    1686 byte

查看已经创建的ConfigMap的详细内容,可以看到两个配置文件的全文:

kubectl get configmap cm-appconfigfiles -o yaml

2.通过kubectl命令行方式创建

不使用yaml文件,直接通过kubectl create configmap,也可以创建ConfigMap,可以使用参数–from-file或–from-literal指定内容,并且可以在一行命令中指定多个参数。

1)通过–from-file参数从文件中进行创建,可以指定key的名称,也可以在一个命令行中创建包含多个key的ConfigMap,语法为:

kubectl create configmap NAME --from-file=[key]source --from-file=[key=]source

2)通过–from-file参数从文件中进行创建,该目录下的每个配置文件名都被设置为key,文件的内容被设置为value,语法为:

kubectl create configmap NAME --from-file=config-files-dir

3)–from-literal从文本中进行创建,直接将指定的key#=value#创建为ConfigMap的内容,语法为:

kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2

3.kubectl命令创建configmap用法举例

例一:当前目录下含有配置文件server.xml,可以创建一个包含该文件内容的ConfigMap:

kubectl create configmap cm-server.xml --from-file=server.xml

kubectl describe configmap cm-server.xml

例二:configfiles目录下包含两个配置文件server.xml和logging.properties,创建一个包含这两个文件内容的ConfigMap:

kubectl create configmap cm-appconf --from-file=configfiles

kubectl describe configmap cm-appconf

例三:使用–from-literal参数进行创建的示例如下:

kubectl create configmap cm-appenv --from-literal=loglevel=info --from-literal=appdatedir=/var/data

三、容器应用对ConfigMap使用方法

  • 通过环境变量获取ConfigMap中的内容
  • 通过Volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录

四、在Pod中使用ConfigMap

1.通过环境变量方式使用ConfigMap

以创建的ConfigMap "cm-appvars"为例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appvars
data:
  apploglevel: info
  appdatadir: /var/data

在Pod “cm-test-pod”的定义中,将ConfigMap "cm-appvars"中的内容以环境变量(APPLOGLEVEL和APPDATADDIR)设置为容器内部的环境变量,容器的启动命令将现实这两个环境变量的值(“env | grep APP”)

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
  - name: cm-test
    image: busybox
    command: ["/bin/sh","-c","env | grep APP"]
    env:
    - name: APPLOGLEVEL    #定义环境变量名称
      valueFrom:            #key为"apploglevel"
        name: cm-appvars   #定义环境变量的名称
        key: apploglevel
    - name: APPDATADIR
      valueFrom:           #key "appdatadir"对应的值
      	configMapKeyRef:
      	  name: cm-appvars      #环境变量的值取自cm-appvars中
      	  key: appdatadir       #key为"appdatadir"
	restarPolicy: Never

使用kubectl create -f命令创建该Pod,由于是测试Pod,所以该Pod在执行完启动命令后将会退出,并且不会被系统自动重启(restartPolicy=Never):

kubectl create -f cm-test-pod.yaml

使用kubectl get pods --show-all查看已经停止的Pod:

kubectl get pods --show-all
NAME             READY     STATUS        RESTARTS         AGE
cm-test-pod       0/1       Completed      0               8s

查看该Pod的日志,可以看到启动命令"env|grep APP"的执行结果如下:

kubectl logs cm-test-pod
APPDATADIR=/var/data
APPLOGLEVEL=info

说明容器内部的环境变量使用ConfigMap cm-appvars中的值进行了正确的设置。

也可以通过envFrom实现在Pod环境内将ConfigMap(也可用于Secret资源对象)中所有定义的key=value自动生成为环境变量:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
spec:
  containers:
  - name: cm-test
    image: busybox
    command: ["/bin/sh","-c","env | grep APP"]
    envFrom:
    - configMapRef   
      name: cm-appvars           #根据cm-appvars中的可以=value自动生成环境变量
  restarPolicy: Never

通过这个定义,在容器内部将会生成如下环境变量:
APPDATADIR=/var/data
APPLOGLEVEL=info

注意:环境变量的名称受POSIX命名规范([a-zA-Z_][a-zA-Z0-9_]*)约束,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个Event来描述变量无法生成,但并不阻止Pod的启动。

2.通过volumeMount使用ConfigMap

下面所示的cm-appconfigfiles.yaml例子中包含两个配置文件的定义:server.xml和logging.properties

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appconfigfiles
data:
  key-serverxml:
  <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.apache.kafka.clients" level="info" />
</configuration>
  key-loggingproperties: "flume.root.logger=INFO,LOGFILE,
	flume.log.dir=./logs,
	flume.log.file=flume.log"

在Pod "cm-test-app"的定义中,将ConfigMap “cm-appconfigfiles”中的内容以文件的形式mount到容器内部的/configfiles目录中去。

Pod配置文件cm-test-app.yaml的内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-app
spec:
  containers:
  - name: cm-test-app
    image: kubeguide/tomcat-app:v1
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml     # 引用volume名
      moutPath: /configfiles   #挂载到容器内的目录
    volumes:
    - name: serverxml          #定义volume名
      configMap:
        name: cm-appconfigfiles    #使用ConfigMap "cm-appconfigfiles"
        items:
        - key: key-serverxml         # key=key-serverxml
          path: server.xml           # value将server.xml文件名进行挂载
        - key: key-loggingproperties  #key=key-loggingproperties
          path: logging.properties    #value将logging.properties文件名进行挂载

创建该Pod:

kubectl create -f cm-test-app.yaml

登陆容器,查看到/configfiles目录下存在server.xml和logging.properties文件,两个文件的内容就是ConfigMap "cm-appconfigfiles"中两个key定义的内容。

kubectl exec -ti cm-test-app -- bash
root@cm-test-app:/# cat /configfiles/server.xml
root@cm-test-app:/# cat /configfiles/logging.properties

如果在引用ConfigMap时不能指定items,则使用volumeMount方式在容器内的目录中为每个item生成一个文件名为key的文件。

Pod配置文件cm-test-app.yaml的内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-app
spec:
  containers:
  - name: cm-test-app
    image: kubeguide/tomcat-app:v1
    imagePullPolicy: Never
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml     # 引用volume名
      moutPath: /configfiles   #挂载到容器内的目录
    volumes:
    - name: serverxml          #定义volume名
      configMap:
        name: cm-appconfigfiles    #使用ConfigMap "cm-appconfigfiles"

创建该Pod

kubectl create -f cm-test-app.yaml

登录容器,查看到/configfiles目录下存在key-loggingproperties和key-serverxml文件,文件的名称来自ConfigMap cm-appconfigfiles中定义的两个key的名称,文件的内容则为value的内容:

# ls /configfiles
key-serverxml    key-loggingproperties

五、使用ConfigMap的限制条件

使用ConfigMap的限制条件如下:

  • ConfigMap必须在Pod之前创建
  • ConfigMap受Namespace限制,只有处于相同Namespaces中的Pod可以引用它
  • ConfigMap中的配额管理还未能实现
  • kubelet只支持可以被API Server自动管理的Pod使用ConfigMap
  • kubelet在本Node上通过–manifest-url或–config自动创建的静态Pod将无法引用ConfigMap
  • 在Pod对ConfigMap进行挂载的操作时,容器内部只能挂载为目录,无法挂载为文件。在挂载到容器内部后,目录将包含ConfigMap定义的每个item。如果该目录下原来还有其他文件,则容器内的该目录将会被挂载的ConfigMap覆盖。如果应用程序需要保留原来的其他文件,则需要进行额外的处理。可以将ConfigMap挂载到容器内部的临时目录,再通过启动脚本将配置文件复制或者链接到(cp或link命令)应用所用的实际配置目录下。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最笨的羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值