Kubernetes入门实验:configmap

457 阅读3分钟

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 状态。

参考:kubernetes.io/zh/docs/tas…