目录
一、ConfigMap概述
二、ConfigMap创建
2.1、命令行方式创建
2.2、yaml 文件方式创建
三、ConfigMap查询
四、ConfigMap更新
4.1、kubectl edit方式
4.2、kubectl apply方式
五、ConfigMap使用
5.1、spec.env 【环境变量】
5.2、spec.envFrom 【环境变量】
5.3、指定 items【卷挂载方式】
5.4、不指定 items【卷挂载方式】
六、ConfigMap删除
一、ConfigMap概述
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配 置信息。ConfigMap API给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON 二进制大对象 。
ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
注意:ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是加密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。
二、ConfigMap创建
2.1、命令行方式创建
读取文件方式(也可以是目录)通过--from-file参数从文件中读取,可以指定 key 的名称,若不指定,则默认使用文件名为key。--from-file:指定在目录下的所有文件都会被用在 ConfigMap 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。
vim configmap-file.properties
version:1.0
environment:dev
创建ConfigMap:
$ vim configmap-file.properties
# 通过kubectl create configmap创建ConfigMap
$ kubectl create configmap from-file-configmap --from-file=configmap-file.properties
configmap/from-file-configmap created
$ kubectl get configmap/from-file-configmap
NAME DATA AGE
from-file-configmap 1 25s
# 查看ConfigMap的yaml资源清单
$ kubectl get configmap/from-file-configmap -o yaml
apiVersion: v1
data:
configmap-file.properties: | # ConfigMap的数据,换行的话冒号后面需要加 |
version:1.0
environment:dev
kind: ConfigMap
metadata:
creationTimestamp: "2023-01-05T05:33:28Z"
name: from-file-configmap
namespace: default
resourceVersion: "3179"
uid: a9f17c3a-af94-4a9a-9145-e06f3d3bf030
当然,我们也可以通过--from-literal参数,可以指定多个,手动指定ConfigMap中的键值对。如下:
$ kubectl create configmap cm-test --from-literal=MYSQL_ROOT_USERNAME=root --from-literal=MYSQL_ROOT_PASSWORD=123456
configmap/cm-test created
$ kubectl describe cm cm-test
Name: cm-test
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
MYSQL_ROOT_PASSWORD:
----
123456
MYSQL_ROOT_USERNAME:
----
root
BinaryData
====
2.2、yaml 文件方式创建
创建资源清单:vim configmap.yaml
apiVersion: v1
data: # ConfigMap的Key 和 Value。 每一个键都映射到一个简单的值
version: "1.0" # 需要注意yaml的语法,key和value之间需要有空格
environment: "dev" # 定义一个变量,值类型为字符串,需要加引号
kind: ConfigMap
metadata:
name: from-yaml-configmap
创建ConfigMap:
$ vim configmap.yaml
$ kubectl apply -f configmap.yaml
configmap/from-yaml-configmap created
$ kubectl get cm
NAME DATA AGE
from-file-configmap 1 11m
from-yaml-configmap 2 19s
kube-root-ca.crt 1 13d
三、ConfigMap查询
# 查看 configmap 列表
$ kubectl get configmap
NAME DATA AGE
from-file-configmap 1 13m
from-yaml-configmap 2 2m2s
kube-root-ca.crt 1 13d
# 查看 configmap 详情
$ kubectl describe configmap from-file-configmap
Name: from-file-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
configmap-file.properties:
----
version:1.0
environment:dev
BinaryData
====
Events: <none>
# 查看 yaml 输出
$ kubectl get configmap from-file-configmap -o yaml
apiVersion: v1
data:
configmap-file.properties: |
version:1.0
environment:dev
kind: ConfigMap
metadata:
creationTimestamp: "2023-01-05T05:33:28Z"
name: from-file-configmap
namespace: default
resourceVersion: "3179"
uid: a9f17c3a-af94-4a9a-9145-e06f3d3bf030
四、ConfigMap更新
4.1、kubectl edit方式
$ kubectl describe configmap from-file-configmap
Name: from-file-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
configmap-file.properties:
----
version:1.0 # 更新之前的version为1.0
environment:dev
BinaryData
====
Events: <none>
# kubectl edit configmap其实是通过修改from-file-configmap这个ConfigMap对象资源清单中的值
controlplane $ kubectl edit configmap from-file-configmap
configmap/from-file-configmap edited
# 查看更新之后的ConfigMap的值
controlplane $ kubectl describe configmap from-file-configmap
Name: from-file-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
configmap-file.properties:
----
version:2.0 # 更新之后的version为2.0
environment:dev
BinaryData
====
Events: <none>
4.2、kubectl apply方式
这种方式,其实也是通过修改ConfigMap对象对应的yaml资源清单文件,然后重新执行kubectl apply -f xxx即可。
$ vim configmap.yaml
$ kubectl describe cm from-yaml-configmap
Name: from-yaml-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
environment:
----
dev # 修改之前的environment为dev
version:
----
1.0
BinaryData
====
Events: <none>
$ kubectl apply -f configmap.yaml
configmap/from-yaml-configmap configured
$ kubectl describe cm from-yaml-configmap
Name: from-yaml-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
environment:
----
prod # 修改之后的environment为prod
version:
----
1.0
BinaryData
====
Events: <none>
五、ConfigMap使用
容器应用对 ConfigMap 的使用主要是两种:
- 通过环境变量获取 ConfigMap 的内容:spec.env和spec.envFrom
- 通过卷 volume 挂载的方式将 ConfigMap 的内容挂载到容器内部的文件或目录:spec.volumes
5.1、spec.env 【环境变量】
定义Pod资源清单:vim configmap-pod-demo01.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8
command: [ "/bin/sh", "-c", "env | grep APP"]
env: # 配置环境变量
- name: APP_VERSION # 定义环境变量的名称
valueFrom:
configMapKeyRef:
name: from-yaml-configmap # 引用from-yaml-configmap这个ConfigMap,这个值来自 ConfigMap
key: version # 需要取值的键,ConfigMap中的配置key为version
- name: APP_ENVIRONMENT # 定义环境变量的名称
valueFrom:
configMapKeyRef:
name: from-yaml-configmap # 引用from-yaml-configmap这个ConfigMap
key: environment # ConfigMap中的配置key为environment
restartPolicy: Never
创建Pod,观察控制台输出:
$ kubectl apply -f configmap-pod-demo01.yaml
pod/tomcat created
$ kubectl get pod/tomcat
NAME READY STATUS RESTARTS AGE
tomcat 0/1 Completed 0 9s
$ kubectl logs tomcat
APP_ENVIRONMENT=prod
APP_VERSION=1.0
可以看到,from-yaml-configmap这个ConfigMap中的内容已经成功声明为Pod中的两个环境变量:
$APP_VERSION、$APP_ENVIRONMENT,并且值也正确。
5.2、spec.envFrom 【环境变量】
定义Pod资源清单:vim configmap-pod-demo02.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8
imagePullPolicy: IfNotPresent
command: ['/bin/sh','-c','env']
envFrom: # 配置环境变量
- configMapRef:
name: from-yaml-configmap # 根据from-yaml-configmap这个ConfigMap中所有的key和value自动生成环境变量
restartPolicy: Never
创建Pod,观察控制台输出:
$ kubectl apply -f configmap-pod-demo02.yaml
pod/tomcat created
$ kubectl get pod/tomcat
NAME READY STATUS RESTARTS AGE
tomcat 0/1 Completed 0 32s
$ kubectl logs tomcat
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
LANGUAGE=en_US:en
HOSTNAME=tomcat
LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib
TOMCAT_SHA512=e595e906d62ff16545318108478aa101103181569dc6f4549dd0cdf8744147f7e9ba8a88cab6d33237b22981acb1085de86e7b2a4f1659efdbd4804df1303561
HOME=/root
CATALINA_HOME=/usr/local/tomcat
TOMCAT_MAJOR=8
version=1.0 # 根据from-yaml-configmap这个ConfigMap资源自动生成环境变量:version
JAVA_VERSION=jdk-17.0.5+8
environment=prod # 根据from-yaml-configmap这个ConfigMap资源自动生成环境变量:environment
GPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 5C3C5F3E314C866292F359A8F3AD5C94A67F707E 765908099ACF92702C7D949BFA0C35EA8AA299F1 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/tomcat/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
LANG=en_US.UTF-8
TOMCAT_VERSION=8.5.84
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
JAVA_HOME=/opt/java/openjdk
LC_ALL=en_US.UTF-8
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/usr/local/tomcat
TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib
如上,可以看到,通过envFrom可以实现根据某个ConfigMap资源自动生成环境变量,这样在Pod中就可以使用这些环境变量了。
env 和 envFrom 的区别:
env可以自定义变量名,但需要重复性操作;
envFrom不可以自定义变量名,但是很便捷
5.3、指定 items【卷挂载方式】
定义Pod资源清单:vim configmap-pod-demo03.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8
volumeMounts:
- name: config-volume
mountPath: /conf # 挂载configmap-file.properties到Pod的/conf目录下
volumes:
- name: config-volume
configMap: # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
name: from-file-configmap # 要挂载的 ConfigMap 的名字
items: # 来自 ConfigMap 的一组键,将被创建为文件
- key: "configmap-file.properties" # 来自 ConfigMap 的一组键,将被创建为文件
path: "configmap-file.properties" # ConfigMap挂载到容器内的相对路径
restartPolicy: Never
创建Pod,然后进入Pod中/conf目录,查看configmap-file.properties文件是否挂载进去:
$ kubectl apply -f configmap-pod-demo03.yaml
pod/tomcat created
$ kubectl get pod/tomcat
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 20s
$ kubectl exec -it tomcat -c tomcat -- bash
root@tomcat:/usr/local/tomcat# cat /conf/configmap-file.properties
version:2.0
environment:dev
5.4、不指定 items【卷挂载方式】
定义Pod资源清单:vim configmap-pod-demo04.yaml文章来源:https://www.toymoban.com/news/detail-625623.html
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8
volumeMounts:
- name: configmap-volume
mountPath: /conf
volumes:
- name: configmap-volume
configMap: # 创建一个ConfigMap类型的数据卷
name: from-yaml-configmap # 引用的ConfigMap的名称
restartPolicy: Never
创建Pod,然后进入容器查看相关内容:文章来源地址https://www.toymoban.com/news/detail-625623.html
$ kubectl apply -f configmap-pod-demo04.yaml
pod/tomcat created
$ kubectl get pod/tomcat
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 10s
$ kubectl exec -it tomcat -c tomcat -- bash
root@tomcat:/usr/local/tomcat# ls -l /conf
total 0
lrwxrwxrwx 1 root root 18 Jan 5 07:01 environment -> ..data/environment
lrwxrwxrwx 1 root root 14 Jan 5 07:01 version -> ..data/version
六、ConfigMap删除
# 方式一:通过 yaml 文件删除
kubectl delete -f configmap.yaml
# 方式二:直接删除资源
kubectl delete configmap from-yaml-configmap
# 方式三: 删除所有configmap
kubectl delete configmap --all
到了这里,关于8、Kubernetes核心技术 - ConfigMap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!