目录
一、ConfigMap资源概述
在Docker中,我们一般通过绑定挂载的方式将配置文件挂载到容器里。
在Kubernetes集群中,容器可能被调度到任意节点,配置文件需要能在集群任意节点上访问、分发和更新。
ConfigMap
ConfigMap 用来在键值对数据库(etcd)中保存非加密数据。一般用来保存配置文件。
ConfigMap 可以用作环境变量、命令行参数或者存储卷。
ConfigMap 将环境配置信息与 容器镜像 解耦,便于配置的修改。
ConfigMap 在设计上不是用来保存大量数据的。
在 ConfigMap 中保存的数据不可超过 1 MiB。
超出此限制,需要考虑挂载存储卷或者访问文件存储服务。
二、查看k8s集群系统中都有哪些资源类型
[root@k8s1 k8s]# kubectl api-resources
三、ConfigMap资源管理
1.创建工作目录
[root@k8s1 k8s]# mkdir configmap
[root@k8s1 k8s]# cd configmap/
2.创建ConfigMap资源
2.1.声明式创建ConfigMap资源
编辑资源清单
[root@k8s1 configmap]# vi 01-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm01
#声明cm资源的数据
data:
#第一种写法【key:value】
oslee: "HELLO WORLD"
k8s: "1.23.17"
#第二种写法【key:| value value value...】
my.cnf: |
[mysqld]
datadir=/xinjizhiwa/data
basedir=/usr/bin/mysqld/bin/
socket=/tmp/mysql.socket
skip-name-resolve=1
port=3306
[client]
username=admin
password=1
创建ConfigMap资源
[root@k8s1 configmap]# kubectl apply -f 01-cm.yaml
查看ConfigMap资源
[root@k8s1 configmap]# kubectl get cm
NAME DATA AGE
cm01 3 13m
kube-root-ca.crt 1 14h
[root@k8s1 configmap]# kubectl get cm cm01
NAME DATA AGE
cm01 3 13m
2.2响应式创建ConfigMap资源
命令行创建ConfigMap资源
[root@k8s1 configmap]# kubectl create cm cm001 --from-literal=oslee=k8s --from-literal=k8s=kubernetes
configmap/cm001 created
指定文件方式创建cm资源
# 编辑一个文件
[root@k8s1 configmap]# cat > 1.txt <<EOF
11111111111111
222222222222
3333333333333
4444444444444
5555555555555
666666666666
EOF# 指定文件创建cm资源
[root@k8s1 configmap]# kubectl create cm cm002 --from-file=1.txt=1.txt
configmap/cm002 created
2.3查看cm资源的详细信息
[root@k8s1 configmap]# kubectl describe cm cm01
Name: cm01
Namespace: default
Labels: <none>
Annotations: <none>Data
====
k8s:
----
1.23.17
my.cnf:
----
[mysqld]
datadir=/xinjizhiwa/data
basedir=/usr/bin/mysqld/bin/
socket=/tmp/mysql.socket
skip-name-resolve=1
port=3306
[client]
username=admin
password=1oslee:
----
HELLO WORLDBinaryData
====Events: <none>
2.4删除cm资源
[root@k8s1 configmap]# kubectl delete cm cm002
configmap "cm002" deleted
[root@k8s1 configmap]# kubectl delete cm --all
四、pod引入CM资源
pod引入cm资源的方式,有两种,env变量引入和volume挂载卷引入
1.创建pod资源,env变量引入cm
apiVersion: v1
kind: Pod
metadata:
name: m1
spec:
containers:
- name: c1
image: nginx:1.20.1-alpine
env:
#引入一个变量
- name: env-cm01
#从其他位置引入变量
valueFrom:
#声明从ConfigMap中引入变量
configMapKeyRef:
#引入变量ConfigMap的名称
name: cm01
#引用ConfigMap中的哪个key?
key: oslee
#引入第二个变量
- name: env-cm02
valueFrom:
configMapKeyRef:
name: cm01
#引用ConfigMap中的哪个key?
key: my.cnf
# 创建资源
[root@k8s1 configmap]# kubectl apply -f pod-env.yaml
pod/m1 created
# 进入容器查看变量是否引入成功
[root@k8s1 configmap]# kubectl exec m1 -it -- sh
/ # envenv-cm01=HELLO WORLD
KUBERNETES_SERVICE_HOST=10.200.0.1
PWD=/
env-cm02=[mysqld]
datadir=/xinjizhiwa/data
basedir=/usr/bin/mysqld/bin/
socket=/tmp/mysql.socket
skip-name-resolve=1
port=3306
[client]
username=admin
password=1
2.创建pod资源,volume挂载卷引入cm
# 编辑pod资源清单
apiVersion: v1
kind: Pod
metadata:
name: m1
spec:
#声明pod存储卷
volumes:
- name: vol-cm
#声明挂载cm资源
configMap:
#指定cm组员名称
name: cm01
#如果不写items,则引用cm资源中全部的key:value作为文件挂载
items:
#cm资源的key是什么
- key: oslee
#key的value值挂载到容器中变成文件内容,文件名叫什么?
path: oslee.txt
- key: my.cnf
path: my.cnfcontainers:
- name: c1
image: nginx:1.20.1-alpine
volumeMounts:
- name: vol-cm
mountPath: /k8s
# 创建资源
[root@k8s1 configmap]# kubectl apply -f pod-env.yaml
pod/m1 created
# 进入pod容器查看是否挂载成功,变成文件
[root@k8s1 configmap]# kubectl exec m1 -it -- sh
/ # ls -l k8s/
total 0
lrwxrwxrwx 1 root root 13 May 1 06:18 my.cnf -> ..data/my.cnf
lrwxrwxrwx 1 root root 16 May 1 06:18 oslee.txt -> ..data/oslee.txt
3.拓展subPath
拓展:当pod挂载cm资源到容器的目录后,若容器的原目录中有文件,则会被清空,那么如何做到,及把cm资源挂载成为文件到容器的指定目录,又能保证容器原目录中的文件不清空呐?
apiVersion: v1
kind: Pod
metadata:
name: m1
spec:
#声明pod存储卷
volumes:
- name: vol-cm
#声明挂载cm资源
configMap:
#指定cm组员名称
name: cm01
#如果不写items,则引用cm资源中全部的key:value作为文件挂载
items:
#cm资源的key是什么
- key: oslee
#key的value值挂载到容器中变成文件内容,文件名叫什么?
path: oslee.txt
- key: my.cnf
path: my.cnf
containers:
- name: c1
image: nginx:1.20.1-alpine
volumeMounts:
- name: vol-cm
mountPath: /k8s
#如果subPath不指定任何值(默认),则默认容器挂载路径为空,表示清空挂载点;
#如果subPath指定名称和cm的Path相同,表示仅仅挂载这个文件,不清空挂在的目录保留原本容器路径的文件;
#也就是说volumes>>configMap>items>path只有与subPath的值相等时,才是挂载文件;否则就是挂载目录;会清空目录;
subPath: my.cnf
#resdOnly: true #只读设置;表示不允许容器内编辑或删除这个文件;