k8s configmap的简单使用
k8s ConfigMap
背景
当我们制作docker镜像时,一般容器内的服务是需要配置文件的。制作时,有一个默认的配置文件(也可能没有)。
我们使用docker镜像时,通常会挂载一些路径,路径中则包含了服务需要的配置文件。这样就把配置文件和docker镜像解耦了
在k8s中,我们可以通过configmap的方式,达到上面的解耦目的。
介绍
k8s的configmap,简单来说,就是用来保存键值对的配置。
创建
创建configmap有以下几种方式
指定键值对方式
直接在命令行中通过--from-literal
参数,显示写出要保存的键值对
例子
创建命令
kubectl create configmap myconfigmap --from-literal=user=admin --from-literal=pass=111111
查看configmap
kubectl describe configmap myconfigmap
指定文件方式
直接在命令行中通过--from-file
指定文件,默认的key是文件名,默认value是文件的内容
例子
kubectl create configmap configmap2 --from-file=config1.txt --from-file=config2.txt
查看configmap
kubectl describe configmap configmap2
可以指定key,而不是使用默认的文件名
kubectl create configmap configmap3 --from-file=config1=config1.txt --from-file=config2=config2.txt
指定目录方式
和指定文件方式一致,只不过给定的参数--from-file
是目录
目录结构
kubectl create configmap configmap4 --from-file=config_path
查看configmap
依旧以文件名为key,文件内容为value
通过yml文件创建
可以通过在yml中写入键值对的方式创建
config3.yml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap2
namespace: default
data:
cache_host: memcached-gcxt #普通的键值对写法
cache_port: "11211" #普通的键值对写法
cache_prefix: gcxt #普通的键值对写法
my.cnf: | # 多行值写法 就是yml的格式
[mysqld]
log-bin = mysql-bin
haha = hehe
运行
kubectl apply -f config3.yml
查看configmap
kubectl describe configmap my-configmap2
使用
要想在pod中使用configmap,有以下几种方式使用
通过环境变量使用
可以在pod中,通过envFrom关键字使用configmap
这样获取的环境变量的key就是configmap的key,value就是configmap的value
例子
pod1.yml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: containers1 #容器名
image: nginx #容器所需的镜像
imagePullPolicy: IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent
command: [ "/bin/bash", "-ce", "tail -f /dev/null" ] # 运行的命令 不可使用 bash
envFrom:
- configMapRef:
name: myconfigmap
运行
kubectl apply -f pod1.yml
进入容器,查看环境变量
kubectl exec -it pod1 bash
通过command参数使用
可以直接通过$(键的名称)
的方式在command参数中使用configmap
例子
- 查看configmap有哪些
kubectl get configmap
- 查看具体要使用的configmap
kubectl describe configmap myconfigmap
可以看到有两个键值对,分别是pass=111111和user=admin
- 定义pod的yml文件
pod2.yml
# test-pod-configmap-cmd
apiVersion: v1
kind: Pod
metadata:
name: test-pod-configmap-cmd
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)"]
env:
- name: KEY1 # 设置容器中的key 可通过$(key的名称)使用
valueFrom:
configMapKeyRef:
name: myconfigmap #configmap的name
key: user # configmap中的key
- name: KEY2 # 设置容器中的key 可通过$(key的名称)使用
valueFrom:
configMapKeyRef:
name: myconfigmap #configmap的name
key: pass # configmap中的key
restartPolicy: Never
- 运行pod
kubectl apply -f pod2.yml
- 查看容器的日志
command就是输出了环境变量,因此查看日志,就能看到使用了configmap了
kubectl logs pods/test-pod-configmap-cmd
通过挂载卷的方式使用
例子
- 查看configmap
kubectl get configmap
-
查看要使用的configmap的详情
这里使用myconfigmap和configmap3实验
kubectl describe configmap myconfigmap configmap3
-
编写yml文件
pod-to-use-configmap-by-mount-file.yml
apiVersion: v1 kind: Pod metadata: name: pod-to-use-configmap-by-mount-file spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent # command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)" ] command使用默认镜像的command volumeMounts: - mountPath: /home/mount1 # 挂载的路径 name: volumes1 #这两个要对应上① 表示使用的卷的名称 - mountPath: /homt/mount2 # 挂载的路径 name: volumes2 #这两个要对应上② 表示卷的名称 restartPolicy: Never # 重启策略 volumes: - name: volumes1 #这两个要对应上① 表示使用的卷的名称 configMap: name: myconfigmap #这是configmap中的名称 - name: volumes2 #这两个要对应上② 表示卷的名称 configMap: name: configmap3 #这是configmap中的名称
-
运行pod
kubectl apply -f pod-to-use-configmap-by-mount-file.yml
-
查看pod中挂载的文件
kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- ls /home/mount1 kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- cat /home/mount1/user
kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- ls /homt/mount2 kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- cat /homt/mount2/config1
可以看到,在指定的挂载的路径,就生成了以configmap中key为文件名,value为文件内容的文件