此文为学习《Kubernetes权威指南》的相关笔记
学习笔记:
为了提高容器的可复用性,在设计时优先将配置文件和实际程序分离,在容器迁移或复用时通过修改配置文件让容器快速工作,那么对于一个强调高可用、快速部署的容器集群而言,配置注入容器的方式便很关键,在K8s上主要有两个思路:通过配置容器环境变量或者通过数据卷挂载,这两种方法在前面学习中均有涉及过。
数据对象ConfigMap在我理解中并不是新建了一种配置注入方法,而是为上述两种方法提供了一种配置管理方案,简而言之,CM将配置信息打包到一个CM实例中,打包内容可以是多个键值对也可以是一组配置文件,在建立容器时使用CM实例通过上述两种方法快速注入配置,这种方案使得配置的集中、分类、分发都变得高效和容易。
另:CM使用的限制条件
创建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:
在实际应用场景中,有些配置如数据库、服务器,往往需要一整个文件的配置信息,CM也具有包含若干个配置文件的功能。
新建CM配置文件cm-appconfigfile.yaml
长度教长,教材给出的下载地址为:https://github.com/kubeguide/K8sDefinitiveGuide-V4-Sourcecode/blob/master/Chapter3/3.5.2%20cm-appconfigfiles.yaml
建立CM完成后,查看详细信息。
在书中,在通过上述方式建立的CM中,不直接给出每个key对应的内容,而是字节数,但本人学习操作后是直接给出的,怀疑是版本问题,有待查阅官方文档。
另:k8s中获得一个资源对象的详细信息作为yaml文件输出:
kubectl get
通过选择相近的资源对象输出,将简化yaml文件的编写过程
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 configEvents:
--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 configconfig2.xml:
----
this is a configEvents:
使用--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:
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
......
以文件卷挂载的方式实现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
...