k8s configmap 实验。
注:本文为笔者实验记录,非教程。
环境
# kubectl get node
NAME STATUS ROLES AGE VERSION
edge-node Ready <none> 15m v1.17.0
edge-node2 Ready <none> 16m v1.17.0
ubuntu Ready master 67d v1.17.0
configmap
技术总结
测试要点:
- 多方式创建,命令行指定,目录,(多)文件。
- 使用,传递到pod,多个cm。
- 更新cm。
简写:kubectl create cm
命令行指定
kubectl create configmap my-cm --from-literal=who=latelee --from-literal=how.many=250
从目录创建
wget https://kubernetes.io/examples/configmap/game.properties -O game.properties
wget https://kubernetes.io/examples/configmap/ui.properties -O ui.properties
# Create the configmap
kubectl create configmap game-config --from-file=. // 注!当前目录使用"."
输出yaml格式:
kubectl get configmaps game-config -o yaml
整理后config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: game-config
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
可执行:
kubectl apply -f config.yaml
使用ConfigMapGenerator创建:
cat <<EOF > ./kustomization.yaml
configMapGenerator:
- name: game-config-4
files:
- game.properties # 这里指定文件
- ui.properties
EOF
kubectl apply -k . // ! 注意格式,不能指定kustomization.yaml文件
注:这种格式得到的创建cm带有随机数。
从json文件创建
deviceProfile.json 文件:
{"deviceInstances":[{"id":"led-light-instance-01","name":"led-light-instance-01","model":"led-light"}],"deviceModels":[{"name":"led-light","properties":[{"name":"power-status","dataType":"string","description":"Indicates whether the led light is ON/OFF","accessMode":"ReadWrite","defaultValue":"OFF"},{"name":"gpio-pin-number","dataType":"int","description":"Indicates whether the GPIO pin to which LED is connected","accessMode":"ReadOnly","defaultValue":18}]}],"protocols":[{"protocol_config":null}]}
创建:
kubectl create configmap led-config --from-file=deviceProfile.json
在deployment中使用示例:
volumeMounts:
- name: config-volume
mountPath: /opt/kubeedge/ # 挂载到容器的目录
volumes:
- name: config-volume
configMap:
name: led-config # 这是前面创建的configmap名称
此设置下,容器中存在 /opt/kubeedge/deviceProfile.json 。即挂载同名的json文件。json文件内容无须格式化。
参数传递
指定某几种变量。
pod配置文件:
cat <<EOF > busybox-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: latelee/busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
env:
- name: SPECIAL_WHO
valueFrom:
configMapKeyRef:
# The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
name: my-cm
# Specify the key associated with the value
key: who
- name: SPECIAL_NUM
valueFrom:
configMapKeyRef:
name: my-cm
key: how.many
- name: SPECIAL_HOW
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
EOF
创建:
kubectl apply -f busybox-pod.yaml
验证:
kubectl exec -it busybox env
HOSTNAME=busybox
TERM=xterm
SPECIAL_WHO=latelee
SPECIAL_NUM=250
configmap的全部变量。
cat <<EOF > configmap-multikeys.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config1
namespace: default
data:
SPECIAL_LEVEL: very
SPECIAL_TYPE: charm
special.how: very
EOF
pod配置:
cat <<EOF > pod-busybox-envFrom.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: latelee/busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
envFrom:
- configMapRef:
name: special-config1
restartPolicy: Never
EOF
创建并测试:
# kubectl apply -f configmap-multikeys.yaml
# kubectl apply -f pod-busybox-envFrom.yaml
# kubectl exec -it busybox env
special.how=very
SPECIAL_LEVEL=very
SPECIAL_TYPE=charm
挂载示例pod-busybox-volume.yaml:
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: latelee/busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
volumeMounts:
- name: config-volume
mountPath: /etc/myconfig
volumes:
- name: config-volume
configMap:
name: special-config1
nodeSelector:
ntype: hello
restartPolicy: Never
添加节点的标签
kubectl label nodes edge-node2 ntype=hello
kubectl create -f pod-busybox-volume.yaml
查询结果:
# kubectl exec -it busybox ls /etc/myconfig
SPECIAL_LEVEL SPECIAL_TYPE special.how
# kubectl exec -it busybox cat /etc/myconfig/SPECIAL_LEVEL
very
结论:将key作为文件存在,value为该文件的值。
单个值传递pod-busybox-volume1.yaml:
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: latelee/busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
volumeMounts:
- name: config-volume
mountPath: /etc/myconfig
volumes:
- name: config-volume
configMap:
name: special-config1
items:
- key: SPECIAL_LEVEL
path: keys
nodeSelector:
ntype: hello
restartPolicy: Never
查询结果:
# kubectl exec -it busybox ls /etc/myconfig
keys
# kubectl exec -it busybox cat /etc/myconfig/keys
very
结论:与上不同,此处只指定其中某一个或多个变量。
自动更新(热更新)
实时修改configmap的值:
# kubectl edit cm special-config1
进入 vim 模式,修改 SPECIAL_LEVEL 的值为 veryveryveryloooooooong。
apiVersion: v1
data:
SPECIAL_LEVEL: veryveryveryloooooooong
SPECIAL_TYPE: charm
special.how: very
稍等片刻后,查看结果:
# kubectl exec -it busybox cat /etc/myconfig/keys
veryveryveryloooooooong
因为 kubelet 检测需要一定时间,所以需要延后查看。
注意,在指定 subPath 情况下,不会自动更新。
问题及记录
如果指定的变量字段不正确,会提示:
Error: couldn't find key sspecial.how in ConfigMap default/special-config # 此处sspecial.how出错
如果pod使用到configmap,但又没有创建configmap,提示:
Error: configmap "special-config1" not found
再创建configmap时,pod会自动启动(即不需要先删除)。
注意,在 KubeEdge 中,如果configmap不存在,并不会明确提示,只会显示 Pending 状态。