创建

基于命令行创建

语法: 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 name
  • spec.containers.volumeMounts.name ~ 挂载的卷名, 对应vloumes.name
  • spec.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 name
  • env.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]