k8s configmap 配置分离
ConfigMap
ConfigMap用于保存配置珊数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。一张图解释
上图就是整个ConfigMap的生命周期以及使用方式,
ConfigMap概念
ConfigMap是一种API对象,使用时,Pod可以将其作为环境变量,命令行参数,或者存储的配置文件,ConfigMap将配置和Pod解偶,更易于文件的更改和管理,ConfigMap并不提供和保密或者加密的功能,如果想存储数据是机密的,需要使用secret。
模板:
ConfigMap使用data和binaryData字段,这些字段能够接收到键值对做其取值,datahe binaData字段是可选的
- data字段设计用来保存UTF-8字符串,指定文件,目录或者键值对
- binaryData则被设计用来保存二进制数据作为base64编码的字符
由于一般命令行指定目录或者文件,所以没有yaml文件,从1.19版本开始,添加了一个immutable字段到ConfigMap定义中,创建不可变更的Config
#基于目录创建:
kubectl create configmap -n ns-cm game-config --from-file=configmap/
#查看命令:
kubectl get configmap -n ns-cm
#基于文件创建:
kubectl create configmap -n ns-cm ui-config --from-file=configmap/ui.properties
#创建环境变量:
kubectl create configmap game-config-env-file -n ns-cm --from-env-file=configmap/game-env-file.properties
环境变量:
使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称
apiVersion: v1
kind: Pod
metadata:
name: env-test-pod
spec:
containers:
- name: env-test-pod
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: game-config-env-file
restartPolicy: Never
挂载:
覆盖,
注意,这种挂载 方式,会覆盖目录,busybox的/usr下有sbin目录
apiVersion: v1
kind: Pod
metadata:
name: volume-test-pod
spec:
containers:
- name: test-container
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh","-c","cd /usr && ls && cat /usr/keys" ]
volumeMounts:
- name: config-volume
mountPath: /usr
volumes:
- name: config-volume
configMap:
name: game-config
items:
- key: game.properties
path: keys
restartPolicy: Never
subPath:
如果你想挂载的目录下有其他的目录或文件,可以使用这种方式。
apiVersion: v1
kind: Pod
metadata:
name: subpath-test-pod
spec:
containers:
- name: test-container
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh","-c","cd /usr && ls && cat /usr/keys" ]
volumeMounts:
- name: config-volume
mountPath: /usr/keys
subPath: usr/keys
volumes:
- name: config-volume
configMap:
name: game-config
items:
- key: game.properties
path: usr/keys
restartPolicy: Never
#注意:前面不要加**/**
更新:
以subPath方式挂载时,configmap更新,容器不会更新。
解决方式,一是把文件挂载到一个空目录,然后使用ln链接过去。而是如果你的k8s版本>=1.9,可以使用参考中的reloader
configMap的yaml基于文件挂载写法以及用法:
apiVersion: v1
kind: Namespace
metadata:
name: ns-cm
spec: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ns-cm
name: deploy-cm-nginx
labels:
app: cm-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx-cm-1
template:
metadata:
labels:
app: nginx-cm-1
spec:
containers:
- name: nginx
image: nginx:1.15
volumeMounts: #挂载在pod里面的字段
- name: nginx-conf #需要挂载的名称
mountPath: /etc/conf # 挂载在pod里面的路径
volumes:
- name: nginx-conf #需要挂载在pod的里面的名称
configMap: #使用什么方式挂载
name: cm-conf #你创建的ConfigMap
items: #给配置文件改名
- key: key1 #指定confMap里面的key
path: slx.conf #需要改的名称
- key: key2
path: slx1.conf
mode: 0644 #配置权限,它的优先级高于defaultMode的
defaultMode: 0666 #配置权限
restartPolicy: Always
---
#我创建的ConfigMap:
[root@k8s-master01 ns-slx-study]# kubectl -n ns-cm get cm cm-conf -o yaml
apiVersion: v1
data:
key1: hello123456 #创建的键值对
key2: k8s
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"key1":"hello","key2":"k8s"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"cm-conf","namespace":"ns-cm"}}
creationTimestamp: "2023-03-01T00:05:43Z"
name: cm-conf
namespace: ns-cm
resourceVersion: "537000"
uid: 25410b7d-e48d-472c-b0ee-1489cd94b9a4
ConfigMap 注意要点
1,ConfigMap 文件的大小。虽然说 ConfigMap 文件没有大小限制,但是在 ETCD 里面,数据的写入是有大小限制的,现在是限制在1MB 以内;
2,pod 引入 ConfigMap 的时候,必须是相同的 Namespace中的 ConfigMap,前面其实可以看到,ConfigMap.metadata 里面是有 namespace 字段的;
3,pod 引用的ConfigMap,假如这个 ConfigMap 不存在,那么这个 pod 是无法创建成功的,其实这也表示在创建 pod 前,必须先把要引用的 ConfigMap 创建好
4,使用 envFrom 的方式。把 ConfigMap 里面所有的信息导入成环境变量时,如果 ConfigMap 里有些 key 是无效的,比如 key 的名字里面带有数字,那么这个环境变量其实是不会注入容器的,它会被忽略。但是这个 pod 本身是可以创建的。这个和第三点是不一样的方式,是 ConfigMap 文件存在基础上,整体导入成环境变量的一种形式。
5,什么样的 pod 才能使用 ConfigMap?这里只有通过 K8s api 创建的 pod 才能使用 ConfigMap,比如说通过用命令行 kubectl 来创建的 pod,肯定是可以使用 ConfigMap 的,但其他方式创建的 pod,比如说 kubelet 通过 manifest 创建的 static pod,它是不能使用 ConfigMap 的。
6,热更新需要ln或者使用参考中的reloader
本篇随笔参考:(255条消息) k8s学习-ConfigMap(创建、使用、更新、删除等)-CSDN博客 ConfigMap | Kubernetes (255条消息) k8s学习-思维导图与学习笔记-CSDN博客