Docker 与 K8S学习笔记(十九)—— Pod的配置管理

x33g5p2x  于2022-02-12 转载在 Docker  
字(2.3k)|赞(0)|评价(0)|浏览(304)

我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能。将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是在面临大规模容器集群的场景下就显得力不从心了,因此我们可以使用ConfigMap进行统一配置。

一、ConfigMap介绍

ConfigMap是Kubernetes中的一种资源对象,用于将应用配置信息存储到键值对中,Pod在使用时,将其用作环境变量、命令行参数或者存储卷中的配置文件。通过ConfigMap可以实现应用配置与容器解耦,极大方便应用配置的维护。我们通过Yaml定义一个ConfigMap并通过kubectl create创建:

$ cat cm-appvars.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appvars
data:
  var1: a
  var2: b
  var3: c
$ sudo kubectl create -f cm-appvars.yaml
configmap/cm-appvars created
$ sudokubectl get configmap
NAME               DATA   AGE
cm-appvars         313s
kube-root-ca.crt   128d
$ sudo kubectl describe configmap cm-appvars
Name:         cm-appvars
Namespace:    default
Labels:       <none>Annotations:  <none>Data
====var1:
----a
var2:
----b
var3:
----c
Events:  <none>

二、在Pod中使用ConfigMap

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

我们通过Busybox进行实验,Pod定义如下:

apiVersion: v1
kind: Pod
metadata:
  name: busybox-pod
spec:
  containers:
  -name: busybox
    image: busybox
    command: ["/bin/sh", "-c", "env | grep VAR"]
    env:
    -name: VAR_A
      valueFrom:
        configMapKeyRef:
          name: cm-appvars
          key: var1
    -name: VAR_B
      valueFrom:
        configMapKeyRef:
          name: cm-appvars
          key: var2
  restartPolicy: Never

我们busybox-pod在定义时通过valueFrom.configMapKeyRef为要注入的环境变量赋值,pod启动后通过env命令打印环境变量并退出。(这里设置restartPolicy: Never避免Pod执行完命令退出后再次重启)

我们创建Pod并通过kubectl logs命令进行验证:

$ sudo kubectl create -f busy_pod.yaml
pod/busybox-pod created
$ sudo kubectl logs busybox-pod
VAR_A=a
VAR_B=b

根据输出,我们可以得知容器内部的环境变量通过使用ConfigMap的值已经被正确配置。

2、通过挂载Volume使用ConfigMap

还是以busybox为例,我们在Pod定义中,将cm-appvars中的内容以文件的形式挂载到容器内部的/vars目录下。修改后的Pod定义文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: busybox-pod
spec:
  containers:
  -name: busybox
    image: busybox
    command: ["/bin/sh", "-c", "top"]
    volumeMounts:
    -name: vars
      mountPath: /vars
  volumes:
  -name: vars
    configMap:
      name: cm-appvars
      items:
      - key: var1   # key=var1
        path: var1  # value将以var1文件名方式进行挂载
      - key: var2   # key=var2
        path: var2  # value将以var2文件名方式进行挂载

接着我们创建Pod并进入容器中查看是否有对应配置信息的文件:

$ sudo kubectl create -f busy_pod.yaml
pod/busybox-pod created
$ sudo kubectl exec -it busybox-pod  /bin/shkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] --[COMMAND] instead.
/ # lsbin   dev   etc   home  proc  root  sys   tmp   usr   var   vars

/# cd vars
/vars # lsvar1  var2
/vars # catvar1
a/vars #

其实我们这里的例子很简单,在实际使用时,我们可以在ConfigMap中存储配置文件内容(如redis.conf、server.xml等),然后通过volume方式挂载到Pod中供应用加载。

三、ConfigMap的使用注意事项

在使用ConfigMap时需要注意以下几点:

1)ConfigMap必须在Pod之前创建,这样Pod才能使用它;

2)ConfigMap只能用于相同命名空间中的Pod;

3)ConfigMap无法用于静态Pod。

相关文章

微信公众号

最新文章

更多