【Kubernetes】Pod学习(四)ConfigMap入门

此文为学习《Kubernetes权威指南》的相关笔记

学习笔记:

       为了提高容器的可复用性,在设计时优先将配置文件和实际程序分离,在容器迁移或复用时通过修改配置文件让容器快速工作,那么对于一个强调高可用、快速部署的容器集群而言,配置注入容器的方式便很关键,在K8s上主要有两个思路:通过配置容器环境变量或者通过数据卷挂载,这两种方法在前面学习中均有涉及过。

       数据对象ConfigMap在我理解中并不是新建了一种配置注入方法,而是为上述两种方法提供了一种配置管理方案,简而言之,CM将配置信息打包到一个CM实例中,打包内容可以是多个键值对也可以是一组配置文件,在建立容器时使用CM实例通过上述两种方法快速注入配置,这种方案使得配置的集中、分类、分发都变得高效和容易。

      另:CM使用的限制条件

  • 创建于使用该CM的Pod之前;(配置预定义)
  • Pod只能使用同一namespace的CM;(配置隔离)
  • CM只能被非静态Pod使用;(由于需要API Server的调控)
  • 由于Pod只能以文件夹的形式挂载卷,挂载CM中的item时将同样以文件夹的形式挂载,此时将注意原有文件被覆盖;
  • CM暂无配额管理相关功能;

1、通过yaml文件添加键值对配置

创建CM配置yaml文件

# vim cm-appvars.yaml

apiVersion: v1
kind: ConfigMap
metadata:
 name: cm-appvars
data:    #键值对列表定义
 apploglevel: info
 appdatadir: /var/data

创建CM,并查看CM列表

# kubectl create -f cm-appvars.yaml
configmap/cm-appvars created
# kubectl get cm
NAME         DATA   AGE
cm-appvars   2      6s

查看CM详细内容,可以看到在yaml文件中配置好的键值对,未来将作为配置注入容器


# kubectl describe cm cm-appvars
Name:         cm-appvars
Namespace:    default
Labels:      
Annotations: 

Data               #键值对定义
====
appdatadir:
----
/var/data
apploglevel:
----
info

Events: 

2、通过yaml文件添加配置文件进入CM

在实际应用场景中,有些配置如数据库、服务器,往往需要一整个文件的配置信息,CM也具有包含若干个配置文件的功能。

新建CM配置文件cm-appconfigfile.yaml

长度教长,教材给出的下载地址为:https://github.com/kubeguide/K8sDefinitiveGuide-V4-Sourcecode/blob/master/Chapter3/3.5.2%20cm-appconfigfiles.yaml

【Kubernetes】Pod学习(四)ConfigMap入门_第1张图片

建立CM完成后,查看详细信息。

在书中,在通过上述方式建立的CM中,不直接给出每个key对应的内容,而是字节数,但本人学习操作后是直接给出的,怀疑是版本问题,有待查阅官方文档。

【Kubernetes】Pod学习(四)ConfigMap入门_第2张图片

另:k8s中获得一个资源对象的详细信息作为yaml文件输出:

kubectl get   -o yaml  [--export  > new.yaml]

通过选择相近的资源对象输出,将简化yaml文件的编写过程

3、通过kubectl命令行方式包含配置文件

K8s支持直接以命令行的方式定义CM

建立配置文件目录并新建两个测试文件

# mkdir config && cd config
[root@MiWiFi-R4CM-srv config]# vim config1.xml
[root@MiWiFi-R4CM-srv config]# vim config2.xml

使用--from-file=[key=]source作为参数,将配置文件加入CM

[root@MiWiFi-R4CM-srv config]# kubectl create configmap cm1 --from-file=config1.xml
configmap/cm1 created
[root@MiWiFi-R4CM-srv config]# kubectl describe cm cm1
Name:         cm1
Namespace:    default
Labels:      
Annotations: 

Data     #成功包含config1.xml
====
config1.xml:
----
this is a config

Events: 

 --from-file=path 包含path下的所有配置文件

# cd ../
# kubectl create configmap cm2 --from-file=config
configmap/cm2 created
# kubectl describe cm cm2
Name:         cm2
Namespace:    default
Labels:      
Annotations: 

Data    #成功包含config目录下的两个配置文件
====
config1.xml:
----
this is a config

config2.xml:
----
this is a config

Events: 

4、通过kubectl命令行方式包含多个键值对

使用--from-literal=key=val在命令行中,直接指定本次新建CM所包含的键值对

# kubectl create configmap cm3 --from-literal=key1=val1 --from-literal=key2=val2
configmap/cm3 created
# kubectl describe cm cm3
Name:         cm3
Namespace:    default
Labels:      
Annotations: 

Data    #包含成功
====
key1:
----
val1
key2:
----
val2

Events: 


5、在Pod中通过环境变量使用ConfigMap

CM可以通过环境变量或挂载卷的形式进行配置注入,以下是环境变量方式的实例:

新建Pod配置文件cm-test-pod.yaml

该Pod将以环境变量的形式引入cm-appvars中的键值对,在运行时输出相关环境变量,随后结束

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:
      configMapKeyRef:
       name: cm-appvars
       key: apploglevel
   - name: APPDATADIR
     valueFrom:
      configMapKeyRef:
       name: cm-appvars
       key: appdatadir

 restartPolicy: Never

建立并查看该Pod

# kubectl create -f cm-test-pod.yaml
pod/cm-test-pod created

# kubectl get pods --show-all
Error: unknown flag: --show-all

# kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
default       cm-test-pod                               0/1     Completed   0          56s
kube-system   coredns-5644d7b6d9-49v79                  1/1     Running     5          5d5h
kube-system   coredns-5644d7b6d9-w7fd5                  1/1     Running     5          5d5h

书中给出的 --show-all参数已经无法使用,现通过-A参数查看所有Pod,包括非运行时Pod

通过logs命令查看该容器运行时输出,可以看到CM中的配置信息已经成功到达容器的环境变量中

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

K8s同样支持容器直接使用一个CM所有的键值对作为环境变量

apiVersion: v1
kind: Pod
metadata:
 name: cm-test-pod
spec:
 containers:
 - name: cm-test
   image: busybox
   command: ["/bin/sh","-c","env"]
   envFrom:
   - configMapRef:
      name: cm-appvars

 restartPolicy: Never

此时查看容器输出的环境变量列表:

# kubectl logs cm-test-pod

......
apploglevel=info
......
appdatadir=/var/data
......


6、在Pod中使用volumeMount使用ConfigMap

以文件卷挂载的方式实现CM的配置注入

新建Pod配置文件cm-test-app.yaml并创建Pod

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
     mountPath: /configfiles

 volumes:
 - name: serverxml  #文件卷名
   configMap:           #ConfigMap信息配置
    name: cm-appconfigfiles
    items:                  #使用内容配置
    - key: key-serverxml        #挂载文件名,即配置文件在CM中的名称
      path: server.xml             #挂载路径,即配置文件在文件卷中的路径
    - key: key-loggingproperties
      path: logging.properties

# kubectl create -f cm-test-app.yaml
pod/cm-test-app created

登陆容器,可以看到两个配置文件已经成功的被挂载到容器中

# kubectl exec -it cm-test-app -- /bin/bash
t# cat /configfiles/server.xml


 
 

root@cm-test-app:/usr/local/tomcat# cat /configfiles/logging.properties
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

...

你可能感兴趣的:(kubernetes)