configmap
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMaP将环境配置信息和容器镜像解耦,便于应用配置的修改。比如:使用ConfigMap来将你的配置数据和应用程序代码分开
ConfigMap 对象 :
ConfigMap是一个API对象,让你可以存储其他对象所需要使用的配置。和其他Kubernetes对象都有一个spec不同的是,ConfigMap使用data和binaryData 字段。这些字段能够接收键-值对作为其取值。data和 binaryData字段都是可选的。data字段设计用来保存 UTF-8 字节序列,而binaryData则被设计用来保存二进制数据作为base64编码的字串。
ConfigMap的名字必须是一个合法的DNS子域名。
data或binaryData字段下面的每个键的名称都必须由字母数字字符或者 -、_ 或.组成。在data下保存的键名不可以与在binaryData下出现的键名有重叠
给容器内应用程序传递参数的实现方式:
1. 将配置文件直接打包到镜像中,但这种方式不推荐使用,因为修改配置不够灵活。
2. 通过定义Pod清单时,指定自定义命令行参数,即设定 args:["命令参数"],这种也
可在启动Pod时,传参来修改Pod的应用程序的配置文件.
3. 使用环境变量来给Pod中应用传参修改配置
,但要使用此种方式,必须符合以下前提之一:
1) Pod中的应用程序必须是Cloud Native的应用程序,即支持直接通过环境变量来加载配置信息。
2) 通过定义Entrypoint脚本的预处理变量来修改Pod中应用程序的配置文件,这些Entrypoint脚本
可以使用set,sed,grep等工具来实现修改,但也要确保容器中有这些工具。
4.存储卷: 我们可将配置信息直接放到存储卷中,如PV中,Pod启动时,自动挂载存储卷到配置文件目录,
来实现给Pod中应用提供不同的配置。
5. configMap 或 secret
可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:
1 在容器命令和参数内
2 容器的环境变量
3 在只读卷里面添加一个文件,让应用来读取
4 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
让Pod引用configMap中的环境变量的方式:
kubectl explain pods.spec.containers.env #env也可直接定义传递给Pod中容器的环境变量,这点需要记住。
env.valueFrom
configMapKeyRef: 可用于定义Pod启动时引用的configMapKey是哪个。
fieldRef: 也可引用一个字段,为Pod中容器内应用程序的每个环境变量值,如:
metadata.name: 引用Pod的名称
metadata.namespace: 引用Pod所在的名称空间名
metadata.labels: 引用Pod的标签
status.hostIP: 引用Pod所在节点的IP
status.podIP: 引用Pod的IP
resourceFieldRef: 引用一个资源需求 或 资源限制
secretKeyRef: 引用一个secretKey来为Pod传参
1、在命令行直接创建configmap
# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.test.com
# kubectl get configmap
# kubectl describe cm nginx-config
Name: nginx-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
nginx_port:
----
80
server_name:
----
www.test.com
BinaryData
====
Events: <none>
2、通过指定的文件创建configmap
cat www.conf
server {
server_name www.test.com;
listen 80;
root /data/nginx/test/
}
# kubectl create configmap nginx-www --from-file=./www.conf
可以看到指定文件创建时configmap会创建一个key/value对,key是文件名,value是文件内容
假如不想configmap中的key为默认的文件名,还可以在创建时指定key名字:
# 这个是定义了一个key叫www, 其值为www.conf的内容
kubectl create configmap nginx-www --from-file=www=./www.conf
# kubectl get cm nginx-www -oyaml
apiVersion: v1
data:
www.conf: |
server {
server_name www.test.com;
listen 80;
root /data/nginx/test/
}
kind: ConfigMap
metadata:
creationTimestamp: "2021-10-25T08:30:12Z"
name: nginx-www
namespace: default
resourceVersion: "1142435"
selfLink: /api/v1/namespaces/default/configmaps/nginx-www
uid: 86162191-96e4-486f-8298-943b9d0c3f40
3、通过yaml文件创建configmap
# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo
data:
# 类属性键;每一个键都映射到一个简单的值
player_initial_lives: "3"
ui_properties_file_name: 'user-interface.properties'
# 类文件键
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
4、给Pod中的容器传递configMap定义的变量的示例:
(1)使用valueFrom、configMapKeyRef、name、key指定要用的key:
vim pod-configmap1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-1
namespace: default
labels:
app: myapp
tier: frontend
annotations:
test.com/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: NGINX_SERVER_PORT
valueFrom:
configMapKeyRef:
name: nginx-config
key: nginx_port
- name:NGINX_SERVER_NAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: server_name
# kubectl apply -f pod-configmap1.yaml
(2)还可以通过envFrom、configMapRef、name使得configmap中的所有key/value对都自动变成环境变量:
通过envFrom会把ConfigMap的所有键值对都映射到Pod的环境变量中去。使用如下:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-env-env-from
spec:
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: pkslow-yaml
restartPolicy: Never
5、通过共享卷的方式来挂载configmap:
5.1通过volume的方式把ConfigMap加载进Pod
vim pod-configmap-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm-2
namespace: default
labels:
app: myapp
tier: frontend
annotations:
test.com/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/config.d/ #挂载点不存在,Pod会自动创建.
readOnly: true #不能让容器修改配置的内容。
volumes:
- name: nginxconf #定义存储卷的名字为nginxconf
configMap:
name: nginx-config #要挂载nginx-config这个configMap
# kubectl apply -f pod-configmap-2.yaml
5.2如果只想要ConfigMap的部分内容,并自定义文件名,可通过items来配置
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-volume
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
items:
- key: application.yaml
path: app.yaml
- key: application-uat.yaml
path: uat.yaml
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "sleep 1000000" ]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config
5.3通过subPath加载
通过配置subPath字段,把文件一个一个加载到Pod中去:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-subpath
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
containers:
- name: test-container
image: busybox
command: [ "/bin/sh", "-c", "sleep 1000000" ]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config/dev.yaml
subPath: application.yaml
- name: config-volume
mountPath: /data/config/uat.yaml
subPath: application-uat.yaml
restartPolicy: Never
备注:使用的configmap内容如下:
kubectl get configmaps pkslow-file -o yaml:
apiVersion: v1
data:
application-uat.yaml: |-
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
application.yaml: |-
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
kind: ConfigMap
metadata:
name: pkslow-file
namespace: default
5.4 多个configmap合并在一起:
# kubectl get configmap -o yaml
apiVersion: v1
items:
- apiVersion: v1
data:
game.properties: |+ ##### 本段最后有一行空格,+ 表示保留字符串行末尾的换行
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30
ui.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
creationTimestamp: "2020-06-07T06:57:28Z"
name: game-config
namespace: default
resourceVersion: "889177"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: 6952ac85-ded0-4c5e-89fd-b0c6f0546ecf
kind: List
metadata:
resourceVersion: ""
selfLink: ""
其它示例:
ConfigMaps 和 Pods
引用ConfigMap的Pod的spec,并根据ConfigMap中的数据在该Pod中配置容器。这个Pod和ConfigMap必须要在同一个名字空间中。
configmap示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 类属性键;每一个键都映射到一个简单的值
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# 类文件键
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
# kubectl get configmap
使用configmap的POD示例:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env:
# 定义环境变量
- name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
valueFrom:
configMapKeyRef:
name: game-demo # 这个值来自这个ConfigMap
key: player_initial_lives # 需要取值的键
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
# 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
- name: config
configMap:
# 提供你想要挂载的 ConfigMap 的名字
name: game-demo
# 来自 ConfigMap 的一组键,将被创建为文件
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
# kubectl get pods