8-1 configmap
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