一. ConfigMap的概念
在生产环境中经常会遇到需要修改配置文件的情况,传统的修改方式不仅会影响到服务的正常运行,而且操作步骤也很繁琐。为了解决这个问题,k8s项目从1.2版本引入了ConfigMap功能,用于将应用的配置信息与程序的分离。这种方式不仅可以实现应用程序被的复用,而且还可以通过不同的配置实现更灵活的功能。在创建容器时,用户可以将应用程序打包为容器镜像后,通过环境变量或者外接挂载文件的方式进行配置注入。
二. 创建ConfigMap
系统中可以通过YAML配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap,下面将详细介绍这两种方式的操作流程。
1. 通过YAML配置文件方式创建
创建YAML文件cm-demo0.yaml,其中描述将应用所需的变量定义为ConfigMap的用法,key为参数名称,value为参数值
apiVersion: v1
kind: ConfigMap
metadata:
name: appvar
data:
ip: localhost
port: "33061"
创建ConfigMap
kubectl create -f appvar.yml
查看ConfigMap列表
kubectl get configmap
使用describe命令查看ConfigMap详细信息。
kubectl describe configmap appvar
以YAMl格式查看ConfigMap
kubectl describe configmap appvar
2. 通过kubectl命令行方式创建
在kubectl create configmap命令种使用参数–from-file或–from-literal指定文件、目录或者文本,也可以创建一个或者多个ConfigMap参数。
kubectl create configmap cm-demo --from-literal=ip=localhost --from-literal=port=33061
三. 使用ConfigMap
1. 通过环境变量方式使用ConfigMap
cm-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: cm-pod
spec:
restartPolicy: Never #退出之后不重启pod
containers:
- name: cm-pod
image: nginx
command: [ "/bin/sh", "-c", "echo $(DB_HOST) $(DB_PORT) 123456 " ] #打印完之后退出,pod状态位completed
env: #使用configmap中指定的key
- name: DB_HOST #从cm-demo中取ip和port的值,赋给DB_HOST和DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo
key: ip
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: cm-demo
key: port
#envFrom: #使configmap中所有的key/value自动变成环境变量
#- configMapRef:
# name: cm-demo
执行命令(由于是测试Pod,所以该Pod在执行完启动命令后将会退出,并且不会被系统自动重启(restartPolicy=Never))
kubectl apply -f cm-pod.yaml
查看结果:
查看日志:
2. 通过VolumeMount使用ConfigMap
1)cm-apache.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-apache
data:
html_content: hello world
file_path: /var/www/html
2)pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-volume
spec:
containers:
- name: apache
image: httpd
ports:
- containerPort: 80
volumeMounts: #以数据卷的形式挂载配置文件目录
- name: volume-test
mountPath: /var/www/html
volumes:
- name: volume-test
configMap:
name: cm-apache
items:
- key: html_content #ConfigMap中的key=html_content
path: main.html #ConfigMap中Key=html_content的Value写入到main.html文件中
- key: file_path #ConfigMap中的key=file_path
path: path.txt #ConfigMap中key=file_path的value写入path.txt文件中
3)执行
kubectl apply -f cm-apache.yaml
kubectl apply -f pod-volume.yaml
4)进入到容器里面
kubectl exec -it pod-volume sh