创建
基于命令行创建
语法:
kubectl create cm <configMapName> [-n <namespace>] --from-literal=<k1>=<v1> [--form-literal=<k2>=<v2>]
# configName: cm-line
# namespace: yky
# kv1: name:Tim
# kv2: age:18
# 创建
kubectl create cm cm-line -n yky --from-literal=name=Tim --from-literal=age=18
# 查看
[root@192-168-248-75 k8s]# kubectl describe cm -n yky
Name: cm-line
Namespace: yky
Labels: <none>
Annotations: <none>
Data
====
age:
----
18
name:
----
Tim
Events: <none>
基于文件创建
语法:
kubectl create cm <configMapName> [-n <namespace>] --from-file=<file1> [--from-file=<file2>]
需要指定 configmap 的 name, 因为是一个 configmap 下包含多组 kv, k 是文件名, v 是文件内容
指定多个文件时, 文件名不能重复, 因为文件名就是 key, key 需要唯一
# configMapName: cm-file
# namespace: yky
# 文件名: name
# 文件内容: Tim
# 创建
kubectl create cm cm-file --from-file=name -n yky
# 查看
[root@192-168-248-75 k8s]# kubectl describe cm ccc -n yky
Name: cm-file
Namespace: yky
Labels: <none>
Annotations: <none>
Data
====
name:
----
Tim
Events: <none>
基于目录创建
语法:
kubectl create cm <configMapName> [-n <namespace>] --from-file=<path> [--from-file=<path>]
大体上和基于文件创建相同, 但是指定的是目录
多目录下文件名不能重复, 因为文件名就是 key, key 需要唯一
# configMapName: cm-path
# namespace: yky
# 文件名1: name
# 文件内容1: Tim
# 文件名2: age
# 文件内容2: 18
# 创建
kubectl create cm cm-path --from-file=configmap -n yky
# 查看
[root@192-168-248-75 k8s]# kubectl describe cm cm-path -n yky
Name: cm-path
Namespace: yky
Labels: <none>
Annotations: <none>
Data
====
age:
----
18
name:
----
Tim
Events: <none>
基于 k8s 的 yml 文件创建
- 文件内容
apiVersion: v1 kind: ConfigMap metadata: name: cm-yml namespace: yky data: name: Tim age: "18" nginx.conf: | server { listen 811; server_name localhost; location / { return 200; } }
- 创建
# 创建 kubectl apply -f cm.yml -n yky # 查看 [root@192-168-248-75 k8s]# kubectl describe cm cm-yml -n yky Name: cm-yml Namespace: yky Labels: <none> Annotations: <none> Data ==== age: ---- 18 name: ---- Tim nginx.conf: ---- server { listen 811; server_name localhost; location / { return 200; } } Events: <none>
查看
- 和查看 k8s 其他资源一样
kubectl describe cm <configMapName> [-n nameSpace]
kubectl get cm <configMapName> [-n nameSpace] [-o yaml|json]
使用
# 下边示例中使用的 configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-yml
namespace: yky
data:
name: Tim
age: "18"
nginx.conf: |
server {
listen 811;
server_name localhost;
location / {
return 200;
}
}
作为环境变量使用
使用所有 key
- 注意: 这里 nginx.conf 不能在 pod 内部引用, 因为 nginx.conf 作为 key 不符合变量名命名规范, 包含"."
apiVersion: v1
kind: Pod
metadata:
name: pod-app-yky
namespace: yky
labels:
type: pod-app
auth: yky
spec:
containers:
- name: xxx-image
image: registry.prodops.ucbj.service.thc/test/yky-nginx:latest
envFrom: # 关键字: envFrom.configMapRef
- configMapRef:
name: cm-yml # 这里对应 configMapName
使用部分 key
apiVersion: v1
kind: Pod
metadata:
name: pod-app-yky
namespace: yky
labels:
type: pod-app
auth: yky
spec:
containers:
- name: xxx-image
image: registry.prodops.ucbj.service.thc/test/yky-nginx:latest
env:
# 使用的第一个 key, 取出 cm-yml 中 name 的值, 赋值给 name
- name: name # pod 内部引用时的变量名
valueFrom: # 关键字 valueFrom.configMapKeyRef
configMapKeyRef:
name: cm-yml # configMapName
key: name # configMap 中的 key
# 使用的第二个 key
- name: age
valueFrom:
configMapKeyRef:
name: cm-yml # 这里可以引用另一个 configmap
key: age
作为文件使用
挂载全部 key
- 将 configmap 所有内容作为文件挂载到目录下, 目录原有文件不可查看
spec.volumes.name
~ 卷名spec.volumes.configMap.name
~ configMap namespec.containers.volumeMounts.name
~ 挂载的卷名, 对应vloumes.namespec.containers.volumeMounts.mountPath
~ 挂载目录
# 本例中将文件挂载到 pod 中 /usr/share/nginx/html 目录中
apiVersion: v1
kind: Pod
metadata:
name: pod-app-yky
namespace: yky
labels:
type: pod-app
auth: yky
spec:
containers:
- name: xxx-image
image: registry.prodops.ucbj.service.thc/test/yky-nginx:latest
volumeMounts:
- name: v
# 挂载的路径, 会覆盖目录下所有内容, 只保留 configmap 挂载的
mountPath: /usr/share/nginx/html
volumes:
# 将 configmap cm-yml 作为 volume 资源, 并命名为 v
- name: v # volume name
configMap:
name: cm-yml # configMap name
# 进入 pod 验证
root@pod-app-yky:~# ls -l /usr/share/nginx/html/
total 0
lrwxrwxrwx 1 root root 10 Aug 2 06:34 age -> ..data/age
lrwxrwxrwx 1 root root 11 Aug 2 06:34 name -> ..data/name
lrwxrwxrwx 1 root root 17 Aug 2 06:34 nginx.conf -> ..data/nginx.conf
root@pod-app-yky:~# cat /usr/share/nginx/html/age
18
root@pod-app-yky:~# cat /usr/share/nginx/html/name
Tim
root@pod-app-yky:~# cat /usr/share/nginx/html/nginx.conf
server {
listen 811;
server_name localhost;
location / {
return 200;
}
}
挂载部分 key
- 和挂载全部相同, 目录内原有文件覆盖, 无法查看
env.name
~ 在 pod 内部引用的变量名env.valueFrom.configMapKeyRef.name
~ configMap nameenv.valueFrom.configMapKeyRef.key
~ configMap key
apiVersion: v1
kind: Pod
metadata:
name: pod-app-yky
namespace: yky
labels:
type: pod-app
auth: yky
spec:
containers:
- name: xxx-image
image: registry.prodops.ucbj.service.thc/test/yky-nginx:latest
volumeMounts:
- name: v
mountPath: /usr/share/nginx/html
volumes:
- name: v
configMap:
name: cm-yml
# 以下为不同的部分
items:
- key: name
path: name
- key: nginx.conf
path: ngx.conf
# 进入 pod 验证
root@pod-app-yky:/# ls -l /usr/share/nginx/html/
total 0
lrwxrwxrwx 1 root root 11 Aug 2 06:47 name -> ..data/name
lrwxrwxrwx 1 root root 15 Aug 2 06:47 ngx.conf -> ..data/ngx.conf
root@pod-app-yky:/# cat /usr/share/nginx/html/name
Tim
root@pod-app-yky:/# cat /usr/share/nginx/html/ngx.conf
server {
listen 811;
server_name localhost;
location / {
return 200;
}
}
挂载单独文件
- 只挂载单独文件, 不会覆盖目录下其他文件
- 一般情况下, subPath, items.key, items.path 相同即可
- 根据 subPath 的值去 configMap 中去寻找 key
- items.key 和 items.path 理解为
mv items.key items.path
, 如果它俩不同, 则 configMap 的 key 为 items.path 的内容 - 如果根据 subPath 没有找到对应的 key, 则会创建 mountPath 的目录
apiVersion: v1
kind: Pod
metadata:
name: pod-app-yky
namespace: yky
labels:
type: pod-app
auth: yky
spec:
containers:
- name: xxx-image
image: registry.prodops.ucbj.service.thc/test/yky-nginx:latest
volumeMounts:
- name: v
mountPath: /usr/share/nginx/html/ngx.conf
subPath: nginx.conf
volumes:
- name: v
configMap:
name: cm-yml
# 以下也可以不写, 通过 subPath 匹配, 这就是做个记录
items:
- key: nginx.conf
path: nginx.conf
# 进入 pod 验证
root@pod-app-yky:/usr/share/nginx/html# ls -l
total 12
-rw-r--r-- 1 root root 494 Apr 13 15:13 50x.html
-rw-r--r-- 1 root root 612 Apr 13 15:13 index.html
-rw-r--r-- 1 root root 105 Aug 2 07:09 ngx.conf
删除
# 方式 1, 基于 k8s 的 yml 文件删除
kubectl delete -f cm.yml
# 方式 2, 命令行直接删除
kubectl delete cm <configMapName> [-n nameSpace]